4

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

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

伪代码如下:

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

如果 flag 设置为 yes,则通过协议.phtml 中的代码

我认为我遇到的主要问题是在协议.phmtl 中获取产品信息并遍历篮子。

我试过了

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

但什么都没有返回。

4

2 回答 2

7

编辑:

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

编辑结束

这些是您必须执行的步骤:

  1. 创建负责显示(或不显示)条款和条件的新产品属性
  2. 重写负责在结帐页面上显示这些条款和条件的块
  3. 重写负责检查所有必需的条款和条件复选框是否被用户单击的助手

假设和目标:

我假设您不想创建比实际需要更复杂的东西。我将向您解释如何进行扩展,如果购物车中至少有一种产品需要条款/条件,或者没有任何产品 - 如果购物车中没有产品需要这个。

我还假设我们想把事情做对,不理会核心文件。当然,只修改核心功能可能会更容易,但这种做法将来确实会造成麻烦。这就是我们制作新模块的原因。

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

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

创建新属性:

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

  • 该属性是一个是/否选项,因为我们不再需要任何东西
  • 该属性是系统属性,因此我们不必将其添加到每个属性组

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

在我的例子中,产品属性被赋予了一个 code 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的协议。

重写助手:

helper我们要重写的是Mage_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

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

希望有帮助。任何反馈将不胜感激。

于 2012-09-26T23:12:50.927 回答
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

}

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

问候

于 2012-09-24T15:24:20.717 回答