Search code examples
joomla2.5custom-fieldsvirtuemart

VirtueMart 2.6.6 custom field (cart variable) not displayed in the order details


I programmed a custom field plugin for Virtuemart 2.6.6, which show some parameters on the product page for example "size", and that parameter is a cart variable either.

A huge help was this article:

https://www.spiralscripts.co.uk/Joomla-Tips/custom-plugin-fields-in-virtuemart-2-2.html

And of course stackoverflow forum and factory default VM custom plugins.

Everything is working (the size is displayed in product details view, and in the cart, when you added the product to it) but one thing:

  • after sending the order the parameter has not displayed in the order details, so I don't know what size of product was bought.

I placed following functions into my plugin, but not solved my problem:

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="parameterek_attributes">';

    foreach ($plgParam as $attributes) {
        foreach ($attributes as $k => $attribute) {
            if ($k =='child_id') continue;
    if ($k == 'custom_param_default3') $name = 'Veľkosť'; else $name = '';
            $html .='<span class="parameterek_attribute"> '.$name.': '.JText::_($attribute).' </span>';
        }
    }       

    $html.='</div>';
return true;
}

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

$this->plgVmOnViewCart($item, $row,$html);
}

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

Into database table called #__virtuemart_order_items were saved values: something like:

{"357":"5"}

but it should be something like:

{"357":"size M"}

I see that the key function is GetPluginInCart($product), and when I printed out the $product->param in that function I've got this output, when I go through checkout process:

Array
(
[0] => Array
    (
        [parameterek] => Array
            (
                [custom_param_default3] => L
            )

    )

)

but after I finish the order and go into order details the $product->param has this value:

Array
(
[357] => 5
)
  • So I think, before I finish the order I have to somehow handle the chosen product parameter and transform it into the correct form, but I don't know how.

On the following site https://dev.virtuemart.net/projects/virtuemart/wiki/Product_Plugins

I found a function:

plgVmOnViewCartOrder($product, $param,$productCustom, $row) 
handel $param before adding it in the order  

return $param;

but when I searched for the string "plgVmOnViewCartOrder" in the whole virtuemart installation, it was not found, so it means it is not launched (?)

If anybody could help me or send a fair documentation would be very good. Thank you!


Solution

  • I think, I solved my problem, what was:

    in function plgVmOnDisplayProductVariantFE I made a mistake, I didn't use layout renderer, which generates an object $viewData with variable virtuemart_customfield_id.

    Then in your plugin's layout, input field name has to be as follows:

    <input 
      class="parameterekInput" 
      type="radio" 
      id="plugin_param['.$viewData[0]->virtuemart_customfield_id.']['.$this->_name.']['.$c.']" 
      name="customPlugin['.$viewData[0]->virtuemart_customfield_id.']['.$this->_name.'][custom_param_default3]" 
      value="'.$size.'" />
    

    so the name attribute should be always:

    • customPlugin['.$viewData[0]->virtuemart_customfield_id.']['.$this->_name.'][whatever]

    The right usage of plgVmOnDisplayProductVariantFE function is to use expression:

    • $group->display .= $this->renderByLayout('default',array($field,&$idx,&$group )

    Here the whole function with the right expresion:

    function plgVmOnDisplayProductVariantFE ($field, &$idx, &$group) {
        if ($field->custom_element != $this->_name) return '';
    
        $this->getCustomParams($field);
    
            $this->getPluginCustomData($field, $field->virtuemart_product_id);
    
            $group->display .= $this->renderByLayout('default',array($field,&$idx,&$group ) );
    
        return true;
      }
    

    Now when I print_r -ing $product->param in function GetPluginInCart($product), I get this:

    Array
    (
    [273] => Array  //previously the key was Zero, now it is 273, value of virtuemart_customfield_id
        (
            [parameterek] => Array
                (
                    [custom_param_default3] => L
                )
    
        )
    
    )
    

    ...and now I'm glad, that I can move on in my project :)