Vraag Aangepaste prijsberekening in Prestashop


Ik werk aan een Prestashop 1.5.x-website, waar ik een aangepaste prijsberekeningsregel voor een specifiek product moet toevoegen. Mijn doel is om 10 dollar per bestelling toe te voegen, maar PS voegt extra kosten toe aan producthoeveelheid, dus als je 20 producten bestelt, vraag je 200 $ in plaats van 10 ... Ik moet het berekeningsproces in /classes/Product.php overschrijven, met iets als:

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

Heb je enig idee?


12
2018-01-16 17:45


oorsprong


antwoorden:


U moet een override van de klasse Product maken in prestashop. Maak hiervoor een nieuw bestand in override / classes genaamd Product.php en plaats deze code erin:

<?php
class Product extends ProductCore
{
    // Here we will put every method or property override
}

In deze klasse kopieert en plakt u de statische methode priceCalculation (het staat op regel 2567 van het originele Product.php-bestand voor mij). Wanneer u klaar bent, voegt u deze regels toe aan het einde van de methode, net voor de 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;
    }

Ik had niet de tijd om deze te testen, maar ik denk dat dat de manier is om te doen wat je wilt doen.

priceCalculation is de methode die wordt genoemd elke keer dat Prestashop de prijs van een product nodig heeft. Door deze code aan het einde van deze methode te plaatsen, passen we de geretourneerde prijs aan.

De code controleert eerst of de klant is aangemeld (we kunnen geen bestellingen van hem ontvangen als hij dat niet is). Als dit het geval is, haalt een query het aantal keren op dat deze klant dit product in het verleden heeft gekocht. Dit aantal wordt vermenigvuldigd met tien en de waarde wordt toegevoegd aan de prijs.

BEWERK: Als je, zoals Cyril Tourist zei, ook het huidige winkelwagentje wilt tellen, ontvang dan deze nieuwe code (nog steeds niet getest, maar zou moeten werken):

    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;
    }

Ook adviseer ik u om de "44" product-ID op te slaan in een constante configuratievariabele, of iets anders, maar het niet in de code te houden. Ik deed dat alleen voor het voorbeeld.


10
2018-06-13 23:28