2015-01-16 2 views
12

저는 Prestashop 1.5.x 웹 사이트에서 특정 제품에 대한 사용자 정의 가격 계산 규칙을 ​​추가해야합니다. 내 목표는 주문 당 10 달러를 추가하는 것입니다.하지만 PS는 제품 수량에 따라 추가 비용을 추가합니다. 따라서 20 개 제품을 주문하면 10 대신 200 $를 부탁합니다 ... /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' 문은 쓸모가 없다. * 올바른 * 문법은'$ ($ product_id == 44) {$ price + = 10}'와 같은 것입니다. – sitilge

답변

10

prestashop에서 Product 클래스의 재정의를 만들어야합니다. 이렇게하려면 Product.php라는 재정/클래스에 새로운 파일을 생성하고이 코드를 넣어 :

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

를이 클래스, 당신은 복사/priceCalculation (이것은 원래의 라인 2567에서의 정적 메소드를 붙여 넣에서 나를위한 Product.php 파일).

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

내가 이것들을 테스트 할 시간이 없었다,하지만 난 그게 당신이 원하는 일을 할 수있는 방법이라고 생각 : 완료되면 바로 바로 self::$_prices[$cache_id] = $price; 전에, 방법의 끝에 다음 줄을 추가합니다.

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 $ 특정 제품에 대한 주문. 따라서 Cart 클래스 수준의 어딘가에서 "조작"되어야합니다. 뭔가 같은 $ totalProductCost = ($ productPrice * $ productQuantity) + 10 $ –

+1

나는 나의 대답을 고려하여 장바구니를 추가했습니다. 이것에 대해 저에게 상기시켜 주셔서 감사합니다. –

+0

감사합니다. – quardas