Я проверяю транспортные кавычки во время события checkout_controller_onepage_save_shipping_method, и если проверка не удалась, я хочу отправить пользователя обратно на выбор метода доставки, но я также хотел бы показать сообщение о том, почему он не прошел. Есть ли у 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.