Индивидуальный расчет цены в prestashop

Я работаю над сайтом Prestashop 1.5.x, где мне нужно добавить собственное правило расчета цены для определенного продукта. Моя цель - добавить 10 долларов за заказ, но PS добавляет дополнительную стоимость по количеству товара, поэтому, если вы закажете 20 продуктов, то попросите 200 долларов вместо 10... Мне нужно переопределить процесс вычисления в /classes/Product.php с чем-то вроде:

if (product_id = 44) { $price = $price + 10; }
else { $price = $price }

У вас есть идея?

Ответ 1

Вам необходимо создать переопределение класса Product в prestashop. Для этого создайте новый файл в переопределении/классах под названием 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 требуется цена продукта. Поместив этот код в конце этого метода, мы изменим возвращаемую цену.

Сначала код проверяет, зарегистрирован ли клиент (мы не можем получить от него заказы, если нет). Если это так, запрос получает количество раз, которое этот клиент купил этот продукт в прошлом. Это число умножается на десять, а значение добавляется к цене.

EDIT: Если, как сказал Кирилл Турист, вы хотите также подсчитать текущую корзину, получить этот новый код (все еще не проверенный, но должен работать):

    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 в константе, переменной конфигурации или что-то в этом роде, но не хранить ее в коде. Я сделал это только для примера.