如何在结账时限制特定产品的特定位置

时间:2015-12-17 06:55:26

标签: magento checkout restriction

我想仅为德里地区销售一些产品,剩下的产品将在印度各地销售。因此,如何限制产品在结账页面以外的其他位置,例如,我想在德里出售蛋糕,所以如果有人继续结账蛋糕产品和客户放置其他位置而不是delhi ncr所以我如何限制该客户下订单..请帮忙

1 个答案:

答案 0 :(得分:1)

您可以使用事件观察器来完成此任务。这将允许您在尝试浏览结帐时检查客户购物车。

可能有用的事件是checkout_controller_onepage_save_shipping_method。 有许多事件你可以听,但这似乎对这个问题非常安全。 该事件发生在客户保存其运输方法之后。现在您知道他们想要运送到哪里了。有了这些知识,您就可以检查客户购物车,验证是否可以继续或暂停进度并将其重定向到自定义页面。另一个选项是CMS页面,以显示他们无法继续的原因 最后,最后一个选项是在该点抛出一个异常并让错误消息描述为什么它们无法继续。 我会设计这个更复杂但是为了让你了解事件观察者,我会尽量保持这个简单。 以下是完成此任务所需的步骤:

  1. 为您关注限制运输的产品设置属性集的属性,我们可以在结帐时检查购物车时使用该属性。可能像:delhi_only。我会将它设为是/否产品属性并在前端可见
  2. 在我们的模块中创建事件观察者。我喜欢在预期模块中保留相关内容,因此我们将创建一个名为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>
    
  3. / app / local中的
  4. 我们将创建一个名为Gallup的文件夹

  5. 在app / code / local / Gallup内部,我们需要一个带有config.xml的etc文件夹

    <?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>
    
  6. 现在在app / code / local / Gallup / Checkout / Helper / Data.php中创建空白助手 class Gallup_Checkout_Helper_Data extends Mage_Checkout_Helper_Data{ }

  7. 最后你的观察者类app / code / local / Gallup / Checkout / Model / Observer.php

        class Gallup_Checkout_Model_Observer{
            /** 
            * @param Varien_Event_Observer $observer
            */
            public function checkoutControllerOnepageSaveShippingMethod( Varien_Event_Observer $observer ){
                // use a private function so we can do other things in this same event observer if needed in the future
                $this->_checkoutControllerOnepageSaveShippingMethod( $observer );
            } 
    
    
        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;
            }
        }
    

    以下是一些可能有用的屏幕截图 设置自定义“产品”属性 enter image description here

  8. 现在是自定义产品属性的标签 enter image description here

    不要忘记将此新产品属性分配给属性集。

    现在编辑属于此属性集的产品和我们的新产品属性 enter image description here

    现在,我们可以测试前端体验 在结账时,一旦该地址被保存并且我们拥有进行最终验证所需的所有信息,即可以继续或停止它们并将它们返回购物车并显示错误: enter image description here

    我们在购物车中找到一个停止结帐的商品,并将其带回购物车并显示错误消息 enter image description here