我希望仅在客户购买某些产品时才显示条款和条件(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();
?>
但没有任何回报。
答案 0 :(得分:7)
修改强>
我制作了一个扩展程序,正在完成你想要实现的目标并通过Magento Connect发布它。这是链接:http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603。您可以下载它,或按照以下步骤操作。链接到扩展源代码的链接位于答案的底部。
END OF EDIT
这些是您必须采取的步骤:
假设和目标:
我认为你不想创造比实际需要更复杂的东西。如果购物车中至少有一个产品需要条款/条件,或者没有产品 - 如果购物车中没有产品,我将向您解释如何制作一个扩展,以使所有已启用的条款和条件出现需要这个。
我还假设我们想要做正确的事情并保留核心文件。当然,修改核心功能可能更容易,但这种方法将来会引起麻烦。这就是我们制作新模块的原因。
接下来我假设所有商店都需要此功能,如果有多个商店。
最后一件事 - 我在Magento Community Edition 1.7上测试了我的方法。它不能保证在其他版本上工作,但我认为它应该适用于1.6和1.5。如果您使用其中一个版本,可以尝试。我不确定它是否适用于旧版本。
创建新属性
这超出了问题的范围,但最好是:
当然,根据您的需要,您可以通过其他方式创建属性。
就我而言,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
个协议。
重写帮助者:
我们必须重写的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
您可以预览我在那里所做的事情,或者只是下载并在您的网站上使用。
希望有所帮助。任何反馈都会非常感激。
答案 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
}
让我知道它是否有效......
此致