First product in cart with custom fields dont trigger plgVmOnViewCartModule
Part of cart object
["1::0"]=>
object(stdClass)#231 (44) {}
["1::1"]=>
object(stdClass)#230 (44) {}
Problem arises because method public function parseModifier($name) class calculationHelper uses function empty instead isset.
//name = 1::0
public function parseModifier($name) {
$variants = array();
if ($index = strpos($name, '::')) {
$virtuemart_product_id = substr($name, 0, $index);
// $virtuemart_product_id = 1
$allItems = substr($name, $index + 2);
// $allItems = 0
$items = explode(';', $allItems);
// $items array('0' => 0)
foreach ($items as $item) {
// $item = 0
// !empty(0) = false
if (!empty($item)) {
$index2 = strpos($item, ':');
$variant = substr($item, 0, $index2);
$selected = substr($item, $index2 + 1);
$variants[$variant] = $selected;
}
}
}
Returns FALSE if var has a non-empty and non-zero value.
http://php.net/manual/en/function.empty.php
hmm, when it is empty, then it should be false, that is correct. it means there is no variant, I think there is an other error.
Quote from: Milbo on May 30, 2012, 22:52:35 PM
hmm, when it is empty, then it should be false, that is correct. it means there is no variant, I think there is an other error.
Sorry im not good in english. Try to explain.
We adding to cart product with custom plugin field.
Got in cart object
["products"]=>
array(1) {
["1::0"]=>object(stdClass)#237 (44) {
Adding again:
Got in cart object
["products"]=>
array(2) {
["1::0"]=>object(stdClass)#237 (44) {}
["1::1"]=>object(stdClass)#236 (44) {}
Now going to cart ViewJS and see that second product call plugin plgVmOnViewCartModule - got data in product_attributes, first not.
Ok.
/public/components/com_virtuemart/helpers/cart.php->prepareAjaxData()
foreach ($this->products as $priceKey=>$product){
....
if (!is_numeric($priceKey)) {
if(!class_exists('VirtueMartModelCustomfields'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php');
// custom product fields display for cart
$this->data->products[$i]['product_attributes'] = VirtueMartModelCustomfields::CustomsFieldCartModDisplay($priceKey,$product);
}
/public/administrator/components/com_virtuemart/models/customfields.php
public function CustomsFieldCartModDisplay($priceKey,$product) {
.....
if ($variantmods) {
.....
$dispatcher->trigger('plgVmOnViewCartModule',array($product, $row,&$html));
In second iteration we got true and trigger method, in first not.
Looking for $variantmods
$variantmods = $calculator->parseModifier($priceKey);
/public/administrator/components/com_virtuemart/helpers/calculationh.php
public function parseModifier($name) {
$variants = array();
if ($index = strpos($name, '::')) {
$virtuemart_product_id = substr($name, 0, $index);
$allItems = substr($name, $index + 2);
$items = explode(';', $allItems);
foreach ($items as $item) {
if (!empty($item)) {
$index2 = strpos($item, ':');
$variant = substr($item, 0, $index2);
$selected = substr($item, $index2 + 1);
$variants[$variant] = $selected;
}
}
}
return $variants;
}
What this function should do.
1. if it got 1::, it will return empty array - array(0) { }. Ok.
2. If it got 1::1, it will return non empty array - array(1) { [""]=> bool(false) } - so
if ($variantmods) - true and trigger plugin method
3. If it got 1::0, it have to return non empty array, but it doesnt. Cause in first iteration of foreach ($items as $item), $item - will be zero.
It set, but zero. For empty function it will be true.
Solution:
1. Use isset. Case
var $i=0;
if(isset($i)) = true
if(!empty($i)) = false
2. then vm adding to cart product with modifers - avoid zero :)
Quote from: lipes on May 30, 2012, 23:29:17 PM
humm.. could be this the same reason for problem that i am experiencing?
Do u use custom field plugin?
I think it differnt trouble. :)
Quote from: lipes on May 30, 2012, 23:29:17 PM
But when add the product to the cart.. the product give us a different value from what we've choose...
http://outros.net23.net/index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=8&virtuemart_category_id=2
I think the price for the color is always added.
iMedved, so you say it does not work correctly, when the selection is a 0? And that the tests if there is a variant are already done, so it is strange? Sounds reasonable. So what are your experience changing it to isset? Did you got any other trouble?
Yep!
Always add the Size '150' (that have the price 77.55€), even if you choose no size (zero/ empty value); color always got the Yellow price ( 0,97 € ); and add a showel price "10,34 €"
that give us the final result in cart: 313,30 €
The Text of Custom Fields is working correct in the cart... but the price Custom Field it isnt ...
I've tested again and it's a problem related with 2.0.7 (a,b,c,d,) sorry! >> http://forum.virtuemart.net/index.php?topic=103126.msg343658#msg343658
Quote from: Milbo on May 31, 2012, 10:17:56 AMDid you got any other trouble?
Nope. This part work fine.