Я работаю над сайтом Prestashop 1.5.x, где мне нужно добавить пользовательское правило расчета цены для конкретного продукта.
Моя цель — добавить 10 долларов за заказ, но PS добавляет дополнительные расходы по количеству продуктов, поэтому, если вы заказываете 20 продуктов, то просят 200 долларов вместо 10 …
Мне нужно переопределить процесс расчета в /classes/Product.php, например:
if (product_id = 44) { $price = $price + 10; }
else { $price = $price }
У тебя есть идеи?
Вы должны создать переопределение класса Product в prestashop. Для этого создайте новый файл в override / classes с именем Product.php и поместите в него этот код:
<?php
class Product extends ProductCore
{
// Here we will put every method or property override
}
В этом классе вы будете копировать / вставлять статический метод priceCalculation
(для меня это строка 2567 оригинального файла Product.php). Когда закончите, просто добавьте эти строки в конце метода, непосредственно перед 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 нужна цена продукта. Поместив этот код в конец этого метода, мы изменим возвращаемую цену.
Код сначала проверяет, зарегистрирован ли клиент (мы не можем получить от него заказы, если он не зарегистрирован). Если это так, запрос возвращает количество раз, когда этот клиент покупал этот продукт в прошлом. Это число умножается на десять, и значение добавляется к цене.
РЕДАКТИРОВАТЬ: Если, как сказал Кирилл Турист, вы также хотите посчитать текущую корзину, получите этот новый код (еще не проверенный, но должен работать):
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» идентификатора продукта в константе, переменной конфигурации или в чем-либо другом, но не хранить его в таком коде. Я сделал это только для примера.
Других решений пока нет …