2015-01-16 62 views
12

Tôi đang làm việc trên trang web Prestashop 1.5.x, nơi tôi cần thêm quy tắc tính giá tùy chỉnh cho một sản phẩm cụ thể. Mục tiêu của tôi là thêm 10 đô la cho mỗi đơn đặt hàng, nhưng PS bổ sung thêm chi phí theo số lượng sản phẩm, vì vậy nếu bạn đặt hàng 20 sản phẩm, bạn sẽ yêu cầu 200 đô la thay vì 10 ... Tôi cần ghi đè quá trình tính toán trong/lớp/Sản phẩm .php, với một cái gì đó như:Tính toán giá tùy chỉnh trong prestashop

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

Bạn có ý tưởng gì không?

+1

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 đè. –

+2

@Nolwennig thực sự, 'else' là vô dụng. – sitilge

+1

@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

Trả lời

10

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ụ.

+2

Từ sự hiểu biết của tôi về câu hỏi, anh ta muốn một tĩnh 10 $ cho mỗi đặt hàng cho sản phẩm cụ thể đó. Vì vậy, nó nên được "thao túng" ở đâu đó trên cấp lớp Cart. Một cái gì đó như $ totalProductCost = ($ productPrice * $ productQuantity) + 10 $ –

+1

Tôi đã chỉnh sửa câu trả lời của mình để thêm giỏ hàng vào xem xét. Cảm ơn bạn đã nhắc tôi về điều này. –

+0

Cảm ơn vì điều này – quardas

Các vấn đề liên quan