2015-01-16 69 views
12

我正在使用Prestashop 1.5.x網站,我需要爲特定產品添加自定義價格計算規則。 我的目標是每個訂單添加10美元,但是PS會增加產品數量的額外成本,所以如果您訂購了20個產品,它會要求您200美元而不是10 ... 我需要覆蓋/ classes/Product中的計算過程.php,類似於:prestashop中的自定義價格計算

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

你有什麼想法嗎?

+1

我實際上試圖解決這樣的問題。 我所學到的atm最常見的方法是重寫product.php類中的一些價格函數,但我試圖弄清楚哪個函數可以覆蓋。 –

+2

@Nolwennig其實,'else'沒用。 – sitilge

+1

@Fabio首先,它應該(如果它不是常量)是'$ product_id',其次'$ product_id = 44'總是'true'和'{$ price = $ price + 10; }'總是被執行,第三,'else'語句沒用。 * correct *語法會更像'if($ product_id == 44){$ price + = 10}' – sitilge

回答

10

您必須在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需要產品價格的方法。通過將此代碼放在此方法的末尾,我們修改了返回的價格。

代碼首先檢查客戶是否已登錄(如果他不是,我們不能從他那裏得到訂單)。如果是這樣,查詢將檢索此客戶過去購買此產品的次數。該數字乘以10,並將該值加到價格中。

編輯:如果像西里爾遊客說,你要也算目前的車,得到這個新的代碼(還沒有測試,但應工作):

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存儲在一個常量,配置變量或任何內容中,但不保存在代碼中。我只是爲了這個例子。

+2

從我對這個問題的理解中,他想要一個靜態的10 $訂購該特定產品。所以應該在購物車級別的某處「操縱」它。就像$ totalProductCost =($ productPrice * $ productQuantity)+ 10 $ –

+1

我編輯了我的答案,以考慮添加購物車。謝謝你提醒我這件事。 –

+0

謝謝你 – quardas