Как ограничить определенные продукты при оформлении заказа для конкретного местоположения
Я хочу продавать некоторые продукты только в Дели, а остальные продукты будут доступны для всей Индии. Так, как ограничить продукты на странице оформления заказа для другого места, кроме Дели, например, я хочу продавать торты только в Дели, поэтому, если кто-то приступит к оформлению заказа с продуктом для торта, а клиент разместит другое место, кроме Дели, то как я ограничу этого клиента разместить заказ.. Пожалуйста, помогите
1 ответ
Вы можете использовать наблюдателя событий для выполнения этой задачи. Это позволит вам проверить корзину клиентов, когда они пытаются перейти к оформлению заказа.
Событие, которое может быть полезно использовать, - checkout_controller_onepage_save_shipping_method. Есть много событий, которые вы можете прослушать, но это кажется довольно безопасным для этого вопроса. Это событие происходит после того, как клиент сохраняет свой способ доставки. Теперь вы знаете, куда они хотят, чтобы он был отправлен. Обладая этими знаниями, вы можете проверить корзину клиентов, убедиться, что все в порядке, продолжить или приостановить выполнение, и перенаправить их на пользовательскую страницу. Другой вариант - это страница CMS, показывающая причину, по которой они не могут продолжить работу.
Наконец, последний вариант - просто вызвать исключение в этой точке и получить сообщение об ошибке, объясняющее, почему они не могут продолжить работу. Я бы разработал это немного сложнее, но чтобы вы узнали о наблюдателях событий, я постараюсь сделать это как можно более простым. Вот шаги, необходимые для достижения этой цели:
- Создайте атрибут в наборе атрибутов для продуктов, которые вас беспокоят в отношении ограничения доставки, и которые мы можем использовать при проверке корзины во время оформления заказа. Может что-то вроде: delhi_only. Я бы сделал это да / нет атрибутом продукта и видимым на интерфейсе
Создайте наблюдатель событий в нашем модуле. Мне нравится хранить вещи в предполагаемом модуле, поэтому мы создадим модуль под названием Gallup_Checkout. Создайте объявление модуля в app/etc/modules, оно должно выглядеть так:
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Gallup_Checkout> <active>true</active> <codePool>local</codePool> </Gallup_Checkout> </modules> </config>
в app/code/local мы создадим папку с именем Gallup
Внутри app/code/local/Gallup нам понадобится папка etc с config.xml внутри
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Gallup_Checkout> <version>1.0.0</version> </Gallup_Checkout> </modules> <global> <events> <checkout_controller_onepage_save_shipping_method> <observers> <gallup_checkout> <type>singleton</type> <class>gallup_checkout/observer</class> <method>checkoutControllerOnepageSaveShippingMethod</method> </gallup_checkout> </observers> </checkout_controller_onepage_save_shipping_method> </events> <helpers> <gallup_checkout> <class>Gallup_Checkout_Helper</class> </gallup_checkout> </helpers> </global> </config>
Теперь создайте пустой помощник в app/code/local/Gallup/Checkout/Helper/Data.php
class Gallup_Checkout_Helper_Data extends Mage_Checkout_Helper_Data{ }
Наконец ваше приложение класса наблюдателя / code / local / Gallup / Checkout / Model / Observer.php
class Gallup_Checkout_Model_Observer { / ** * @param Varien_Event_Observer $ наблюдатель */ public function checkoutControllerOnepageSaveShippingMethod( Varien_Event_Observer $ наблюдатель){ // используем приватную функцию, чтобы мы могли делать другие вещи в этом же наблюдателе событий, если это потребуется в будущем $this->_checkoutControllerOnepageSaveShippingMethod( $ наблюдатель); }
private function _checkoutControllerOnepageSaveShippingMethod( $observer ){ $quote = $observer->getQuote(); foreach ($quote->getAllItems() as $_item){ $_dehliAddress = $this->_checkDehliShippingAddress($quote); $_checkDehliOnly = $this->_checkDehliOnly($_item->getData('product_id')); /** * Check if this product is dehli only AND the address failed, if so alert the customer */ if ( $_checkDehliOnly && !$_dehliAddress){ $error_message = 'Sorry, we are unable to continue, you have items in your cart that need to be delivered within Dehli'; Mage::getSingleton('core/session')->addError($error_message); Mage::throwException($error_message); } } } /** * @param $product * @return int */ private function _checkDehliOnly($product_id){ $product = Mage::getModel('catalog/product')->load($product_id); // This is saved as a string 0 or 1 so casting it to an int will give us the boolean we are expecting $delhi_only = $product->getData('delhi_only'); return (int)$delhi_only; } /** * Do you logic that determines if we are prohibiting shipping * @param $quote */ private function _checkDehliShippingAddress( $quote ){ // Get the shipping address from the quote $shipping_address = $quote->getShippingAddress(); /** * I would suggest better validation than this but hopefully this will give you an idea on how to proceed. */ $city = trim(strtolower($shipping_address->getData('city'))); // check if the city is dehli and if so return true if(($city == 'dehli')){ // return true so we know its OK to proceed return true; }else{ // This is not a match, return false so we know that its not allowed return false; } }
Вот несколько снимков экрана, которые могут помочь в настройке пользовательского атрибута Product.
Теперь метка для пользовательского атрибута продукта
Не забудьте назначить этот новый атрибут продукта набору атрибутов.
Теперь отредактируйте продукт, который принадлежит этому набору атрибутов и нашему новому атрибуту продукта
Теперь мы можем протестировать интерфейс пользователя. Во время оформления заказа, когда этот адрес сохранен, и у нас есть вся информация, необходимая для окончательной проверки того, что все в порядке, чтобы продолжить или остановить их и вернуть их в корзину с ошибкой:
Мы нашли товар в корзине, который останавливает оформление заказа и возвращает его в корзину с сообщением об ошибке.