VirtueMart Forum

VirtueMart 2 + 3 + 4 => Virtuemart Development and bug reports => Topic started by: vstream on January 11, 2016, 21:33:07 PM

Title: customfield and selectoptions
Post by: vstream on January 11, 2016, 21:33:07 PM
(this is a google translator)
Hello!
Help, we need to do this function:
if "selectoptions2" = "in_stock": 0<  then =  option color: red and "selectoptions1" =  option color: red

(http://i.piccy.info/i9/243fa33a275910d4230c9282a61c9bba/1452543500/2825/991322/1.png)

//<![CDATA[
jQuery( function($) {
//var customfield_id = {};
//var selecteds = [];//all selected options
//var found_id=0;//found child id
var stockhandle = "risetime";
var stockable_418 =$.parseJSON('{"5480":{"selectoptions1":["\u0411\u0435\u043b\u044b\u0439","\u0411\u0435\u043b\u044b\u0439"],"selectoptions2":["37","37"],"in_stock":85},


Thank you
Title: Re: customfield and selectoptions
Post by: Studio 42 on January 12, 2016, 00:21:39 AM
What is your original language ?
Title: Re: customfield and selectoptions
Post by: vstream on January 12, 2016, 08:40:48 AM
Russian  :)
Title: Re: customfield and selectoptions
Post by: Studio 42 on January 12, 2016, 11:06:22 AM
Yuor code is not possible, because Virtuemart do not send back the stock.
Title: Re: customfield and selectoptions
Post by: vstream on January 12, 2016, 19:38:38 PM
Well, then how do I give the style options available if you have a product?
Title: Re: customfield and selectoptions
Post by: GJC Web Design on January 12, 2016, 23:59:18 PM
I did something like this ages ago

I have copied the notes I made at the time..  the customs weren't a dropdown  as I changed them to individual links but the idea is similar of disabling non-stocked items

in that file find where the select is formed and "change " it depending on stock

I think all this has been moved to components\com_virtuemart\sublayouts\customfield.php  and I see some reference to stock in there

$q = 'SELECT `virtuemart_product_id` FROM #__virtuemart_products WHERE product_parent_id = "'.$customfield->virtuemart_product_id.'" and ( published = "0" ';
if($stockhandle == 'disableit_children'){
$q .= ' OR (`product_in_stock` - `product_ordered`) <= "0"';
}
$q .= ');';


as its a sublayout you can safely over ride it

my old code (from early VM3 I think) was

//file customfields administrator\components\com_virtuemart\models\customfields.php line 990
//GJC
$linky = JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $virtuemart_category_id . '&virtuemart_product_id=' . $child['virtuemart_product_id']);
$texty = $child[$customfield->customfield_value];
if($available > 0){
$output .= '<div class="pbuts" id="p'.$child['virtuemart_product_id'].'"><a href="'.$linky.'" >'.$texty.'</a></div>';
}else{
$output .= '<div class="pbuts greyit" id="p'.$child['virtuemart_product_id'].'">'.$texty.'</div>';
}
//GJC
Title: Re: customfield and selectoptions
Post by: lindapowers on January 13, 2016, 13:59:05 PM
A developer made a plugin for us which basicly shows in red color the out of stock childs. I shared the code back then in the coding section but no one seemed to cared. I believe is an override of the customfields.php with some code added.

Helps users to clearly notice what products are out of stock without having to click one by one. Something that would be a nice addon to the core custom fields, a simple css from templaters could launch this.

(http://s2.postimg.org/g1580d6yh/out_of_stock.jpg)

Regards
Title: Re: customfield and selectoptions
Post by: Jörgen on January 13, 2016, 14:22:18 PM
Hello lindapowers

Could you give a link to the thread with the plugin for redlighting the Children that are out of stock ?

regards

Jörgen @ Kreativ Fotografi
Title: Re: customfield and selectoptions
Post by: GJC Web Design on January 13, 2016, 14:51:35 PM
http://forum.virtuemart.net/index.php?topic=129832.msg447174#msg447174

same idea of using if($available > 0){
Title: Re: customfield and selectoptions
Post by: lindapowers on January 13, 2016, 15:35:18 PM
Yep thats the link:

http://forum.virtuemart.net/index.php?topic=129832.msg447174#msg447174

That code worked for  vm 3.08 and joomla 3.4.1

The customfields.php was modified later by VM team so the dev had to adjust it a bit but I guess you can get the idea from there.

Regards
Title: Re: customfield and selectoptions
Post by: vstream on January 13, 2016, 19:16:20 PM
How can I do it?

not standard stockable.php


<?php
defined
('_JEXEC') or  die( 'Direct Access to ' basename__FILE__ ) . ' is not allowed.' ) ;
if (!
class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS DS 'vmcustomplugin.php');

class 
plgVmCustomStockable extends vmCustomPlugin {

private $stockhandle 0;
// instance of class
//  public static $_this = false;

function __construct(& $subject$config) {
//  if(self::$_this) return self::$_this;
parent::__construct($subject$config);

$varsToPush = array(
'selectname1'=>array('','char'),'selectname2'=>array('','char'),'selectname3'=>array('','char'),'selectname4'=>array('','char'),
'selectoptions1'=>array('','char'),'selectoptions2'=>array('','char'),'selectoptions3'=>array('','char'),'selectoptions4'=>array('','char')
);

$this->setConfigParameterable('custom_params',$varsToPush);

//  self::$_this = $this;
}

// function plgVmOnOrder($product) {

// $dbValues['virtuemart_product_id'] = $product->virtuemart_product_id;
// $dbValues['stockable'] = $this->_virtuemart_paymentmethod_id;
// $this->writeCustomData($dbValues, '#__virtuemart_product_custom_' . $this->_name);
// }




// get product param for this plugin on edit
/**
 * @see components/com_virtuemart/helpers/vmCustomPlugin::plgVmOnProductEdit()
 * @author Matt Lewis-Garner
 * @author Patrick Kohl
 */
function plgVmOnProductEdit($field$product_id, &$row,&$retValue) {
//TODO Give warning if config not set to disableit_children
if ($field->custom_element != $this->_name) return '';

$this->parseCustomParams($field);
$html ='';
if (!$childs $this->getChilds($product_id) ) $html .='<DIV>'.JTEXT::_('VMCUSTOM_STOCKABLE_NO_CHILD').'</DIV>';
$db JFactory::getDBO();
// $db->setQuery('SELECT `virtuemart_custom_id` FROM `#__virtuemart_customs` WHERE field_type="G" ');
// $group_custom_id = $db->loadResult();
// $plgParam = $this->getVmCustomParams($field->virtuemart_custom_id);

$html .='<span style="width:50px; display: inline-block;">'.JText::_('VMCUSTOM_STOCKABLE_IS_VARIANT').'</span>';

for ($i 1$i<;$i++) {
$selectname 'selectname'.$i ;
$listname $field->$selectname;
if (!empty($listname)) {
$html .=' <span style="width:98px; display: inline-block;color:#000;overflow:hidden;">'.JTEXT::_($listname).'</span>';
}
}
$html .=' <span style="width:98px; display: inline-block;color:#000;">'JText::_('VMCUSTOM_STOCKABLE_PRICE') .'</span>';
// $param = json_decode($field->custom_param,true);
if (isset($field->child)) $childList $field->child;
else $childList = array();
$html .= '<div id="stockables">';
foreach ($childs as $child ) {
$checked ='';
$price null;
if(!empty($childList)) {
if (!array_key_exists($child->id$childList) ) $childList[$child->id]['is_variant'] = 1;
if ($childList[$child->id]['is_variant'] ) $checked='checked';
if (array_key_exists('custom_price'$childList[$child->id] ) )
$price $childList[$child->id]['custom_price'] ;
}
//$html .= JHTML::_('select.genericlist', $childlist, 'custom_param['.$row.'][child_id]','','virtuemart_product_id','product_name',$param['child_id'],false,true);
$name='custom_param['.$row.'][child]['.$child->id.']';
$html .='<div class="stockable">' ;
$html .=' <input type="hidden"  value="0" name="'.$name.'[is_variant]">';
$html .=' <span style="width:50px; display: inline-block;"><input type="checkbox" '.$checked.'  value="1" name="'.$name.'[is_variant]"></span>';

$html .=$this->getCustomOptionsForm($field$name$childList[$child->id]);

//$html .='<input  type="hidden" name="'.$name.'[child_id]" value="'.$child->id.'">';
// if (!$customfield = $this->getFieldId($product_id, $child->id) ) $price ='' ;
// else

$html .='<input style="width:98px; display: inline-block;" type="text" name="'.$name.'[custom_price]" value="'.$price.'">';
// $html .='<input type="hidden" name="custom_param[c'.$child->id.'][field_type]" value="G">';
// $html .='<input type="hidden" name="field[c'.$child->id.'][virtuemart_custom_id]" value="'.$group_custom_id.'">';

$html .= ' '.$child->product_name.' ['.JText::_('COM_VIRTUEMART_PRODUCT_IN_STOCK').' : '.$child->stock.']</div>' ;

}
$html .='</div>
<fieldset style="background-color:#b9298b;">
<legend>'
JText::_('COM_VIRTUEMART_PRODUCT_FORM_NEW_PRODUCT_LBL').'</legend>
<div id="new_stockable">
<span>'
JText::_('COM_VIRTUEMART_PRODUCT_SKU').'</span> <span><input value="" name="stockable[product_sku]" type="text"></span>
<span>'
JText::_('COM_VIRTUEMART_PRODUCT_NAME').'</span> <span><input value="" name="stockable[product_name]" type="text"></span>
<span>'
JText::_('VMCUSTOM_STOCKABLE_PRICE').'</span> <span><input value="" name="stockable[product_price]" type="text"></span>
<span>'
JText::_('COM_VIRTUEMART_PRODUCT_IN_STOCK').'</span> <span><input value="" name="stockable[product_in_stock]" type="text"></span>

<span id="new_stockable_product"><span class="icon-nofloat vmicon vmicon-16-new"></span>'
JText::_('COM_VIRTUEMART_ADD').'</span>
</div>
</fieldset>'
;

$new_fields $this->getCustomOptionsForm($field'{{NAME}}', array());

$script "
jQuery( function($) {
$('#new_stockable_product').click(function() {
var Prod = $('#new_stockable');// input[name^=\"stockable\"]').serialize();

$.getJSON('index.php?option=com_virtuemart&view=product&task=saveJS&token="
.JUtility::getToken()."' ,
{
product_sku: Prod.find('input[name*=\"product_sku\"]').val(),
product_name: Prod.find('input[name*=\"product_name\"]').val(),
product_price: Prod.find('input[name*=\"product_price\"]').val(),
product_in_stock: Prod.find('input[name*=\"product_in_stock\"]').val(),
product_parent_id: "
.$product_id.",
published: 1,
format: \"json\"
},
function(data) {
//console.log (data);
//$.each(data.msg, function(index, value){
// $(\"#new_stockable\").append(data.msg);
//});
name='custom_param["
.$row."][child]['+data.product_id+']';
new_fields = '"
.str_replace("\n"''$new_fields)."';
new_fields = new_fields.replace(/\{\{NAME\}\}/g, name);
$('#stockables').append(
'<div class=\"stockable\">' +
'<input type=\"hidden\"  value=\"0\" name=\"'+name+'[is_variant]\">' +
'<span style=\"width:50px; display: inline-block;\"><input type=\"checkbox\" checked=\"checked\"  value=\"1\" name=\"'+name+'[is_variant]\"></span>' +
new_fields +
'<input style=\"width:98px; display: inline-block;\" type=\"text\" name=\"'+name+'[custom_price]\" value=\"'+Prod.find('input[name*=\"product_price\"]').val()+'\">' +
' '+Prod.find('input[name*=\"product_name\"]').val()+' ["
.JText::_('COM_VIRTUEMART_PRODUCT_SKU')." : '+Prod.find('input[name*=\"product_sku\"]').val()+'] [".JText::_('COM_VIRTUEMART_PRODUCT_IN_STOCK')." : '+(Prod.find('input[name*=\"product_in_stock\"]').val() || 0)+']' +
'</div>');
Prod.find('input[name*=\"product_sku\"]').val('');
Prod.find('input[name*=\"product_name\"]').val('');
Prod.find('input[name*=\"product_price\"]').val('');
Prod.find('input[name*=\"product_in_stock\"]').val('');
});
});

jQuery('input[name=field\\\\[
$row\\\\]\\\\[custom_price\\\\]]').val('');
});
"
;
//$document = JFactory::getDocument();
//$document->addScriptDeclaration($script);
// $html  ='<input type="text" value="'.$field['custom_name'].'" size="10" name="custom_param['.$row.'][custom_name]"> ';
// $html .='<input type="text" value="'.$field['custom_size'].'" size="10" name="custom_param['.$row.'][custom_size]">';
//$html .=JTEXT::_('VMCUSTOM_TEXTINPUT_NO_CHANGES_BE');
$retValue .= $html.'<script type="text/javascript">'.$script.'</script>';
return true ;
}

/**
 * Get the formatted options dropdowns and input fields (backend)
 * @author Matt Lewis-Garner
 */
function getCustomOptionsForm($field$name$values) {
$options_html '';
for ($i 1$i<;$i++) {
$selectoptions 'selectoptions'.$i ;
$attributes 'attribute'.$i ;
if (isset($field->$selectoptions)) $selectoption = (string)$field->$selectoptions;
else  $selectoption "" ;
$option = array();
$tmpOptions str_replace"\r""" ,$selectoption);

if ($listoptions explode("\n",$tmpOptions ) ) {
foreach ($listoptions as $key => $val$option[] = JHTML::_('select.option',JText::_$val ) , $val  );
if (empty($values[$selectoptions])) {
$values[$selectoptions] ='';
}
if ($listoptions[0] == '' && $field->{'selectname'.$i}) {
$options_html .= '<input type="text" name="'.$name.'['.$selectoptions.']" value="'.$values[$selectoptions].'" style="width:100px;" />';// <span style="width:98px; display: inline-block;color:#000;">'.JText::_('VMCUSTOM_STOCKABLE_NO_OPTION') .'</span>';
} else if ($listoptions[0] == '') {
$options_html .= '';
} else {
$options_html .= JHTML::_('select.genericlist'$option$name.'['.$selectoptions.']','style="width:100px !important;float:none;"','text','value',$values[$selectoptions],false,true)."\n";
}
}
}

return $options_html;
}

/**
 * @ idx plugin index
 * @see components/com_virtuemart/helpers/vmCustomPlugin::onDisplayProductFE()
 * @author Matt Lewis-Garner
 * @author Patrick Kohl
 */
function plgVmOnDisplayProductVariantFE($field,&$row,&$group) {
// default return if it's not this plugin
if ($field->custom_element != $this->_name) return '';
$row++;
$this->parseCustomParams($field);
//if (!$childs = $this->getChilds($product_id) ) return ;
$this->stockhandle VmConfig::get('stockhandle','none');
$html='<br />';
$customfield_id = array();
$selects = array();
$js = array();
// generate option with valid child results
foreach($field->child as $child_id => &$attribut) {

if ($attribut['is_variant']==1) {
unset ($attribut['is_variant']);
if ($stock $this->getValideChild$child_id)) {
$field->child[$child_id]['in_stock'] = $stock->product_in_stock $stock->product_ordered;

// Availability Image
if ($field->child[$child_id]['in_stock'] < 1) {
if ($this->stockhandle == 'risetime' and VmConfig::get('rised_availability') and empty($stock->product_availability)) {
     $field->child[$child_id]['product_availability'] = (file_exists(JPATH_BASE DS VmConfig::get('assets_general_path') . 'images/availability/' VmConfig::get('rised_availability')))
     JHTML::image(JURI::root() . VmConfig::get('assets_general_path') . 'images/availability/' VmConfig::get('rised_availability''7d.gif'), VmConfig::get('rised_availability''7d.gif'), array('class' => 'availability'))
     $field->child[$child_id]['product_availability'] = VmConfig::get('rised_availability');
} else if (!empty($stock->product_availability)) {
$field->child[$child_id]['product_availability'] = (file_exists(JPATH_BASE DS VmConfig::get('assets_general_path') . 'images/availability/' $stock->product_availability))
JHTML::image(JURI::root() . VmConfig::get('assets_general_path') . 'images/availability/' $stock->product_availability$stock->product_availability, array('class' => 'availability'))
$field->child[$child_id]['product_availability'] = $stock->product_availability;
}
}
//$field->child[$child_id]['product_availability'] = $stock->product_availability;

if ($attribut['custom_price'])
$js[]= '"'.$child_id.'" :'.$attribut['custom_price'];
unset ($attribut['custom_price']);


foreach ($attribut as $key => $list) {
// if (!in_array($key,$selects)) {
// $selects[$key] = array() ;
// }
// if (!in_array($list , $selects[$key]) ) {
if (preg_match('/^selectoptions\d+$/'$key)) {
$selects[$key][$list] = $list ;
$attribut[$key] = array($list,JText::_($list));
}
// }

}
}
} else unset ($attribut);
}

// Javascript can be added multiple times for multiple products on a page,
// so need to suffix everything for the right products
$js_suffix $field->virtuemart_customfield_id;//.'_'.uniqid();

$html .= '<div class="stockable_block_'.$js_suffix.'">';
$i 1;
foreach ($selects as $keys =>$options) {
$selectname 'selectname'.$i;
$listname $field->$selectname;
if (!empty($listname)) {
$optionName 'customPlugin['.$field->virtuemart_customfield_id.']['.$this->_name.']['.$keys.']';
$option = array();
$show_select false;
foreach ($options as $key => $val) {
if (!empty($val)) {
if (== $i) {
$option[] = JHTML::_('select.option'$valJText::_$val ));
}
$show_select true;
}
}
if ($show_select) {
$html .='<div>';
$html .= JHTML::_('select.genericlist'$option,$optionName ,'class="attribute_list customfield_id_'.$js_suffix.'" style="width:62% !important;"','value','text',reset($options),'selectoptions'.$i,false)."</div>\n";
} else $html .='<input id="'.$keys.'" class="attribute_list" type="hidden" value="'.$val.'" name="'.$optionName.'">' ;
}
$i++;
}
$html .= '</div>';
static $stockablejs;

$group->display $html.'
<input type="hidden" value="'
.$child_id.'" name="customPlugin['.$field->virtuemart_customfield_id.']['.$this->_name.'][child_id]">';
// preventing 2 x load javascript

/*if ($stockablejs) return;
$stockablejs = true ;*/
Title: Re: customfield and selectoptions
Post by: vstream on January 13, 2016, 19:17:26 PM

// TODO ONE PARAM IS MISSING
$document = JFactory::getDocument();
$document->addScriptDeclaration('
//<![CDATA[
jQuery( function($) {
//var customfield_id = {'. implode(',' , $js ) .'};
//var selecteds = [];//all selected options
//var found_id=0;//found child id
var stockhandle = "'.$this->stockhandle.'";
var stockable_'.$js_suffix.' =$.parseJSON(\'' .str_replace('\"', '\\\"', json_encode($field->child)). '\') ;
var selections_'.$js_suffix.' = [];
//var original=[];
// var totalattribut_'.$js_suffix.' = $("select.attribute_list.customfield_id_'.$js_suffix.'").length+1;
var totalattribut_'.$js_suffix.' = [];
// get all initial select list values
/*$.each($(".attribute_list"), function(idx,selec) {
original[selec.name] = $.map($(this).find("option"), function(idx, opt) {
return [[ idx.value ,idx.text ]];
});
});*/

// if ( $("#selectoptions1.attribute_list.customfield_id_'.$js_suffix.'").length ) {
if ( $("select.attribute_list.customfield_id_'.$js_suffix.'").length ) {
var stockableBlockIndex = 0;
$(".stockable_block_'.$js_suffix.'").each(function() {
$(this).attr("id", "stockableBlockIndex_'.$js_suffix.'_" + stockableBlockIndex);
totalattribut_'.$js_suffix.'[stockableBlockIndex] = $(this).find("select.attribute_list.customfield_id_'.$js_suffix.'").length+1;
recalculate_'.$js_suffix.'(stockableBlockIndex, $(this).find("select.attribute_list.customfield_id_'.$js_suffix.'").eq(0));
stockableBlockIndex++;
});
}
$("select.attribute_list.customfield_id_'.$js_suffix.'").unbind("change");
$("select.attribute_list.customfield_id_'.$js_suffix.'").change(function(){
var stockableBlockIndex = $(this).parents(".stockable_block_'.$js_suffix.'").attr("id").split("_");
recalculate_'.$js_suffix.'(stockableBlockIndex[stockableBlockIndex.length-1], $(this));

});
function recalculate_'.$js_suffix.'(stockableBlockIndex, Opt){
var found_id = 0;
var currentIndex = $("#stockableBlockIndex_'.$js_suffix.'_"+stockableBlockIndex+" select.attribute_list.customfield_id_'.$js_suffix.'").index(Opt) +1;

selections_'.$js_suffix.'[stockableBlockIndex] = [];
var i=1;
$("#stockableBlockIndex_'.$js_suffix.'_"+stockableBlockIndex+" select.attribute_list.customfield_id_'.$js_suffix.'").each(function() {
selections_'.$js_suffix.'[stockableBlockIndex][i] = $(this).val();
// Clear the following selects
if (i > currentIndex) {
$(this).empty();
}

i++;
});

// Find current values
/*for(var i=1; i<totalattribut_'.$js_suffix.'[stockableBlockIndex]; i++){
selections_'.$js_suffix.'[stockableBlockIndex][i] = $("#selectoptions"+i+".customfield_id_'.$js_suffix.'").val();
}*/

// Clear the following selects
/*for(var i=currentIndex+1; i<totalattribut_'.$js_suffix.'[stockableBlockIndex]; i++){
$("#stockableBlockIndex_'.$js_suffix.'_"+stockableBlockIndex+" #selectoptions"+i+".customfield_id_'.$js_suffix.'").empty();
}*/

// Repopulate the following selects
jQuery.each(stockable_'.$js_suffix.', function(child_id, child_attrib) {
if (isChildValid_'.$js_suffix.'(stockableBlockIndex, child_attrib, currentIndex)) {
populateNextSelect_'.$js_suffix.'(stockableBlockIndex, child_attrib, currentIndex+1);
}
});

// Identify the current child
jQuery.each(stockable_'.$js_suffix.', function(child_id, child_attrib) {
var i;
for(i = 1; i < totalattribut_'.$js_suffix.'[stockableBlockIndex]; i++){
if (child_attrib["selectoptions"+i][0] != selections_'.$js_suffix.'[stockableBlockIndex][i]) {
break;
}
}
if (totalattribut_'.$js_suffix.'[stockableBlockIndex] == i) {
found_id = child_id;
return false;
}
});

if ("disableadd" == stockhandle && stockable_'.$js_suffix.'[found_id].in_stock <= 0) {
$(".addtocart-bar>span").remove();
$(".addtocart-bar>div").remove();
$(".addtocart-bar>a.notify").remove();
$(".addtocart-bar").append(\'<a href="ind\'+\'ex.php?option=com_virtuemart&view=productdetails&layout=notify&virtuemart_product_id=\' + found_id + \'" class="notify">' . JText::_('COM_VIRTUEMART_CART_NOTIFY') . '</a>\');
} else {
var quantity = $(".addtocart-bar .quantity-input").val();
$(".addtocart-bar>span").remove();
$(".addtocart-bar>div").remove();
$(".addtocart-bar>a.notify").remove();
$(".addtocart-bar").append(\'<span class="quantity-box"><input type="text" class="quantity-input js-recalculate" name="quantity[]" value="\' + quantity + \'" /></span><span class="quantity-controls js-recalculate"><input type="button" class="quantity-controls quantity-plus" /><input type="button" class="quantity-controls quantity-minus" /></span><span class="addtocart-button"><input type="submit" name="addtocart" class="addtocart-button" value="'.JText::_('COM_VIRTUEMART_CART_ADD_TO').'" title="'.JText::_('COM_VIRTUEMART_CART_ADD_TO').'" /></span><div class="clear"></div>\');
Virtuemart.product($("form.product"));
}

$(".availability").remove();

if ("risetime" == stockhandle && stockable_'.$js_suffix.'[found_id].product_availability) {
$(".addtocart-area").after(\'<div class="availability">\' + stockable_'.$js_suffix.'[found_id].product_availability + \'</div>\');
}

// recalculate the price by found product child id;
formProduct = Opt.parents("form.product");
virtuemart_product_id = formProduct.find(\'input[name="virtuemart_product_id[]"]\').val();
//formProduct.find("#selectedStockable").remove();
//formProduct.append(\'<input id="stockableChild" type="hidden" value="\'+customfield_id[found_id]+\'" name="customPrice['.$row.'][\'+found_id+\']">\');
formProduct.find(\'input[name*="customPlugin['.$field->virtuemart_customfield_id.']['.$this->_name.'][child_id]"]\').val(found_id);

//(\'<input id="stockableChild" type="hidden" value="\'+customfield_id[found_id]+\'" name="customPrice['.$row.'][\'+found_id+\']">\');
Virtuemart.setproducttype(formProduct,virtuemart_product_id);
}
function isChildValid_'.$js_suffix.'(stockableBlockIndex, child_attrib, currentIndex) {
return_value = true;
for (var i = currentIndex; i > 0; i--) {
if (child_attrib["selectoptions"+i][0] != selections_'.$js_suffix.'[stockableBlockIndex][i]) {
return_value = false;
}
}
return return_value;
}
function populateNextSelect_'.$js_suffix.'(stockableBlockIndex, child_attrib, nextIndex) {
var selectList = $("#stockableBlockIndex_'.$js_suffix.'_"+stockableBlockIndex+" select.attribute_list.customfield_id_'.$js_suffix.'");
var nextSelect = selectList.eq(nextIndex-1);
// if the select exists
if ("undefined" !== typeof(nextSelect) && nextSelect.length > 0) {
// if it doesn\'t already contain this option, add it
if (nextSelect.find("option[value=\'" + child_attrib["selectoptions"+nextIndex][0] + "\']").length == 0) {
nextSelect.append("<option value=\'" + child_attrib["selectoptions"+nextIndex][0] + "\'>" + child_attrib["selectoptions"+nextIndex][1] + "</option>");
}

// if there is only one option, make it selected
if (1 == nextSelect.find("option").length) {
nextSelect.find("option").attr("selected","selected");
selections_'.$js_suffix.'[stockableBlockIndex][nextIndex] = child_attrib["selectoptions"+nextIndex][0];
}
// if this is the selected value, populate the next select too
if (nextSelect.val() == child_attrib["selectoptions"+nextIndex][0]) {
populateNextSelect_'.$js_suffix.'(stockableBlockIndex, child_attrib, nextIndex+1);
}
}
}
});
//]]>
');

// 'custom_param['.$keys.']'

//dump($param);
//"is_variant":"1","attribute1":"Red","attribute2":"20 cm","attribute3":"10","attribute4":"10"

//echo $plgParam->get('custom_info');
// Here the plugin values
//$html =JTEXT::_($param['custom_name']) ;
//$html.=': <input type="text" value="" size="'.$param['custom_name'].'" name="customPlugin['.$row.'][comment]"><br />';


return true;
}

function plgVmOnDisplayProductFE( $product, &$idx,&$group){}
/**
* @see components/com_virtuemart/helpers/vmCustomPlugin::plgVmOnViewCartModule()
* @author Patrick Kohl
*/
function plgVmOnViewCartModule( $product, $row,&$html) {
if (empty($product->productCustom->custom_element) or $product->productCustom->custom_element != $this->_name) return '';
if (!$plgParam = $this->GetPluginInCart($product)) return false ;
foreach ($plgParam as $k => $attributes) {
foreach ($attributes as $k => $attribute) {
if ($k =='child_id') continue;
$html .='<span class="stockablecartvariant_attribute"> '.JText::_($attribute).' </span>';
}
}
return true;
}

/**
* @see components/com_virtuemart/helpers/vmCustomPlugin::plgVmOnViewCart()
* @author Patrick Kohl
*/
function plgVmOnViewCart($product, $row,&$html) {
if (empty($product->productCustom->custom_element) or $product->productCustom->custom_element != $this->_name) return '';
if (!$plgParam = $this->GetPluginInCart($product)) return false ;
$html  .= '<div class="stockablecartvariant_attributes">';
foreach ($plgParam as $attributes) {
foreach ($attributes as $k => $attribute) {
if ($k =='child_id') continue;
$html .='<span class="stockablecartvariant_attribute"> '.JText::_($attribute).' </span>';
}
} // $html .='<span>'.$param->Morecomment.'</span>';
$html.='</div>';
return true;
//vmdebug('stockable attributs',$plgParam);
}

/**
*
* vendor order display BE
*/
function plgVmDisplayInOrderBE($item, $row,&$html) {
if (empty($item->productCustom->custom_element) or $item->productCustom->custom_element != $this->_name) return '';
return $this->plgVmOnViewCart($item, $row,$html);
}

/**
*
* shopper order display FE
*/
function plgVmDisplayInOrderFE($item, $row,&$html) {
if (empty($item->productCustom->custom_element) or $item->productCustom->custom_element != $this->_name) return '';
return $this->plgVmOnViewCart($item, $row,$html);
}

function getChilds($child_id = null) {

if ($child_id) {
$db = JFactory::getDBO();
$q = 'SELECT CONCAT( `product_name`, " [' .JText::_('COM_VIRTUEMART_PRODUCT_SKU').'"," : ",`product_sku`,"]") as product_name,`virtuemart_product_id` as id, `product_in_stock` as stock FROM `#__virtuemart_products_'.VMLANG.'` as l '
. ' JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`)'
. 'WHERE `product_parent_id` ='.(int)$child_id ;
$db->setQuery($q);

$result = $db->loadObjectList();

if (!($result)) {
//JError::raiseWarning(500, $db->getErrorMsg());
return array();
} else return $result ;
} else {
return array();
}
}

function getFieldId($virtuemart_product_id, $child_id ) {

$db = JFactory::getDBO();
$q = 'SELECT cf.* FROM `#__virtuemart_product_customfields` as cf JOIN `#__virtuemart_customs` as c ON `c`.`virtuemart_custom_id` = cf.`virtuemart_custom_id` AND c.`field_type`="G"
WHERE cf.`virtuemart_product_id` ='.(int)$virtuemart_product_id.' and cf.custom_value='.(int)$child_id ;
$db->setQuery($q);
$result = $db->loadObject();
if (!($result)) {
//JError::raiseWarning(500, $db->getErrorMsg());
return false;
} else return $result ;
}

/**
* Get the child object for the given ID if it is valid for the config
* @author Matt Lewis-Garner
*/
function getValideChild($child_id ) {
$db = JFactory::getDBO();
$q = 'SELECT `product_sku`,`product_name`,`product_in_stock`,`product_ordered`,`product_availability` FROM `#__virtuemart_products` JOIN `#__virtuemart_products_'.VMLANG.'` as l using (`virtuemart_product_id`) WHERE `published`=1 and `virtuemart_product_id` ='.(int)$child_id ;
$db->setQuery($q);
$child = $db->loadObject();
if ($child) {
if ('disableit_children' === $this->stockhandle) {
$stock = $child->product_in_stock - $child->product_ordered ;
if ($stock>0)return $child ;
else return false ;
}
else return $child ;
}
return false ;
}

public function plgVmGetProductStockToUpdateByCustom(&$item, $pluginParam, $productCustom) {

if ($productCustom->custom_element !== $this->_name) return false ;
//vmdebug('$pluginParam',$pluginParam[$this->_name]);
$item->virtuemart_product_id = (int)$pluginParam[$this->_name]['child_id'];
return true ;
// echo $item[0]->virtuemart_product_id;jexit();
}

/**
* We must reimplement this triggers for joomla 1.7
* vmplugin triggers note by Max Milbers
*/
public function plgVmOnStoreInstallPluginTable($psType) {

// return $this->onStoreInstallPluginTable($psType);
}

function plgVmDeclarePluginParamsCustom($psType,$name,$id, &$data){
return $this->declarePluginParams('custom', $name, $id, $data);
}

function plgVmSetOnTablePluginParamsCustom($name, $id, &$table){
return $this->setOnTablePluginParams($name, $id, $table);
}

/**
* Custom triggers note by Max Milbers
*/
function plgVmOnDisplayEdit($virtuemart_custom_id,&$customPlugin){
return $this->onDisplayEditBECustom($virtuemart_custom_id,$customPlugin);
}

public function plgVmCalculateCustomVariant(&$product, &$productCustomsPrice,$selected){

if ($productCustomsPrice->custom_element != $this->_name) return false;

if (!$customPlugin = JRequest::getVar('customPlugin',0)) {
$customPlugin = json_decode($product->customPlugin,true);
}
$selected = $customPlugin[$productCustomsPrice->virtuemart_customfield_id]['stockable']['child_id'];

$param = json_decode($productCustomsPrice->custom_param,true);
if ($child = $this->getValideChild($selected)) {
if ($param['child'][$selected]['custom_price'] !=='') {
$productCustomsPrice->custom_price = (float)$param['child'][$selected]['custom_price'];
} else {
$db = JFactory::getDBO();
$db->setQuery('SELECT `product_price` FROM `#__virtuemart_product_prices`  WHERE `virtuemart_product_id`="' . (int)$selected . '" ');
if ($price = $db->loadResult()) $product->product_price = (float)$price;
}
return $child;
}
else return false;
// find the selected child

}
public function plgVmOnAddToCart(&$product){
$customPlugin = JRequest::getVar('customPlugin',0);

if ($customPlugin) {
$db = JFactory::getDBO();
$query = 'SELECT  C.* , field.*
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` =' . $product->virtuemart_product_id.' and `custom_element`="'.$this->_name.'"';
$query .=' and is_cart_attribute = 1';
$db->setQuery($query);
$productCustomsPrice = $db->loadObject();
if (!$productCustomsPrice) return null;
// if ( !in_array($this->_name,$customPlugin[$productCustomsPrice->virtuemart_custom_id]) ) return false;
$selected = $customPlugin[$productCustomsPrice->virtuemart_customfield_id]['stockable']['child_id'];

if (!$child = $this->plgVmCalculateCustomVariant($product, $productCustomsPrice,$selected) ) return false;
if ($child->product_sku)
$product->product_sku = $child->product_sku;
if ($child->product_name)
$product->product_name = $child->product_name;
$product->product_in_stock = $child->product_in_stock;
}
}

public function plgVmDisplayInOrderCustom(&$html,$item, $param,$productCustom, $row ,$view='FE'){
$this->plgVmDisplayInOrderCustom($html,$item, $param,$productCustom, $row ,$view);
}

public function plgVmCreateOrderLinesCustom(&$html,$item,$productCustom, $row ){
// $this->createOrderLinesCustom($html,$item,$productCustom, $row );
}


}

// No closing tag
Title: Re: customfield and selectoptions
Post by: vstream on January 13, 2016, 22:18:23 PM
customfields.php
http://www.ex.ua/edit_storage/328622519339 (http://www.ex.ua/edit_storage/328622519339)
Title: Re: customfield and selectoptions
Post by: lindapowers on January 14, 2016, 10:11:08 AM
What if you pay GJC or Studio to get it sorted...
Title: Re: customfield and selectoptions
Post by: vstream on January 16, 2016, 22:05:00 PM

I do not understand what you mean