【问题标题】:Magento: limit 3 products from category per orderMagento:每个订单限制类别中的 3 个产品
【发布时间】:2013-03-11 18:13:35
【问题描述】:

我正在尝试在 Magento 中设置样品产品类别,以允许人们每次购买最多选择 3 个免费样品,但我如何限制每个订单只能从该类别中选择 3 个样品?

[编辑]

这是目录 app/code/local/MagePal/LimitCartProductByCategory/etc/config.xml 中的当前 config.xml:

<?xml version="1.0"?>
<config>
<modules>
    <MagePal_LimitCartProductByCategory>
        <version>1.0.1</version>
    </MagePal_LimitCartProductByCategory>
</modules>

<global>
    <models>
        <limitcartproductbycategory>
            <class>MagePal_LimitCartProductByCategory_Model_Observer</class>
        </limitcartproductbycategory>
    </models>
     <events>
        <checkout_cart_product_add_after>
            <observers>
                <limitcartproductbycategory>
                    <type>singleton</type>
                    <class>MagePal_LimitCartProductByCategory_Model_Observer</class>
                    <method>cartlimit</method>
                </limitcartproductbycategory>
            </observers>
        </checkout_cart_product_add_after>
    </events>
</global>
</config>

目录 app/etc/modules/MagePal_LimitCartProductByCategory.xml 中的 MagePal_EnableDuplicateProductStatus.xml:

<?xml version="1.0"?>
<config>
<modules>
    <MagePal_LimitCartProductByCategory>
        <active>true</active>
        <codePool>local</codePool>
    </MagePal_LimitCartProductByCategory>
</modules>
</config>

这是目录 app/code/local/MagePal/LimitCartProductByCategory/Model/Observer.php 中的当前 Observer.php:

class MagePal_LimitCartProductByCategory_Model_Observer 
{

public function cartlimit(Varien_Event_Observer  $observer)
{
    $category_ids = array();

    $quote = Mage::getSingleton('checkout/session')->getQuote();
    foreach($quote->getAllVisibleItems() as $item){
          $product = Mage::getModel('catalog/product')->load($item->getId());
          $product_category_ids = explode(",", $product->getCategoryIds());
          //$product_category_ids = $product->getCategoryIds();

          array_push($category_ids, $product_category_ids);
    }

    $justAdded = $observer->getQuoteItem();
    $justAddedCategoryIds = explode(",", $product->getCategoryIds());
    $justAddedId = in_array(58, $justAddedCategoryIds);


    $productJustAdded = Mage::getModel('catalog/product')->load($justAdded->getId());

    //total the catalogegory id in $category_ids
    //if $productJustAdded->getCategoryIds exist in $category_ids, 
    //then check to see if category id count greater than 3
    // if true then add error msg and try setting the qty to 0

    $freesample = 58;
    $tmp = array_count_values($category_ids);
    $cnt = $tmp[$freesample];

    echo $cnt;

    if ($justAddedId == true && $cnt > 3) {

        $quote->removeItem($justAdded->getId())->save();
        Mage::app()->getLayout()->getMessagesBlock()->setMessages('You can only have 3 free samples. Please remove a sample to add another.');
        Mage::app()->getLayout()->getMessagesBlock()->getGroupedHtml();
    }

    return $this;
}
}

【问题讨论】:

    标签: magento


    【解决方案1】:

    为事件checkout_cart_product_add_after创建一个观察者

    查看我的示例 @Change Magento default status for duplicated products 以获取有关如何在观察者上创建的帮助

         <events>
            <checkout_cart_product_add_after>
                <observers>
                    <enableduplicateproductstatus>
                        <type>singleton</type>
                        <class>limitcartproductbycategory/observer</class>
                        <method>cartlimit</method>
                    </enableduplicateproductstatus>
                </observers>
            </checkout_cart_product_add_after>
        </events>
    

    创建:app/code/local/MagePal/LimitCartProductByCategory/Model/Observer.php

    class MagePal_LimitCartProductByCategory_Model_Observer 
    {
    
        public function cartlimit(Varien_Event_Observer  $observer)
        {
            $category_ids = array();
    
            $quote = Mage::getSingleton('checkout/session')->getQuote();
            foreach($quote->getAllVisibleItems() as $item){
                  $product = Mage::getModel('catalog/product')->load($item->getId());
                  $product_category_ids = explode(",", $product->getCategoryIds());
                  //$product_category_ids = $product->getCategoryIds();
    
                  array_push($category_ids, $product_category_ids);
            }
    
            $justAdded = $observer->getQuoteItem();
    
    
            $productJustAdded = Mage::getModel('catalog/product')->load($justAdded->getId());
    
            //total the category id in $category_ids
            //if $productJustAdded->getCategoryIds exist in $category_ids, 
            //then check to see if category id count greater than 3
            // if true then add error msg and try setting the qty to 0
    
            return $this;
        }
    }
    

    【讨论】:

    • 我是否缺少某些东西,因为我添加了这两个文件以及我的代码,但我仍然没有得到响应。我对观察不太熟悉,但从我读过的内容和你的其他帖子来看,我的一切都在正确的位置。 app>code>local>MagePal>LimitCartProductByCategory @R.S
    • 文件应该在app/code/local/MagePal/LimitCartProductByCategory/*而不是app/code/local/LimitCartProductByCategory/*
    • 对不起,我把它们放在那个目录中,我只是忘记在编辑中添加 MagePal
    • 问题是您使用了两个不同的模块名称 应该等于 app/code/local/CompanyName/ModuleName/*。所以 , MagePal/LimitCartProductByCategory 不正确。应该是 ,MagePal/LimitCartProductByCategory。 (替换所有的'enableduplicateproductstatus'和'EnableDuplicateProductStatus'需要替换成对应的case)
    • 我进行了这些更改,刷新了缓存,但仍然没有看到更改。感谢@R.S到目前为止的帮助,我只是想学习这个。我在编辑中反映了所有内容。
    【解决方案2】:

    您应该编写一个观察者来观察购物车并检查是否只放入了 3 个样本。

    这里是一个例子

            <checkout_cart_product_add_after>
                <observers>
                    <tibdev_fancybox_cart_observer>
                        <type>singleton</type>
                        <class>Tibdev_Fancybox_Model_Cart_Observer</class>
                        <method>applyFancybox</method>
                    </tibdev_fancybox_cart_observer>
                </observers>
            </checkout_cart_product_add_after>
    

    在这里你可以看到我的观察者观察事件 checkout_cart_product_add_after。

    【讨论】:

    • 很抱歉,我对此并不熟悉。我将如何使用它以及它的位置?
    • 您是开发人员吗?看看 Alan Storms 教程网站。如果您不是开发人员,可以联系我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多