[Помощь] Настраиваемые поля атрибут корзины

Статус
В этой теме нельзя размещать новые ответы.

windows8

Постоялец
Регистрация
12 Июл 2012
Сообщения
36
Реакции
50
Доброго времени суток.Требуется помощь в выводе атрибута корзины selectom, сейчас вывод работает через radio button, собственно вот Для просмотра ссылки Войди или Зарегистрируйся
Помогите пожалуйста разобраться

Сам файл customfilds.php вот
PHP:
<?php
/**
 *
 * Description
 *
 * @package    VirtueMart
 * @subpackage
 * @author Max Milbers
 * @link http://www.virtuemart.net
 * @copyright Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved by the author.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
 * VirtueMart is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * @version $Id: custom.php 3057 2011-04-19 12:59:22Z Electrocity $
 */
 
// Check to ensure this file is included in Joomla!
defined ('_JEXEC') or die('Restricted access');
 
if (!class_exists ('VmModel')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmmodel.php');
}
 
/**
 * Model for VirtueMart Customs Fields
 *
 * @package        VirtueMart
 */
class VirtueMartModelCustomfields extends VmModel {
 
/**
* constructs a VmModel
* setMainTable defines the maintable of the model
*
* @author Max Milbers
*/
//function __construct($modelName ='product') {
function __construct ($modelName = 'product') {
 
parent::__construct ('virtuemart_customfield_id');
$this->setMainTable ('product_customfields');
}
 
 
/**
* Gets a single custom by virtuemart_customfield_id
*
* @param string $type
* @param string $mime mime type of custom, use for exampel image
* @return customobject
*/
function getCustomfield () {
 
$this->data = $this->getTable ('product_customfields');
$this->data->load ($this->_id);
 
return $this;
}
 
// **************************************************
// Custom FIELDS
//
 
function getProductCustomsChilds ($childs) {
 
$data = array();
foreach ($childs as $child) {
$query = 'SELECT C.* , field.*
FROM `#__virtuemart_product_customfields` AS field
LEFT JOIN `#__virtuemart_customs` AS C ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
WHERE `virtuemart_product_id` =' . (int)$child->virtuemart_product_id;
$query .= ' and C.field_type = "C" ';
 
$this->_db->setQuery ($query);
$child->field = $this->_db->loadObject ();
$customfield = new stdClass();
$customfield->custom_value = $child->virtuemart_product_id;
$customfield->field_type = 'C';
$child->display = $this->displayProductCustomfieldFE ($child, $customfield);
if ($child->field) {
$data[] = $child;
}
}
return $data;
 
}
 
public function getCustomParentTitle ($custom_parent_id) {
 
$q = 'SELECT custom_title FROM `#__virtuemart_customs` WHERE virtuemart_custom_id =' . (int)$custom_parent_id;
$this->_db->setQuery ($q);
return $this->_db->loadResult ();
}
 
/** @return autorized Types of data **/
function getField_types () {
 
return array('S' => 'COM_VIRTUEMART_CUSTOM_STRING',
            'I' => 'COM_VIRTUEMART_CUSTOM_INT',
            'P' => 'COM_VIRTUEMART_CUSTOM_PARENT',
            'B' => 'COM_VIRTUEMART_CUSTOM_BOOL',
            'D' => 'COM_VIRTUEMART_DATE',
            'T' => 'COM_VIRTUEMART_TIME',
            'M' => 'COM_VIRTUEMART_IMAGE',
            'V' => 'COM_VIRTUEMART_CUSTOM_CART_VARIANT',
            'A' => 'COM_VIRTUEMART_CHILD_GENERIC_VARIANT',
            'X' => 'COM_VIRTUEMART_CUSTOM_EDITOR',
            'Y' => 'COM_VIRTUEMART_CUSTOM_TEXTAREA',
            'E' => 'COM_VIRTUEMART_CUSTOM_EXTENSION'
);
 
// 'U'=>'COM_VIRTUEMART_CUSTOM_CART_USER_VARIANT',
// 'C'=>'COM_VIRTUEMART_CUSTOM_PRODUCT_CHILD',
// 'G'=>'COM_VIRTUEMART_CUSTOM_PRODUCT_CHILD_GROUP',
//'R'=>'COM_VIRTUEMART_RELATED_PRODUCT',
//'Z'=>'COM_VIRTUEMART_RELATED_CATEGORY',
}
 
static function setParameterableByFieldType(&$table,$type=0){
 
if($type===0) $type = $table->field_type;
 
$varsToPush = self::getVarsToPush($type);
 
if(!empty($varsToPush)){
$table->setParameterable('custom_param',$varsToPush,TRUE);
}
 
}
 
static function bindParameterableByFieldType(&$table,$type=0){
 
if($type===0) $type = $table->field_type;
 
$varsToPush = self::getVarsToPush($type);
 
if(!empty($varsToPush)){
VmTable::bindParameterable($table,'custom_param',$varsToPush);
}
 
}
 
 
static function getVarsToPush($type){
 
$varsToPush = 0;
if($type=='A'){
$varsToPush = array(
'withParent'        => array(0, 'int'),
'parentOrderable'   => array(0, 'int')
);
}
return $varsToPush;
}
 
private $_hidden = array();
 
/**
* Use this to adjust the hidden fields of the displaycustomHandler to your form
*
* @author Max Milbers
* @param string $name for exampel view
* @param string $value for exampel custom
*/
public function addHidden ($name, $value = '') {
 
$this->_hidden[$name] = $value;
}
 
/**
* Adds the hidden fields which are needed for the form in every case
*
* @author Max Milbers
* OBSELTE ?
*/
private function addHiddenByType ($datas) {
 
$this->addHidden ('virtuemart_custom_id', $datas->virtuemart_custom_id);
$this->addHidden ('option', 'com_virtuemart');
 
}
 
/**
* Displays a possibility to select created custom
*
* @author Max Milbers
* @author Patrick Kohl
*/
public function displayCustomSelection () {
 
$customslist = $this->getCustomsList ();
if (isset($this->virtuemart_custom_id)) {
$value = $this->virtuemart_custom_id;
}
else {
$value = JRequest::getInt ('custom_parent_id', 0);
}
return VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_PARENT', 'custom_parent_id', $customslist, $value);
}
 
/**
* Retrieve a list of layouts from the default and chosen templates directory.
*
* We may use here the getCustoms function of the custom model or write something simular
*
* @author Max Milbers
* @param name of the view
* @return object List of flypage objects
*/
function getCustomsList ($publishedOnly = FALSE) {
 
$vendorId = 1;
// get custom parents
$q = 'SELECT virtuemart_custom_id as value ,custom_title as text FROM `#__virtuemart_customs` where custom_parent_id=0
AND field_type <> "R" AND field_type <> "Z" ';
if ($publishedOnly) {
$q .= 'AND `published`=1';
}
if ($ID = JRequest::getInt ('virtuemart_custom_id', 0)) {
$q .= ' and `virtuemart_custom_id`!=' . (int)$ID;
}
//if (isset($this->virtuemart_custom_id)) $q.=' and virtuemart_custom_id !='.$this->virtuemart_custom_id;
$this->_db->setQuery ($q);
//$result = $this->_db->loadAssocList();
$result = $this->_db->loadObjectList ();
 
$errMsg = $this->_db->getErrorMsg ();
$errs = $this->_db->getErrors ();
 
if (!empty($errMsg)) {
$app = JFactory::getApplication ();
$errNum = $this->_db->getErrorNum ();
$app->enqueueMessage ('SQL-Error: ' . $errNum . ' ' . $errMsg);
}
 
if ($errs) {
$app = JFactory::getApplication ();
foreach ($errs as $err) {
$app->enqueueMessage ($err);
}
}
 
return $result;
}
 
/**
* This displays a custom handler.
*
* @param string $html atttributes, Just for displaying the fullsized image
*/
public function displayCustomFields ($datas) {
 
$identify = ''; // ':'.$this->virtuemart_custom_id;
if (!class_exists ('VmHTML')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php');
}
if ($datas->field_type) {
$this->addHidden ('field_type', $datas->field_type);
}
$this->addHiddenByType ($datas);
 
//$html = '<div id="custom_title">'.$datas->custom_title.'</div>';
$html = "";
//$html = ' <table class="admintable"> ';
 
if (!class_exists ('Permissions')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php');
}
if (!Permissions::getInstance ()->check ('admin')) {
$readonly = 'readonly';
}
else {
$readonly = '';
}
// only input when not set else display
if ($datas->field_type) {
$html .= VmHTML::row ('value', 'COM_VIRTUEMART_CUSTOM_FIELD_TYPE', $datas->field_types[$datas->field_type]);
}
else {
$html .= VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_FIELD_TYPE', 'field_type', $this->getOptions ($datas->field_types), $datas->field_type, VmHTML::validate ('R'));
}
$html .= VmHTML::row ('input', 'COM_VIRTUEMART_TITLE', 'custom_title', $datas->custom_title, VmHTML::validate ('S'));
$html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_PUBLISHED', 'published', $datas->published);
$html .= VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_PARENT', 'custom_parent_id', $this->getParentList ($datas->virtuemart_custom_id), $datas->custom_parent_id, '');
$html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_CART_ATTRIBUTE', 'is_cart_attribute', $datas->is_cart_attribute);
$html .= VmHTML::row ('input', 'COM_VIRTUEMART_DESCRIPTION', 'custom_field_desc', $datas->custom_field_desc);
// change input by type
$html .= VmHTML::row ('input', 'COM_VIRTUEMART_DEFAULT', 'custom_value', $datas->custom_value);
$html .= VmHTML::row ('input', 'COM_VIRTUEMART_CUSTOM_TIP', 'custom_tip', $datas->custom_tip);
$html .= VmHTML::row ('input', 'COM_VIRTUEMART_CUSTOM_LAYOUT_POS', 'layout_pos', $datas->layout_pos);
//$html .= VmHTML::row('booleanlist','COM_VIRTUEMART_CUSTOM_PARENT','custom_parent_id',$this->getCustomsList(),  $datas->custom_parent_id,'');
$html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_ADMIN_ONLY', 'admin_only', $datas->admin_only);
$html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_LIST', 'is_list', $datas->is_list);
$html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_HIDDEN', 'is_hidden', $datas->is_hidden);
 
// $html .= '</table>';  removed
$html .= VmHTML::inputHidden ($this->_hidden);
 
return $html;
}
 
/**
* child classes can add their own options and you can get them with this function
*
* @param array $optionsarray
*/
private function getOptions ($field_types) {
 
$options = array();
foreach ($field_types as $optionName=> $langkey) {
$options[] = JHTML::_ ('select.option', $optionName, JText::_ ($langkey));
}
return $options;
}
 
/**
* Just for creating simpel rows
*
* @author Max Milbers
* @param string $descr
* @param string $name
*/
private function displayRow ($descr, $name, $readonly = '') {
 
$html = '<tr>
<td class="labelcell">' . JText::_ ($descr) . '</td>
<td> <input type="text" ' . $readonly . 'class="inputbox ' . $readonly . '" name="' . $name . '" size="70" value="' . $this->$name . '" /></td>
</tr>';
return $html;
}
 
/**
*
* Enter description here ...
*
* @param unknown_type $excludedId
* @return unknown|multitype:
*/
function getParentList ($excludedId = 0) {
 
$this->_db->setQuery (' SELECT virtuemart_custom_id as value,custom_title as text FROM `#__virtuemart_customs` WHERE `field_type` ="P" and virtuemart_custom_id!=' . $excludedId);
if ($results = $this->_db->loadObjectList ()) {
return $results;
}
else {
return array();
}
}
 
/**
*
* Enter description here ...
*/
function getProductChildCustomRelation () {
 
$this->_db->setQuery (' SELECT virtuemart_custom_id as value,custom_title as text FROM `#__virtuemart_customs` WHERE `field_type` ="C"');
if ($results = $this->_db->loadObjectList ()) {
return $results;
}
else {
return array();
}
}
 
/**
*
* Enter description here ...
*
* @param unknown_type $product_id
* @return unknown
*/
function getProductChildCustom ($product_id) {
 
$this->_db->setQuery (' SELECT `virtuemart_custom_id`,`custom_value` FROM `#__virtuemart_product_customfields` WHERE  `virtuemart_product_id` =' . (int)$product_id);
if ($childcustom = $this->_db->loadObject ()) {
return $childcustom;
}
else {
$childcustom->virtuemart_custom_id = 0;
$childcustom->custom_value = '';
return $childcustom;
}
}
 
/**
*
* Enter description here ...
*
* @param unknown_type $product_id
* @return string|Ambigous <string, mixed, multitype:>
*/
function getProductParentRelation ($product_id) {
 
$this->_db->setQuery (' SELECT `custom_value` FROM `#__virtuemart_product_customfields` WHERE  `virtuemart_product_id` =' . (int)$product_id);
if ($childcustom = $this->_db->loadResult ()) {
return '(' . $childcustom . ')';
}
else {
return JText::_ ('COM_VIRTUEMART_CUSTOM_NO_PARENT_RELATION');
}
}
 
/**
* AUthor Kohl Patrick
* Load all custom fields for a Single product
* return custom fields value and definition
*/
public function getproductCustomslist ($virtuemart_product_id, $parent_id = NULL) {
 
$query = 'SELECT C.`virtuemart_custom_id` , `custom_element`, `custom_jplugin_id`, `custom_params`, `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_cart_attribute` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`,field.`custom_param`,field.`custom_price`,field.`ordering`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . $virtuemart_product_id . ' order by field.`ordering` ASC';
$this->_db->setQuery ($query);
$productCustoms = $this->_db->loadObjectList ();
//if (!$productCustoms ) return array();
if (!$productCustoms) {
return;
}
$row = 0;
foreach ($productCustoms as $field) {
if ($parent_id) {
$field->custom_value = "";
$field->virtuemart_customfield_id = "";
$field->custom_param = NULL;
$virtuemart_product_id = $parent_id;
}
if ($field->field_type == 'E') {
 
JPluginHelper::importPlugin ('vmcustom');
$dispatcher = JDispatcher::getInstance ();
$retValue = $dispatcher->trigger ('plgVmDeclarePluginParams', array('custom', $field->custom_element, $field->custom_jplugin_id, $field));
 
}else {
VirtueMartModelCustomfields::bindParameterableByFieldType($field);
}
//vmdebug('fields',$field);
$field->display = $this->displayProductCustomfieldBE ($field, $virtuemart_product_id, $row); //custom_param without S !!!
$row++;
}
return $productCustoms;
}
 
/* Save and delete from database
* all product custom_fields and xref
@ var   $table: the xref table(eg. product,category ...)
@array $data: array of customfields
@int     $id: The concerned id (eg. product_id)
*/
public function storeProductCustomfields($table,$datas, $id) {
 
//vmdebug('storeProductCustomfields',$datas);
JRequest::checkToken() or jexit( 'Invalid Token, in store customfields');
//Sanitize id
$id = (int)$id;
 
//Table whitelist
$tableWhiteList = array('product','category','manufacturer');
if(!in_array($table,$tableWhiteList)) return false;
 
 
// Get old IDS
$this->_db->setQuery( 'SELECT `virtuemart_customfield_id` FROM `#__virtuemart_'.$table.'_customfields` as `PC` WHERE `PC`.virtuemart_'.$table.'_id ='.$id );
$old_customfield_ids = $this->_db->loadResultArray();
 
 
if (isset ( $datas['custom_param'] )) $params = true ;
else $params = false ;
if (array_key_exists('field', $datas)) {
//vmdebug('datas save',$datas);
$customfieldIds = array();
 
 
foreach($datas['field'] as $key => $fields){
$fields['virtuemart_'.$table.'_id'] =$id;
$tableCustomfields = $this->getTable($table.'_customfields');
$tableCustomfields->setPrimaryKey('virtuemart_product_id');
 
if (!empty($datas['custom_param'][$key]) and !isset($datas['clone']) ) {
if (array_key_exists( $key,$datas['custom_param'])) {
$fields['custom_param'] = json_encode($datas['custom_param'][$key]);
}
}
 
VirtueMartModelCustomfields::setParameterableByFieldType($tableCustomfields,$fields['field_type']);
if(!isset($datas['clone'])){
VirtueMartModelCustomfields::bindParameterableByFieldType($tableCustomfields,$fields['field_type']);
}
 
$tableCustomfields->bindChecknStore($fields);
$errors = $tableCustomfields->getErrors();
 
foreach($errors as $error){
vmError($error);
}
$key = array_search($fields['virtuemart_customfield_id'], $old_customfield_ids );
if ($key !== false ) unset( $old_customfield_ids[ $key ] );
//vmdebug('datas clone',$old_customfield_ids,$fields);
}
 
}
 
if ( count($old_customfield_ids) ) {
// delete old unused Customfields
$this->_db->setQuery( 'DELETE FROM `#__virtuemart_'.$table.'_customfields` WHERE `virtuemart_customfield_id` in ("'.implode('","', $old_customfield_ids ).'") ');
$this->_db->query();
}
 
 
JPluginHelper::importPlugin('vmcustom');
$dispatcher = JDispatcher::getInstance();
if (is_array($datas['plugin_param'])) {
foreach ($datas['plugin_param'] as $key => $plugin_param ) {
$dispatcher->trigger('plgVmOnStoreProduct', array($datas, $plugin_param ));
}
}
 
}
 
 
/**
* Formatting admin display by roles
* input Types for product only !
* $field->is_cart_attribute if can have a price
*/
public function displayProductCustomfieldBE ($field, $product_id, $row) {
 
$field->custom_value = empty($field->custom_value) ? $field->value : $field->custom_value;
 
if ($field->is_cart_attribute) {
$priceInput = '<input type="text" value="' . (isset($field->custom_price) ? $field->custom_price : '0') . '" name="field[' . $row . '][custom_price]" />';
}
else {
$priceInput = ' ';
}
 
if ($field->is_list) {
$options = array();
$values = explode (';', $field->custom_value);
 
foreach ($values as $key => $val) {
$options[] = array('value' => $val, 'text' => $val);
}
 
return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]') . '</td><td>' . $priceInput;
}
else {
 
switch ($field->field_type) {
 
case 'A':
//vmdebug('displayProductCustomfieldBE $field',$field);
if(!isset($field->withParent)) $field->withParent = 0;
if(!isset($field->parentOrderable)) $field->parentOrderable = 0;
//vmdebug('displayProductCustomfieldFE',$field);
if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'html.php');
$html = JText::_('COM_VIRTUEMART_CUSTOM_WP').VmHTML::checkbox('field[' . $row . '][withParent]',$field->withParent,1,0,'').'<br />';
$html .= JText::_('COM_VIRTUEMART_CUSTOM_PO').VmHTML::checkbox('field[' . $row . '][parentOrderable]',$field->parentOrderable,1,0,'');
 
$options = array();
//$options[] = array( 'value' => 'product_name' ,'text' =>JText::_('COM_VIRTUEMART_PRODUCT_FORM_NAME')); Is anyway displayed there
$options[] = array('value' => 'product_sku', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_FORM_SKU'));
$options[] = array('value' => 'slug', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_FORM_ALIAS'));
$options[] = array('value' => 'product_length', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_LENGTH'));
$options[] = array('value' => 'product_width', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_WIDTH'));
$options[] = array('value' => 'product_height', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_HEIGHT'));
$options[] = array('value' => 'product_weight', 'text' => JText::_ ('COM_VIRTUEMART_PRODUCT_WEIGHT'));
 
$html .= JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', '', 'value', 'text', $field->custom_value) . '</td><td>' . $priceInput;
return $html;
//return 'Automatic Childvariant creation (later you can choose here attributes to show, now product name) </td><td>';
break;
// variants
case 'V':
return '<input type="text" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" /></td><td>' . $priceInput;
break;
/*
* Stockable (group of) child variants
* Special type setted by the plugin
*/
case 'G':
return;
break;
/*Extended by plugin*/
case 'E':
 
$html = '<input type="hidden" value="' . $field->value . '" name="field[' . $row . '][custom_value]" />';
if (!class_exists ('vmCustomPlugin')) {
require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php');
}
JPluginHelper::importPlugin ('vmcustom', $field->custom_element);
$dispatcher = JDispatcher::getInstance ();
$retValue = '';
$dispatcher->trigger ('plgVmOnProductEdit', array($field, $product_id, &$row, &$retValue));
 
return $html . $retValue . $priceInput;
break;
case 'D':
return vmJsApi::jDate ($field->custom_value, 'field[' . $row . '][custom_value]', 'field_' . $row . '_customvalue') . $priceInput;
break;
case 'T':
//TODO Patrick
return '<input type="text" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" /></td><td>' . $priceInput;
break;
/* string or integer */
case 'S':
case 'I':
return '<input type="text" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" /></td><td>' . $priceInput;
break;
case 'I':
return '<input type="text" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" /></td><td>' . $priceInput;
break;
//'X'=>'COM_VIRTUEMART_CUSTOM_EDITOR',
case 'X':
return '<textarea class="mceInsertContentNew" name="field[' . $row . '][custom_value]" id="field-' . $row . '-custom_value">' . $field->custom_value . '</textarea>
<script type="text/javascript">// Creates a new editor instance
tinymce.execCommand("mceAddControl",true,"field-' . $row . '-custom_value")
</script></td><td>' . $priceInput;
//return '<input type="text" value="'.$field->custom_value.'" name="field['.$row.'][custom_value]" /></td><td>'.$priceInput;
break;
//'Y'=>'COM_VIRTUEMART_CUSTOM_TEXTAREA'
case 'Y':
return '<textarea id="field[' . $row . '][custom_value]" name="field[' . $row . '][custom_value]" class="inputbox" cols=80 rows=50 >' . $field->custom_value . '</textarea></td><td>' . $priceInput;
//return '<input type="text" value="'.$field->custom_value.'" name="field['.$row.'][custom_value]" /></td><td>'.$priceInput;
break;
 
case 'editorta':
jimport ('joomla.html.editor');
$editor = JFactory::getEditor ();
//TODO This is wrong!
$_return['fields'][$_fld->name]['formcode'] = $editor->display ($_prefix . $_fld->name, $_return['fields'][$_fld->name]['value'], 300, 150, $_fld->cols, $_fld->rows);
break;
/* bool */
case 'B':
return JHTML::_ ('select.booleanlist', 'field[' . $row . '][custom_value]', 'class="inputbox"', $field->custom_value) . '</td><td>' . $priceInput;
break;
/* parent */
case 'P':
return $field->custom_value . '<input type="hidden" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" /></td><td>';
break;
/* related category*/
case 'Z':
if (!$field->custom_value) {
return '';
} // special case it's category ID !
$q = 'SELECT * FROM `#__virtuemart_categories_' . VMLANG . '` JOIN `#__virtuemart_categories` AS p using (`virtuemart_category_id`) WHERE `published`=1 AND `virtuemart_category_id`= "' . (int)$field->custom_value . '" ';
$this->_db->setQuery ($q);
//echo $this->_db->_sql;
if ($category = $this->_db->loadObject ()) {
$q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_category_medias` WHERE `virtuemart_category_id`= "' . (int)$field->custom_value . '" ';
$this->_db->setQuery ($q);
$thumb = '';
if ($media_id = $this->_db->loadResult ()) {
$thumb = $this->displayCustomMedia ($media_id);
}
$display = '<input type="hidden" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" />';
return $display . JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=category&task=edit&virtuemart_category_id=' . (int)$field->custom_value), $thumb . ' ' . $category->category_name, array('title' => $category->category_name)) . $display;
}
else {
return 'no result';
}
/* related product*/
case 'R':
if (!$field->custom_value) {
return '';
}
$q = 'SELECT `product_name`,`product_sku`,`product_s_desc` FROM `#__virtuemart_products_' . VMLANG . '` as l JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`) WHERE `virtuemart_product_id`=' . (int)$field->custom_value;
$this->_db->setQuery ($q);
$related = $this->_db->loadObject ();
$display = $related->product_name . '(' . $related->product_sku . ')';
$display = '<input type="hidden" value="' . $field->custom_value . '" name="field[' . $row . '][custom_value]" />';
 
$q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_product_medias`WHERE `virtuemart_product_id`= "' . (int)$field->custom_value . '" AND (`ordering` = 0 OR `ordering` = 1)';
$this->_db->setQuery ($q);
$thumb = '';
if ($media_id = $this->_db->loadResult ()) {
$thumb = $this->displayCustomMedia ($media_id);
}
return $display . JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id=' . $field->custom_value), $thumb . '<br /> ' . $related->product_name, array('title' => $related->product_name . '<br/>' . $related->product_s_desc));
break;
/* image */
case 'M':
if (empty($product)) {
$vendorId = 1;
}
else {
$vendorId = $product->virtuemart_vendor_id;
}
$q = 'SELECT `virtuemart_media_id` as value,`file_title` as text FROM `#__virtuemart_medias` WHERE `published`=1
AND (`virtuemart_vendor_id`= "' . $vendorId . '" OR `shared` = "1")';
$this->_db->setQuery ($q);
$options = $this->_db->loadObjectList ();
return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', '', 'value', 'text', $field->custom_value) . '</td><td>' . $priceInput;
break;
/* Child product Group */
case 'G':
break;
/* Child product */
/*case 'C':
if (empty($product)){
  $virtuemart_product_id = JRequest::getInt('virtuemart_product_id', 0);
  } else {
  $virtuemart_product_id = $product->virtuemart_product_id;
  }
  $html = '';
  $q='SELECT concat(`product_sku`,":",`product_name`) as text ,`virtuemart_product_id`,`product_in_stock` FROM `#__virtuemart_products` WHERE `published`=1
  AND `virtuemart_product_id`= "'.$field->custom_value.'"';
  //$db->setQuery(' SELECT virtuemart_product_id, product_name FROM `#__virtuemart_products` WHERE `product_parent_id` ='.(int)$product_id);
  $this->_db->setQuery($q);
  if ($child = $this->_db->loadObject()) {
  $html .= JHTML::link ( JRoute::_ ( 'index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$field->custom_value), $child->text.' ('.$field->custom_value.')', array ('title' => $child->text ));
  $html .= ' '.JText::_('COM_VIRTUEMART_PRODUCT_FORM_IN_STOCK').':'.$child->product_in_stock ;
  $html .= '<input type="hidden" value="'.$child->virtuemart_product_id.'" name="field['.$row.'][custom_value]" /></div><div>'.$priceInput;
  return $html;
  //return '<input type="text" value="'.$field->custom_value.'" name="field['.$row.'][custom_value]" />';
  }
  else return JText::_('COM_VIRTUEMART_CUSTOM_NO_CHILD_PRODUCT');
  break;*/
}
 
}
}
 
public function getProductCustomsField ($product) {
 
$query = 'SELECT C.`virtuemart_custom_id` , `custom_element`, `custom_params`, `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden`, `layout_pos`, C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` != "G" and `field_type` != "R" and `field_type` != "Z"';
$query .= ' and is_cart_attribute = 0 order by field.`ordering`,virtuemart_custom_id';
$this->_db->setQuery ($query);
if ($productCustoms = $this->_db->loadObjectList ()) {
 
$row = 0;
if (!class_exists ('vmCustomPlugin')) {
require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php');
}
foreach ($productCustoms as $field) {
if ($field->field_type == "E") {
$field->display = '';
JPluginHelper::importPlugin ('vmcustom');
$dispatcher = JDispatcher::getInstance ();
$ret = $dispatcher->trigger ('plgVmOnDisplayProductFE', array($product, &$row, &$field));
 
}
else {
$field->display = $this->displayProductCustomfieldFE ($product, $field, $row);
}
$row++;
}
return $productCustoms;
}
else {
return array();
}
}
 
public function getProductCustomsFieldRelatedCategories ($product) {
 
$query = 'SELECT C.`virtuemart_custom_id` , `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` = "Z"';
$query .= ' and is_cart_attribute = 0 order by virtuemart_custom_id';
$this->_db->setQuery ($query);
if ($productCustoms = $this->_db->loadObjectList ()) {
$row = 0;
foreach ($productCustoms as & $field) {
$field->display = $this->displayProductCustomfieldFE ($product, $field, $row);
$row++;
}
return $productCustoms;
}
else {
return array();
}
}
 
public function getProductCustomsFieldRelatedProducts ($product) {
 
$query = 'SELECT C.`virtuemart_custom_id` , `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` = "R"';
$query .= ' and is_cart_attribute = 0 order by virtuemart_custom_id';
$this->_db->setQuery ($query);
if ($productCustoms = $this->_db->loadObjectList ()) {
$row = 0;
foreach ($productCustoms as & $field) {
$field->display = $this->displayProductCustomfieldFE ($product, $field, $row);
$row++;
}
return $productCustoms;
}
else {
return array();
}
}
 
/**
* Display for the cart
*
* @author Patrick Kohl
* @param obj $product product object
* @return html code
*/
public function getProductCustomsFieldCart ($product) {
 
// group by virtuemart_custom_id
$query = 'SELECT C.`virtuemart_custom_id`, `custom_title`, C.`custom_value`,`custom_field_desc` ,`custom_tip`,`field_type`,field.`virtuemart_customfield_id`,`is_hidden`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` != "G" and `field_type` != "R" and `field_type` != "Z"';
$query .= ' and is_cart_attribute = 1 group by virtuemart_custom_id ORDER BY field.`ordering`';
 
$this->_db->setQuery ($query);
$groups = $this->_db->loadObjectList ();
 
if (!class_exists ('VmHTML')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php');
}
$row = 0;
if (!class_exists ('CurrencyDisplay')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
}
$currency = CurrencyDisplay::getInstance ();
 
if (!class_exists ('calculationHelper')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php');
}
$calculator = calculationHelper::getInstance ();
if (!class_exists ('vmCustomPlugin')) {
require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php');
}
 
$free = JText::_ ('COM_VIRTUEMART_CART_PRICE_FREE');
// render select list
foreach ($groups as $group) {
 
//$query='SELECT  field.`virtuemart_customfield_id` as value ,concat(field.`custom_value`," :bu ", field.`custom_price`) AS text
$query = 'SELECT field.`virtuemart_product_id`, `custom_params`,`custom_element`, field.`virtuemart_custom_id`,
field.`virtuemart_customfield_id`,field.`custom_value`, field.`custom_price`, field.`custom_param`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id;
$query .= ' and is_cart_attribute = 1 and C.`virtuemart_custom_id`=' . (int)$group->virtuemart_custom_id;
 
// We want the field to be ordered as the user defined
$query .= ' ORDER BY field.`ordering`';
 
$this->_db->setQuery ($query);
$options = $this->_db->loadObjectList ();
//vmdebug('getProductCustomsFieldCart options',$options);
$group->options = array();
foreach ($options as $option) {
$group->options[$option->virtuemart_customfield_id] = $option;
}
 
if ($group->field_type == 'V') {
$default = current ($group->options);
foreach ($group->options as $productCustom) {
if ((float)$productCustom->custom_price) {
$price = strip_tags ($currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price)));
}
else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}
$productCustom->text = $productCustom->custom_value . ' ' . $price;
 
}
$group->display = VmHTML::select ('customPrice[' . $row . '][' . $group->virtuemart_custom_id . ']', $group->options, $default->custom_value, '', 'virtuemart_customfield_id', 'text', FALSE);
}
else {
if ($group->field_type == 'G') {
$group->display .= ''; // no direct display done by plugin;
}
else {
if ($group->field_type == 'E') {
$group->display = '';
 
foreach ($group->options as $k=> $productCustom) {
if ((float)$productCustom->custom_price) {
$price = $currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price));
}
else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}
$productCustom->text = $productCustom->custom_value . ' ' . $price;
$productCustom->virtuemart_customfield_id = $k;
if (!class_exists ('vmCustomPlugin')) {
require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php');
}
 
//legacy, it will be removed 2.2
$productCustom->value = $productCustom->virtuemart_customfield_id;
JPluginHelper::importPlugin ('vmcustom');
$dispatcher = JDispatcher::getInstance ();
$fieldsToShow = $dispatcher->trigger ('plgVmOnDisplayProductVariantFE', array($productCustom, &$row, &$group));
 
//$group->display .= '<input type="hidden" value="' . $k . '" name="customPrice[' . $row . '][' . $group->virtuemart_custom_id . ']" /> ';
$group->display .= '<input type="hidden" value="' . $productCustom->virtuemart_customfield_id . '" name="customPrice[' . $row . '][' . $productCustom->virtuemart_custom_id . ']" /> ';
if (!empty($currency->_priceConfig['variantModification'][0]) and $price !== '') {
$group->display .= '<div class="price-plugin">' . JText::_ ('COM_VIRTUEMART_CART_PRICE') . '<span class="price-plugin">' . $price . '</span></div>';
}
$row++;
}
$row--;
}
else {
if ($group->field_type == 'U') {
foreach ($group->options as $productCustom) {
if ((float)$productCustom->custom_price) {
$price = $currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price));
}
else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}
$productCustom->text = $productCustom->custom_value . ' ' . $price;
 
$group->display .= '<input type="text" value="' . JText::_ ($productCustom->custom_value) . '" name="customPrice[' . $row . '][' . $group->virtuemart_custom_id . '][' . $productCustom->value . ']" /> ';
if (!empty($currency->_priceConfig['variantModification'][0]) and $price !== '') {
$group->display .= '<div class="price-plugin">' . JText::_ ('COM_VIRTUEMART_CART_PRICE') . '<span class="price-plugin">' . $price . '</span></div>';
}
}
}
else {
if ($group->field_type == 'A') {
$group->display = '';
foreach ($group->options as $productCustom) {
/*if ((float)$productCustom->custom_price) {
$price = $currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price));
}
else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}*/
$productCustom->field_type = $group->field_type;
$productCustom->is_cart = 1;
$group->display .= $this->displayProductCustomfieldFE ($product, $productCustom, $row);
$checked = '';
}
}
else {
 
$group->display = '';
$checked = 'checked="checked"';
foreach ($group->options as $productCustom) {
//vmdebug('getProductCustomsFieldCart',$productCustom);
if ((float)$productCustom->custom_price) {
$price = $currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price));
}
else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}
$productCustom->field_type = $group->field_type;
$productCustom->is_cart = 1;
//$group->display .= '<input id="' . $productCustom->virtuemart_custom_id . '" ' . $checked . ' type="radio" value="' .
//$productCustom->virtuemart_custom_id . '" name="customPrice[' . $row . '][' . $productCustom->virtuemart_customfield_id . ']" /><label
//for="' . $productCustom->virtuemart_custom_id . '">' . $this->displayProductCustomfieldFE ($productCustom, $row) . ' ' . $price . '</label>';
//MarkerVarMods
$group->display .= '<input id="' . $productCustom->virtuemart_custom_id . '" ' . $checked . ' type="radio" value="' .
$productCustom->virtuemart_customfield_id . '" name="customPrice[' . $row . '][' . $productCustom->virtuemart_custom_id . ']" /><label
for="' . $productCustom->virtuemart_custom_id . '">' . $this->displayProductCustomfieldFE ($product, $productCustom, $row) . ' ' . $price . '</label>';
 
$checked = '';
}
}
}
}
}
}
$row++;
}
 
