我有一个技术问题,我希望在你的帮助下解决:
当您将产品添加到购物车时,它由CartController及其购物车类完成。在Cart类Cart.php
中,有一个名为updateQty
的方法。在此功能中,检查购物车是否已包含产品。如果购物车包含产品,那么当operator == up时增加其数量,当operator == down时减少其数量,否则如果购物车不包含product,则在operator == up时将产品添加到购物车。
这是Cart.php中提到的某个功能
/* Check if the product is already in the cart */
$result = $this->containsProduct($id_product, $id_product_attribute, (int) $id_customization, (int) $id_address_delivery);
/* Update quantity if product already exist */
if ($result) {
if ($operator == 'up') {
$sql = 'SELECT stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM ' . _DB_PREFIX_ . 'product p
' . Product::sqlStock('p', $id_product_attribute, true, $shop) . '
WHERE p.id_product = ' . $id_product;
$result2 = Db::getInstance()->getRow($sql);
$product_qty = (int) $result2['quantity'];
// Quantity for product pack
if (Pack::isPack($id_product))
$product_qty = Pack::getQuantity($id_product, $id_product_attribute);
$new_qty = (int) $result['quantity'] + (int) $quantity;
$qty = '+ ' . (int) $quantity;
if (!Product::isAvailableWhenOutOfStock((int) $result2['out_of_stock']))
if ($new_qty > $product_qty)
return false;
}
else if ($operator == 'down') {
$qty = '- ' . (int) $quantity;
$new_qty = (int) $result['quantity'] - (int) $quantity;
if ($new_qty < $minimal_quantity && $minimal_quantity > 1)
return -1;
} else
return false;
/* Delete product from cart */
if ($new_qty <= 0)
return $this->deleteProduct((int) $id_product, (int) $id_product_attribute, (int) $id_customization);
else if ($new_qty < $minimal_quantity)
return -1;
else
Db::getInstance()->execute('
UPDATE `' . _DB_PREFIX_ . 'cart_product`
SET `quantity` = `quantity` ' . $qty . ', `date_add` = NOW()
WHERE `id_product` = ' . (int) $id_product .
(!empty($id_product_attribute) ? ' AND `id_product_attribute` = ' . (int) $id_product_attribute : '') . '
AND `id_cart` = ' . (int) $this->id . (Configuration::get('PS_ALLOW_MULTISHIPPING') && $this->isMultiAddressDelivery() ? ' AND `id_address_delivery` = ' . (int) $id_address_delivery : '') . '
LIMIT 1'
);
}
/* Add product to the cart */
elseif ($operator == 'up') {
$sql = 'SELECT stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM ' . _DB_PREFIX_ . 'product p
' . Product::sqlStock('p', $id_product_attribute, true, $shop) . '
WHERE p.id_product = ' . $id_product;
$result2 = Db::getInstance()->getRow($sql);
// Quantity for product pack
if (Pack::isPack($id_product))
$result2['quantity'] = Pack::getQuantity($id_product, $id_product_attribute);
if (!Product::isAvailableWhenOutOfStock((int) $result2['out_of_stock']))
if ((int) $quantity > $result2['quantity'])
return false;
if ((int) $quantity < $minimal_quantity)
return -1;
$result_add = Db::getInstance()->insert('cart_product', array(
'id_product' => (int) $id_product,
'id_product_attribute' => (int) $id_product_attribute,
'id_cart' => (int) $this->id,
'id_address_delivery' => (int) $id_address_delivery,
'id_shop' => $shop->id,
'quantity' => (int) $quantity,
'date_add' => date('Y-m-d H:i:s'),
'customprice' => (float) $customprice,
));
if (!$result_add)
return false;
}
这是购物车的逻辑行为,因为如果您已经在购物车中有产品并且让我再次按下同一产品的“添加到购物车”按钮,则会产生与按下加号相同的结果购物车中的按钮用于增加产品数量。如果pretashop将相同的产品添加到购物车两次,那将是不好的行为。
如果你的每个产品都在后台设置固定价格,那么当你使用Prestashop时,一切都很好。
但是在可能的情况下,客户可以使用自定义价格将产品添加到购物车。我在Tools::getValue('variable')
中使用cart.php
获取此变量$ customprice并将其保存在数据库中,如上一个sql查询中所示。因此,现在当您将产品添加到购物车中并将自定义价格产品添加到购物车中并保存了customprice。但是当你回到产品页面并添加相同的产品但具有不同的定制价格时,当然购物车的行为如下:
它只会增加您已添加到购物车的第一个产品的数量,因为此产品已存在于购物车中。第二个定制价格被忽略了。
有人知道我必须更改哪些文件以告诉购物车控制器,当相同的产品被添加到购物车但是价格不同时它不应该增加第一个商品的数量而是控制器应该再次添加产品新的价格的购物车就像它将是一个不同的产品!! ???
感谢任何帮助
祝你好运