编辑:
我做了一个扩展,正是你想要实现的,并通过 Magento Connect 发布了它。这是链接: http: //www.magentocommerce.com/magento-connect/catalog/product/view/id/14603。您可以下载它,或按照以下步骤操作。扩展源代码的链接位于答案的底部。
编辑结束
这些是您必须执行的步骤:
- 创建负责显示(或不显示)条款和条件的新产品属性
- 重写负责在结帐页面上显示这些条款和条件的块
- 重写负责检查所有必需的条款和条件复选框是否被用户单击的助手
假设和目标:
我假设您不想创建比实际需要更复杂的东西。我将向您解释如何进行扩展,如果购物车中至少有一种产品需要条款/条件,或者没有任何产品 - 如果购物车中没有产品需要这个。
我还假设我们想把事情做对,不理会核心文件。当然,只修改核心功能可能会更容易,但这种做法将来确实会造成麻烦。这就是我们制作新模块的原因。
接下来我假设所有商店都需要此功能,如果有多个商店的话。
最后一件事——我在 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
你可以预览我在那里所做的,或者只是下载它并在你的网站上使用。
希望有帮助。任何反馈将不胜感激。