2017-09-14 45 views
7

Stworzyłem nową tabelę w Magento 2, do przechowywania własnych promorul, teraz utworzyłem obserwatora na wydarzenie controller_action_predispatch_checkout_cart_couponPost i wewnątrz tego obserwatora chcę sprawdzić, czy użytkownik wprowadził dowolną regułę niestandardową zastosuj zniżkę zgodnie z tą zasadą.Zastosuj niestandardową regułę promo za pomocą obserwatora w Magento 2

Poniżej jest mój kod:

<?php 
namespace Webkul\Grid\Observer; 

use Magento\Framework\Event\ObserverInterface; 

class coupenAppliedAfter implements ObserverInterface 
{ 
    /** 
    * @var ObjectManagerInterface 
    */ 
    protected $_objectManager; 

    /** 
    * @param \Magento\Framework\ObjectManagerInterface $objectManager 
    */ 
    public function __construct(
     \Magento\Framework\ObjectManagerInterface $objectManager 
    ) { 
     $this->_objectManager = $objectManager; 
    } 

    /** 
    * customer register event handler 
    * 
    * @param \Magento\Framework\Event\Observer $observer 
    * @return void 
    */ 
    public function execute(\Magento\Framework\Event\Observer $observer) 
    { 
     // get enetered coupen code 
     $controller = $observer->getControllerAction(); 
     $couponCode = $controller->getRequest()->getParam('coupon_code'); 

     $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
     $connection = $objectManager->get('Magento\Framework\App\ResourceConnection')->getConnection('\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION'); 
     // get list of coupon codes from that custom table 
     $all_custom_codes = $connection->fetchAll("SELECT * FROM custom_promotion_rules"); 

     foreach($all_custom_codes as $code) { 
      $db_coupen_code = $code['code']; 
      // matching if user has entered any custom code 
      if($couponCode == $db_coupen_code) { 
       // if yes trying to apply custom discount 
       $DiscountAmount = $code['discount_amount']; 
       $result = $observer->getEvent()->getResult(); 
       $result->setAmount($DiscountAmount); 
       $result->setBaseAmount($DiscountAmount); 
      } 
     } 

    } 
} 

ale powyższy kod nie działa i daje błąd Fatal error: Uncaught Error: Call to a member function setAmount() on null

Proszę zaproponować rozwiązanie tego problemu.

+0

Co produkuje var_dump ($ result)? – TheRealJAG

Odpowiedz

0

Wynik $ jest zerowy. Czy próbujesz uruchomić tę funkcję ręcznie? Jeśli tak, to może być twój problem, ponieważ $ obserwator będzie pusty lub zerowy.

Mogłabym również przenieść inicjalizację wyniku $ powyżej instrukcji foreach.