return $groups;
 
}
 
/**
* Formating front display by roles
*  for product only !
*/
public function displayProductCustomfieldFE (&$product, $customfield, $row = '') {
 
$virtuemart_custom_id = isset($customfield->virtuemart_custom_id)? $customfield->virtuemart_custom_id:0;
$value = $customfield->custom_value;
$type = $customfield->field_type;
$is_list = isset($customfield->is_list)? $customfield->is_list:0;
$price = isset($customfield->custom_price)? $customfield->custom_price:0;
$is_cart = isset($customfield->is_cart)? $customfield->is_cart:0;
 
 
//vmdebug('displayProductCustomfieldFE and here is something wrong ',$customfield);
 
if (!class_exists ('CurrencyDisplay'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance ();
 
if ($is_list > 0) {
$values = explode (';', $value);
if ($is_cart != 0) {
 
$options = array();
 
foreach ($values as $key => $val) {
$options[] = array('value' => $val, 'text' => $val);
}
vmdebug('displayProductCustomfieldFE is a list ',$options);
return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', NULL, 'value', 'text', FALSE, TRUE);
}
else {
$html = '';
//if($type=='M'){
//foreach ($values as $key => $val){
//$html .= '<div id="custom_'.$virtuemart_custom_id.'_'.$val.'" >'.$this->displayCustomMedia($val).'</div>';
//}
 
//} else {
//foreach ($values as $key => $val){
$html .= '<div id="custom_' . $virtuemart_custom_id . '_' . $value . '" >' . $value . '</div>';
//}
//}
 
return $html;
}
 
}
else {
if ($price > 0) {
 
$price = $currency->priceDisplay ((float)$price);
}
switch ($type) {
 
case 'A':
 
$options = array();
 
$session = JFactory::getSession ();
$virtuemart_category_id = $session->get ('vmlastvisitedcategoryid', 0, 'vm');
 
$productModel = VmModel::getModel ('product');
 
//parseCustomParams
VirtueMartModelCustomfields::bindParameterableByFieldType($customfield);
//Todo preselection as dropdown of children
//Note by Max Milbers: This is not necessary, in this case it is better to unpublish the parent and to give the child which should be preselected a category
//Or it is withParent, in that case there exists the case, that a parent should be used as a kind of mini category and not be orderable.
//There exists already other customs and in special plugins which wanna disable or change the add to cart button.
//I suggest that we manipulate the button with a message "choose a variant first"
//if(!isset($customfield->pre_selected)) $customfield->pre_selected = 0;
$selected = JRequest::getInt ('virtuemart_product_id',0);
 
$html = '';
$uncatChildren = $productModel->getUncategorizedChildren ($customfield->withParent);
 
foreach ($uncatChildren as $k => $child) {
$options[] = array('value' => JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $virtuemart_category_id . '&virtuemart_product_id=' . $child['virtuemart_product_id']), 'text' => $child['product_name']);
}
 
$html .= JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', 'onchange="window.top.location.href=this.options[this.selectedIndex].value" size="1" class="inputbox"', "value", "text",
JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $virtuemart_category_id . '&virtuemart_product_id=' . $selected));
//vmdebug('$customfield',$customfield);
if($customfield->parentOrderable==0 and $product->product_parent_id==0){
//vmdebug('Should not be orderable');
$product->orderable = FALSE;
/*if(!$productModel->product_parent_id){
vmdebug('$customfield parentOrderable');
$document = JFactory::getDocument();
$document->addScriptDeclaration(
'jQuery(document).ready( function($) {
 
addToCartArea = jQuery(".productdetails-view .addtocart-bar");
addToCartBar = addToCartArea.find("input[name$=addtocart]");
 
addToCartArea.css({
padding: "0px 0px 0px 0px",
width: "auto"
}).children("span:not(:nth-child(3))").hide()
.parent().children("span::nth-child(3)").css({
margin: "0px 0px 0px 0px",
width: "auto",
float:"left"
});
 
addToCartButtonClassName = addToCartBar.attr("class");
 
addToCartBar.removeClass(addToCartButtonClassName)
.addClass(addToCartButtonClassName + "-disabled")
.attr({
disabled: "disabled",
value:"'.JText::_('COM_VIRTUEMART_ADDTOCART_CHOOSE_VARIANT').'",
});
});
');
}*/
}
 
return $html;
break;
 
/* variants*/
case 'V':
if ($price == 0)
$price = JText::_ ('COM_VIRTUEMART_CART_PRICE_FREE');
 
/* Loads the product price details */
return '<input type="text" value="' . JText::_ ($value) . '" name="field[' . $row . '][custom_value]" /> ' . JText::_ ('COM_VIRTUEMART_CART_PRICE') . $price . ' ';
break;
/*Date variant*/
case 'D':
return '<span class="product_custom_date">' . vmJsApi::date ($value, 'LC1', TRUE) . '</span>'; //vmJsApi::jDate($field->custom_value, 'field['.$row.'][custom_value]','field_'.$row.'_customvalue').$priceInput;
break;
/* text area or editor No JText, only displayed in BE */
case 'X':
case 'Y':
return $value;
break;
/* string or integer */
case 'S':
case 'I':
return JText::_ ($value);
break;
/* bool */
case 'B':
if ($value == 0)
return JText::_ ('COM_VIRTUEMART_NO');
return JText::_ ('COM_VIRTUEMART_YES');
break;
/* parent */
case 'P':
return '<span class="product_custom_parent">' . JText::_ ($value) . '</span>';
break;
/* related */
case 'R':
$q = 'SELECT l.`product_name`, p.`product_parent_id` , l.`product_name`, x.`virtuemart_category_id` FROM `#__virtuemart_products_' . VMLANG . '` as l
JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`)
LEFT JOIN `#__virtuemart_product_categories` as x on x.`virtuemart_product_id` = p.`virtuemart_product_id`
WHERE p.`published`=1 AND  p.`virtuemart_product_id`= "' . (int)$value . '" ';
$this->_db->setQuery ($q);
$related = $this->_db->loadObject ();
if (empty ($related))
return '';
$thumb = '';
$q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_product_medias`WHERE `virtuemart_product_id`= "' . (int)$value . '" AND (`ordering` = 0 OR `ordering` = 1)';
$this->_db->setQuery ($q);
if ($media_id = $this->_db->loadResult ()) {
$thumb = $this->displayCustomMedia ($media_id);
return JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $value . '&virtuemart_category_id=' . $related->virtuemart_category_id), $thumb . ' ' . $related->product_name, array('title' => $related->product_name));
}
break;
/* image */
case 'M':
return $this->displayCustomMedia ($value);
break;
/* categorie */
case 'Z':
$q = 'SELECT * FROM `#__virtuemart_categories_' . VMLANG . '` as l JOIN `#__virtuemart_categories` AS c using (`virtuemart_category_id`) WHERE `published`=1 AND l.`virtuemart_category_id`= "' . (int)$value . '" ';
$this->_db->setQuery ($q);
if ($category = $this->_db->loadObject ()) {
$q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_category_medias`WHERE `virtuemart_category_id`= "' . $category->virtuemart_category_id . '" ';
$this->_db->setQuery ($q);
$thumb = '';
if ($media_id = $this->_db->loadResult ()) {
$thumb = $this->displayCustomMedia ($media_id);
}
return JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=category&virtuemart_category_id=' . $category->virtuemart_category_id), $thumb . ' ' . $category->category_name, array('title' => $category->category_name));
}
else return '';
/* Child Group list
 * this have no direct display , used for stockable product
*/
case 'G':
return ''; //'<input type="text" value="'.JText::_($value).'" name="field['.$row.'][custom_value]" /> '.JText::_('COM_VIRTUEMART_CART_PRICE').' : '.$price .' ';
break;
break;
}
}
}
 
function displayCustomMedia ($media_id, $table = 'product', $absUrl = FALSE) {
 
if (!class_exists ('TableMedias'))
require(JPATH_VM_ADMINISTRATOR . DS . 'tables' . DS . 'medias.php');
//$data = $this->getTable('medias');
$db = JFactory::getDBO ();
$data = new TableMedias($db);
$data->load ((int)$media_id);
 
if (!class_exists ('VmMediaHandler'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'mediahandler.php');
$media = VmMediaHandler::createMedia ($data, $table);
 
return $media->displayMediaThumb ('', FALSE, '', TRUE, TRUE, $absUrl);
 
}
 
/**
* There are too many functions doing almost the same for my taste
* the results are sometimes slighty different and makes it hard to work with it, therefore here the function for future proxy use
*
*/
public function customFieldDisplay ($product, $variantmods, $html, $trigger) {
 
//vmdebug('customFieldDisplay $variantmods',$variantmods);
$row = 0;
if (!class_exists ('shopFunctionsF'))
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php');
//MarkerVarMods
foreach ($variantmods as $selected => $variant) {
//foreach ($variantmods as $variant=> $selected) {
//vmdebug('customFieldDisplay '.$variant.' '.$selected);
if ($selected) {
 
$productCustom = self::getProductCustomField ($selected);
//vmdebug('customFieldDisplay',$selected,$productCustom);
if (!empty($productCustom)) {
$html .= ' <span class="product-field-type-' . $productCustom->field_type . '">';
if ($productCustom->field_type == "E") {
 
$product = self::addParam ($product);
$product->productCustom = $productCustom;
//vmdebug('CustomsFieldCartDisplay $productCustom',$productCustom);
//vmdebug('customFieldDisplay $product->param selected '.$selected,$product->param);
if (!class_exists ('vmCustomPlugin'))
require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php');
JPluginHelper::importPlugin ('vmcustom');
$dispatcher = JDispatcher::getInstance ();
$dispatcher->trigger ($trigger, array($product, $row, &$html));
 
}
else {
//vmdebug('customFieldDisplay $productCustom by self::getProductCustomField $variant: '.$variant.' $selected: '.$selected,$productCustom);
$value = '';
if (($productCustom->field_type == "G")) {
 
$child = self::getChild ($productCustom->custom_value);
//$html .= $productCustom->custom_title.' '.$child->product_name;
$value = $child->product_name;
}
elseif (($productCustom->field_type == "M")) {
//$html .= $productCustom->custom_title.' '.self::displayCustomMedia($productCustom->custom_value);
$value = self::displayCustomMedia ($productCustom->custom_value);
}
elseif (($productCustom->field_type == "S")) {
//q$html .= $productCustom->custom_title.' '.JText::_($productCustom->custom_value);
$value = $productCustom->custom_value;
}
else {
//$html .= $productCustom->custom_title.' '.$productCustom->custom_value;
//vmdebug('customFieldDisplay',$productCustom);
$value = $productCustom->custom_value;
}
$html .= ShopFunctionsF::translateTwoLangKeys ($productCustom->custom_title, $value);
}
$html .= '</span><br />';
}
else {
// falldown method if customfield are deleted
foreach ((array)$selected as $key => $value) {
$html .= '<br/ >Couldnt find customfield' . ($key ? '<span>' . $key . ' </span>' : '') . $value;
}
vmdebug ('CustomsFieldOrderDisplay, $item->productCustom empty? ' . $variant);
vmdebug ('customFieldDisplay, $productCustom is EMPTY ');
}
 
}
$row++;
}
 
//vmdebug ('customFieldDisplay html begin: ' . $html . ' end');
return $html . '</div>';
}
 
/**
* TODO This is html and view stuff and MUST NOT be in the model, notice by Max
* render custom fields display cart module FE
*/
public function CustomsFieldCartModDisplay ($priceKey, $product) {
 
if (empty($calculator)) {
if (!class_exists ('calculationHelper'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php');
$calculator = calculationHelper::getInstance ();
}
 
$variantmods = $calculator->parseModifier ($priceKey);
 
return self::customFieldDisplay ($product, $variantmods, '<div class="vm-customfield-mod">', 'plgVmOnViewCartModule');
 
}
 
/**
*  TODO This is html and view stuff and MUST NOT be in the model, notice by Max
* render custom fields display cart FE
*/
public function CustomsFieldCartDisplay ($priceKey, $product) {
 
if (empty($calculator)) {
if (!class_exists ('calculationHelper'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php');
$calculator = calculationHelper::getInstance ();
}
 
vmdebug('CustomsFieldCartDisplay ',$priceKey);
$variantmods = $calculator->parseModifier ($priceKey);
 
return self::customFieldDisplay ($product, $variantmods, '<div class="vm-customfield-cart">', 'plgVmOnViewCart');
 
}
 
/*
  * render custom fields display order BE/FE
 */
public function CustomsFieldOrderDisplay ($item, $view = 'FE', $absUrl = FALSE) {
 
$row = 0;
//$item=(array)$item;
if (!empty($item->product_attribute)) {
$item->param = json_decode ($item->product_attribute, TRUE);
//$html = '<div class="vm-customfield-cart">';
if (!empty($item->param)) {
return self::customFieldDisplay ($item, $item->param, '<div class="vm-customfield-cart">', 'plgVmDisplayInOrder' . $view);
 
}
else {
vmdebug ('CustomsFieldOrderDisplay $item->param empty? ');
}
}
else {
//vmTrace('$item->product_attribut is empty');
}
return FALSE;
}
 
/**
*
* custom fields for cart and cart module
*/
public function getProductCustomField ($selected) {
 
$db = JFactory::getDBO ();
$query = 'SELECT C.`virtuemart_custom_id` , `custom_element` , `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` ,
C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_cart_attribute` , `is_hidden` , C.`published` ,
field.`virtuemart_customfield_id` , field.`custom_value`,field.`custom_param`,field.`custom_price`
FROM `#__virtuemart_customs` AS C
LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id`
WHERE `virtuemart_customfield_id` ="' . (int)$selected . '"';
//if($product_parent_id!=0){
//$query .= ' AND (`virtuemart_product_id` ="' . $product_id.'" XOR `virtuemart_product_id` ="' . $product_parent_id.'")';
//} else {
//$query .= ' AND (`virtuemart_product_id` ="' . $product_id.'"';
//}
$db->setQuery ($query);
return $db->loadObject ();
}
 
/*
  * add parameter to product definition
 */
public function addParam ($product) {
 
//vmdebug('addParam? ',$product->custom_param,$product->customPlugin);
$custom_param = empty($product->custom_param) ? array() : json_decode ($product->custom_param, TRUE);
$product_param = empty($product->customPlugin) ? array() : json_decode ($product->customPlugin, TRUE);
$params = (array)$product_param + (array)$custom_param;
foreach ($params as $key => $param) {
$product->param[$key] = $param;
}
return $product;
}
 
public function getChild ($child) {
 
$db = JFactory::getDBO ();
$db->setQuery ('SELECT  `product_sku`, `product_name` FROM `#__virtuemart_products_' . VMLANG . '` WHERE virtuemart_product_id=' . $child);
return $db->loadObject ();
}
 
static public function setEditCustomHidden ($customfield, $i) {
 
if (!isset($customfield->virtuemart_customfield_id))
$customfield->virtuemart_customfield_id = '0';
$html = '
<input type="hidden" value="' . $customfield->field_type . '" name="field[' . $i . '][field_type]" />
<input type="hidden" value="' . $customfield->virtuemart_custom_id . '" name="field[' . $i . '][virtuemart_custom_id]" />
<input type="hidden" value="' . $customfield->virtuemart_customfield_id . '" name="field[' . $i . '][virtuemart_customfield_id]" />
<input type="hidden" value="' . $customfield->admin_only . '" checked="checked" name="field[' . $i . '][admin_only]" />';
return $html;
 
}
}
// pure php no closing tag
 
Так а в чем конкретно проблема? Если кнопка радио не устраивает, а нужен список - выбираешь поле "Атрибут корзины", пишешь название, далее снова выбираешь атрибут корзины, в "по умолчанию" через точку с запятой прописываешь значения, внизу указываешь список - "Да". И все.
 
  • Нравится
Реакции: tkav
  • Заблокирован
  • #3
Вам лучше не ставить тип поля - атрибут корзины.
Лучше поставьте "общий дочерний вид" с привязкой к коду товара.

Аргумент 1: Сейчас последовательний заказ сначала 100 л, а потом 50 л ни к чему не приводит. В корзине остается один и тот же товар, сумма не меняется.
Аргумент 2: Вы решите проблему также с одновременным отображением одного и того же товара (с разным литражем) разными строчками в корзине, прикреплением к каждому из них особенного контента.
 
Я сначала так же думал, а потом оказалось, что у меня цвета одежды, например, привязывались только к конкретному артикулу товара, и размеры также. И каждый раз надо было вручную все прописывать.
И у него получится, что его 50 л и 100 л будут принадлежать только конкретному бойлеру, а при создании нового товара ему также придется добавлять в настраиваемых полях 50 л и 100 л.
 
Вам лучше не ставить тип поля - атрибут корзины.
Лучше поставьте "общий дочерний вид" с привязкой к коду товара.

Аргумент 1: Сейчас последовательний заказ сначала 100 л, а потом 50 л ни к чему не приводит. В корзине остается один и тот же товар, сумма не меняется.
Аргумент 2: Вы решите проблему также с одновременным отображением одного и того же товара (с разным литражем) разными строчками в корзине, прикреплением к каждому из них особенного контента.
Большое спасибо, нашел свою глупую ошибку, у меня тип поля был строка.
А как с выводом дочерних товаров, не работает вывод?
 
  • Заблокирован
  • #6
Если я правильно понял ваш вопрос, то как раз с выводом дочерних товаров новый VM работает намного лучше:
1. Все товары (дочерние и родительские) получают глобальный код товара
2. Дочерние товары выводятся с карточки родительского товара. Листая страницы сайта или через поиск они не выводятся.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху