prestashop中的自定义价格计算

时间:2015-01-16 17:45:22

标签: php e-commerce prestashop prestashop-1.5

我正在使用Prestashop 1.5.x网站,我需要为特定产品添加自定义价格计算规则。 我的目标是每个订单增加10美元,但PS会增加产品数量的额外成本,所以如果你订购20个产品,它会问你200美元而不是10美元...... 我需要覆盖/classes/Product.php中的计算过程,例如:

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

你有什么想法吗?

1 个答案:

答案 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存储在常量,配置变量或任何内容中,但不要将其保存在代码中。我只是为了这个例子。