我正在使用Prestashop 1.5.x网站,我需要为特定产品添加自定义价格计算规则。 我的目标是每个订单增加10美元,但PS会增加产品数量的额外成本,所以如果你订购20个产品,它会问你200美元而不是10美元...... 我需要覆盖/classes/Product.php中的计算过程,例如:
if (product_id = 44) { $price = $price + 10; }
else { $price = $price }
你有什么想法吗?
答案 0 :(得分:10)
您必须在prestashop中创建Product类的覆盖。为此,请在名为Product.php的override / classes中创建一个新文件,并将此代码放入其中:
<?php
class Product extends ProductCore
{
// Here we will put every method or property override
}
在本课程中,您将复制/粘贴静态方法priceCalculation
(它位于原始Product.php文件的第2567行)。完成后,只需在方法末尾添加这些行,就在self::$_prices[$cache_id] = $price;
:
if ($id_product == 44 && Context::getContext()->customer->isLogged()) {
$customer = Context::getContext()->customer;
$nbTimesBoughtThisProduct = (int) Db::getInstance()->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'product` p
JOIN `' . _DB_PREFIX_ . 'order_detail` od
ON p.`id_product` = od.`product_id`
JOIN `' . _DB_PREFIX_ . 'orders` o
ON od.`id_order` = o.`id_order`
WHERE o.`id_customer` = ' . $customer->id . '
AND p.`id_product` = ' . $id_product . '
');
$price += $nbTimesBoughtThisProduct * 10;
}
我没有时间测试这些,但我认为这是你想做的事情。
priceCalculation
是每次Prestashop需要产品价格时调用的方法。通过将此代码放在此方法的末尾,我们会修改返回的价格。
代码首先检查客户是否已登录(如果不是,我们无法获得他的订单)。如果是这样,查询将检索此客户过去购买此产品的次数。此数字乘以10,并将该值添加到价格中。
编辑:如果像Cyril Tourist所说的那样,你想要计算当前的购物车,请获取这些新代码(仍然没有经过测试,但应该有效):
if ($id_product == 44 && Context::getContext()->customer->isLogged()) {
$customer = Context::getContext()->customer;
$nbTimesBoughtThisProduct = (int) Db::getInstance()->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'product` p
JOIN `' . _DB_PREFIX_ . 'order_detail` od
ON p.`id_product` = od.`product_id`
JOIN `' . _DB_PREFIX_ . 'orders` o
ON od.`id_order` = o.`id_order`
WHERE o.`id_customer` = ' . $customer->id . '
AND p.`id_product` = ' . $id_product . '
');
$productsInCart = Context::getContext()->cart->getProducts();
foreach ($productsInCart as $productInCart) {
if ($productInCart['id_product'] == 44) {
$nbTimesBoughtThisProduct++;
}
}
$price += $nbTimesBoughtThisProduct * 10;
}
另外,我建议您将“44”产品ID存储在常量,配置变量或任何内容中,但不要将其保存在代码中。我只是为了这个例子。