Bạn phải tạo ghi đè lớp Sản phẩm trong prestashop. Để làm như vậy, tạo một file mới trong override/classes gọi Product.php và đặt mã này trong đó:
<?php
class Product extends ProductCore
{
// Here we will put every method or property override
}
Trong lớp học này, bạn sẽ sao chép/dán các phương pháp tĩnh priceCalculation
(đó là tại dòng 2567 của gốc Tệp Product.php cho tôi). Khi hoàn tất, chỉ cần thêm những dòng này vào cuối của phương pháp này, ngay trước khi 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;
}
Tôi không có thời gian để kiểm tra này, nhưng tôi nghĩ rằng đó là cách để làm những gì bạn muốn làm.
priceCalculation
là phương pháp được gọi mỗi khi Prestashop cần giá của sản phẩm. Bằng cách đặt mã này vào cuối phương thức này, chúng tôi sửa đổi giá đã trả về.
Mã trước tiên sẽ kiểm tra xem khách hàng có đăng nhập hay không (chúng tôi không thể nhận đơn đặt hàng từ anh ấy nếu anh ấy không nhận được). Nếu có, truy vấn sẽ truy lục số lần khách hàng này đã mua sản phẩm này trong quá khứ. Con số này được nhân với mười và giá trị được thêm vào giá.
EDIT: Nếu, như Cyril du lịch cho biết, bạn muốn cũng đếm giỏ hàng hiện tại, lấy mã mới này (vẫn chưa được thử nghiệm, nhưng nên làm việc):
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;
}
Ngoài ra, tôi khuyên bạn để lưu trữ ID sản phẩm "44" trong biến cố định, cấu hình hoặc bất kỳ thứ gì, nhưng không giữ nó trong mã như thế. Tôi đã làm điều đó chỉ cho ví dụ.
Tôi thực sự đang cố giải quyết vấn đề như vậy. những gì tôi đã học được atm là cách phổ biến nhất để làm điều đó là ghi đè lên một số hàm giá trong lớp product.php, nhưng tôi cố gắng tìm ra hàm WHICH để ghi đè. –
@Nolwennig thực sự, 'else' là vô dụng. – sitilge
@Fabio trước hết, nên (nếu nó không phải là hằng số) là '$ product_id', thứ hai' $ product_id = 44' luôn là 'true' và' {$ price = $ price + 10; } 'luôn được thực hiện, thứ ba là câu lệnh' else' là vô ích. Các * chính xác * cú pháp sẽ có nhiều smth như 'if ($ product_id == 44) {$ price + = 10}' – sitilge