Magento如果客户购买某些产品,则有条款和条件

时间:2012-09-24 15:15:02

标签: magento conditional-statements

我希望仅在客户购买某些产品时才显示条款和条件(agreements.phtml)。例如,我们的一些产品需要处方。客户购买其中一个,我们希望这些条款出现。

我在后端创建了一个属性:prescription_required

psuedo代码如下:

Loop through products in the basket
    if prescription_required == yes
        set flag to yes
    end if
end loop

如果flag设置为yes,请通过agreements.phtml中的代码

我认为我遇到的主要问题是在agreement.phmtl中获取产品信息并循环播放。

我试过了

<?php 
    $_product = Mage::getModel('catalog/product')->load($this->getData('product_id'));
    echo $_product->getName();
?> 

但没有任何回报。

2 个答案:

答案 0 :(得分:7)

修改

我制作了一个扩展程序,正在完成你想要实现的目标并通过Magento Connect发布它。这是链接:http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603。您可以下载它,或按照以下步骤操作。链接到扩展源代码的链接位于答案的底部。

END OF EDIT

这些是您必须采取的步骤:

  1. 创建负责显示(或不显示)的新产品属性 条款和条件
  2. 重写负责显示这些条款和条件的块 在结帐页面
  3. 重写负责检查所有必需的助手 条款和条件复选框由用户点击
  4. 假设和目标:

    我认为你不想创造比实际需要更复杂的东西。如果购物车中至少有一个产品需要条款/条件,或者没有产品 - 如果购物车中没有产品,我将向您解释如何制作一个扩展,以使所有已启用的条款和条件出现需要这个。

    我还假设我们想要做正确的事情并保留核心文件。当然,修改核心功能可能更容易,但这种方法将来会引起麻烦。这就是我们制作新模块的原因。

    接下来我假设所有商店都需要此功能,如果有多个商店。

    最后一件事 - 我在Magento Community Edition 1.7上测试了我的方法。它不能保证在其他版本上工作,但我认为它应该适用于1.6和1.5。如果您使用其中一个版本,可以尝试。我不确定它是否适用于旧版本。

    创建新属性

    这超出了问题的范围,但最好是:

    • 该属性是Yes / No选项,因为我们不需要任何其他内容
    • 该属性是系统属性,因此我们不必将其添加到每个属性组

    当然,根据您的需要,您可以通过其他方式创建属性。

    就我而言,product属性被赋予了代码conditional_agreements。此代码用于下面的代码段。

    重写块

    我们必须重写的块是Mage_Checkout_Block_Agreements。它只有一个函数 - getAgreements()

    首先要做的是重写。我的包名为bartoszgorski,我的模块为conditionalagreements,因此config.xml中的代码为:

    <config>
        <!-- other code -->
        <global>
            <!-- other code -->
            <blocks>
                <checkout>
                    <rewrite>
                        <agreements>Bartoszgorski_Conditionalagreements_Block_Agreements</agreements>
                    </rewrite>
                </checkout>
            </blocks>
            <!-- other code -->
        </global>
    </config>
    

    在文件本身中,我只是使用帮助器(稍后解释)来检查,如果我们想要显示任何条款和条件。我的代码如下所示:

    public function getAgreements() {
        if(Mage::helper('conditionalagreements')->checkIfQuoteRequiresAgreements() == true) {
            return parent::getAgreements();
        } else {
            return array();
        }
    }
    

    所以,如果要显示某些内容,我们就可以显示它。否则,function会返回空array个协议。

    重写帮助者:

    我们必须重写的helperMage_Checkout_Helper_Data。如果helper没有被重写,Magento将不会显示任何条款/条件,但仍然需要用户检查他们的复选框 - 这当然是不可能的。所以,我在config.xml中的代码是:

    <config>
        <!-- other code -->
        <global>
            <!-- other code -->
            <helpers>
                <conditionalagreements>
                    <class>Bartoszgorski_Conditionalagreements_Helper</class>
                </conditionalagreements>
                <checkout>
                    <rewrite>
                        <data>Bartoszgorski_Conditionalagreements_Helper_Data</data>
                    </rewrite>
                </checkout>
            </helpers>
            <!-- other code -->
        </global>
    </config>
    

    helper中,有一个函数getRequiredAgreementIds()负责获取必须同意的每个条款和条件。我们想要完全相同,但前提是购物车中至少有一种产品需要它。这就是为什么我建议创建另一个辅助函数(在我的情况下为checkIfQuoteRequiresAgreements()),它检查这些产品并在getRequiredAgreementIds()中使用它(以及block中也是如此,如前所示)。因此,重写helper应具有以下功能:

    public function getRequiredAgreementIds()
    {
        if($this->checkIfQuoteRequiresAgreements() == true) {
            if (is_null($this->_agreements)) {
                if (!Mage::getStoreConfigFlag('checkout/options/enable_agreements')) {
                    $this->_agreements = array();
                } else {
                    $this->_agreements = Mage::getModel('checkout/agreement')->getCollection()
                        ->addStoreFilter(Mage::app()->getStore()->getId())
                        ->addFieldToFilter('is_active', 1)
                        ->getAllIds();
                }
            }
            return $this->_agreements;
        } else {
            return array();
        }
    }
    
    public function checkIfQuoteRequiresAgreements() {
        $showAgreements = false;
        $quote = Mage::getSingleton('checkout/session')->getQuote();
        foreach ($quote->getAllVisibleItems() as $quoteItem) {
            $product = Mage::getModel('catalog/product')->load($quoteItem->getProductId()); 
            if($product->getConditionalAgreements() == 1) {
                $showAgreements = true;
                break;
            }
        }
        return $showAgreements;
    }
    

    就是这样。这样做之后,你应该拥有你想要的东西。请记住,如果您在条款和条件中有多个项目,则只能显示所有项目或不显示任何项目。当然,您可以根据我的代码片段开发更多内容 - 这取决于您。

    这是我的全功能模块:

    https://github.com/bgorski/conditionalagreements

    您可以预览我在那里所做的事情,或者只是下载并在您的网站上使用。

    希望有所帮助。任何反馈都会非常感激。

答案 1 :(得分:0)

假设该选项是文本字段,您可以这样做:

// get your cart object
$quote = Mage::getSingleton('checkout/session')->getQuote();

foreach ($quote->getItems() as $item) {
    $productId = $item->getProductId();
    $product = Mage::getModel('catalog/product')->load($productId); 
    $prescriptionRequired = $product->getAttributeText('prescription_required');

    // code for subscription handling goes here

}

让我知道它是否有效......

此致