Intereting Posts

Каков правильный способ остановить проверку от наблюдателя событий в Magento?

Я проверяю транспортные кавычки во время события checkout_controller_onepage_save_shipping_method, и если проверка не удалась, я хочу отправить пользователя обратно на выбор метода доставки, но я также хотел бы показать сообщение о том, почему он не прошел. Есть ли у Magento способ сделать это?

Я уже проверяю данные, мне просто не хватает переадресации на методы доставки и способ отображения сообщения.

Solutions Collecting From Web of "Каков правильный способ остановить проверку от наблюдателя событий в Magento?"

Ответ Алана Шторма, как всегда, информативный и просветительский. Но в этой ситуации одностраничная проверка – это в основном AJAX, который игнорирует сообщение об ошибке сеанса, вы не увидите его, пока не оставите страницу проверки.

В saveShippingMethodAction имеется следующая строка:

 $result = $this->getOnepage()->saveShippingMethod($data); 

… а затем $ result – это кодирование JSON. Если вы переопределите Mage_Checkout_Model_Type_Onepage::saveShippingMethod для выполнения проверки, а затем верните возвращаемое сообщение, вы можете вставить сообщение об ошибке, которое будет возвращено в браузер и показано пользователю во всплывающем окне.

Ваше переопределение может выглядеть примерно так:

 public function saveShippingMethod($shippingMethod) { if ($this->doesntApplyHere()) { return array('error' => -1, 'message' => $this->_helper->__('Explain the problem here.')); } return parent::saveShippingMethod($shippingMethod); } 

(Ни один из них не проверен кодом, но концепции должны получить вас там, где вам нужно идти)

Magento – это проект, управляемый группой инженеров-программистов. Когда вы работаете с группой инженеров-программистов, документация – это код.

т.е. всякий раз, когда вам нужно что-то делать с Magento, обратите внимание на то, как это сделала основная команда, принимая во внимание, что вы должны ограничивать себя наблюдателями, переопределениями и новым кодом, поскольку вы не можете обсуждать свои изменения с основной командой.

Взгляните на метод IndexAction контроллера контрольной IndexAction на одну страницу

 app/code/core/Mage/Checkout/controllers/OnepageController.php public function indexAction() { if (!Mage::helper('checkout')->canOnepageCheckout()) { Mage::getSingleton('checkout/session')->addError($this->__('The onepage checkout is disabled.')); $this->_redirect('checkout/cart'); return; } ... 

Magento позволяет добавлять ошибки к объекту сеанса, который будет обрабатываться блоком обмена сообщениями при следующем запросе.

 Mage::getSingleton('checkout/session')->addError($this->__('The onepage checkout is disabled.')); 

То, что обрабатывает ошибку. Далее, есть перенаправление. Это происходит здесь

 $this->_redirect('checkout/cart'); 

Поскольку вы вызываете этот код у наблюдателя, у вас не будет доступа к этому методу. Однако, если вы проверите контроллер

 /** * Retrieve request object * * @return Mage_Core_Controller_Request_Http */ public function getRequest() { return $this->_request; } ... protected function _redirect($path, $arguments=array()) { $this->getResponse()->setRedirect(Mage::getUrl($path, $arguments)); return $this; } 

Вы можете увидеть его использование объекта ответа. Magento использует глобальный объект ответа (аналогичный Zend и другим веб-фреймворкам) для обработки того, что отправляется обратно в браузер (т. Е. Перенаправлять заголовки). Вы можете получить ссылку на один и тот же объект через

 Mage::app()->getResponse() 

и может выполнять перенаправление с чем-то вроде

 Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart')); 

Для этого я придумал другой подход, не требуя переопределения контроллера. В основном я делаю то же самое, но только в методах наблюдателей. Поэтому я использую checkout_controller_onepage_save_shipping_method для проверки методов доставки, а также, если есть ошибка, я добавляю эту ошибку в переменную сеанса, как показано ниже

  $error = array('error' => -1, 'message' => Mage::helper('core')->__("Message here")); Mage::getSingleton('checkout/session')->setSavedMethodError($error); 

Затем вы можете для каждого действия применить другого наблюдателя к 'controller_action_postdispatch_'.$this->getFullActionName()

Поэтому я использовал это для наблюдения controller_action_postdispatch_checkout_onepage_saveShippingMethod. В котором я проверяю переменную ошибки сеанса и устанавливаю тело ответа, если он существует.

 $error = Mage::getSingleton('checkout/session')->getSavedMethodError(); if($error){ Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode($error)); } Mage::getSingleton('checkout/session')->setSavedMethodError(false); 

Я не уверен, что это лучше или хуже, поэтому, пожалуйста, оставьте какие-либо комментарии, но я знаю, что я предпочел сделать это, не переписывая класс.

Это работает, потому что вы переопределяете тело ответа, которое было установлено в действии saveShippingMethod.