Magento如果客户购买某些产品,有条款和条件
只有当客户购买某些产品时,我才会显示条款和条件(agreements.phtml)。例如,我们的一些产品需要处方。客户购买其中的一种,我们希望这些条款出现。Magento如果客户购买某些产品,有条款和条件
我已经创造了后端的属性:prescription_required
的伪代码如下:
Loop through products in the basket
if prescription_required == yes
set flag to yes
end if
end loop
如果标志被设置为yes,经过代码agreements.phtml
我我认为我遇到的主要问题是在agreements.phmtl中获取产品信息并在购物篮中循环。
我已经试过
<?php
$_product = Mage::getModel('catalog/product')->load($this->getData('product_id'));
echo $_product->getName();
?>
,但什么都不会返回。
编辑:
我做了一个扩展,它正在做正在尝试实现的东西,并通过Magento Connect发布它。这里是链接:http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603。您可以下载它,或按照以下步骤操作。链接到扩展源代码位于答案的底部。
编辑END
这些步骤,你必须做出:
- 创建新的产品属性负责显示(或没有) 条款和条件
- 改写负责块在结账页面上显示
- 重写负责检查是否全部重新登录的帮助程序
我假设你不希望创建更复杂的东西比实际需要:quired 的条款和条件的复选框被用户
假设和目标点击。如果购物车中至少有一个产品需要条款/条件,或者其中没有任何产品 - 如果购物车中没有任何产品,我会向您解释如何进行扩展,以使所有启用的条款和条件都可以出现。会需要这个。
我还假设我们想把事情做好,并让核心文件单独存在。当然,修改核心功能可能会更容易,但这种方法将来确实会造成麻烦。这就是为什么我们要建立一个新模块。
接下来,我假设所有商店都需要此功能,如果有多个商店的话。
还有最后一件事 - 我在Magento Community Edition 1.7上测试了我的方法。不能保证在其他版本上工作,但我认为它应该在1.6和1.5版本上工作。你可以尝试,如果你在其中的一个版本上工作。我不确定它是否适用于旧版本。
创建新的属性:
这是出了问题的范围,但它是最好的,如果:
- 属性是一个是/否的选择,因为我们没有需要什么更多
- 属性是系统属性,因此我们没有将它添加到每一个属性组
中当然,根据您的需要,您可以通过其他方式创建属性。
在我的情况下,产品属性的代码是conditional_agreements
。此代码在下面的代码片段中使用。
重写块
我们不得不重新改写块是Mage_Checkout_Block_Agreements
。它只有一个功能 - getAgreements()
。
首先是重写。我的包被称为bartoszgorski
和我的模块是conditionalagreements
,所以我在3210代码:
<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.12。它并没有导致我的网站崩溃,但它似乎也没有做任何事情。当我将“启用条款和条件”设置为“是”时,会显示它。当我将它设置为no时,它不显示它。无论属性“conditional_agreements”设置为什么都无关紧要。感谢您长时间的回应,并再次对您回复。 – user1694820
我得到它的工作......这是我的错误。代码运行良好,解释非常有帮助和深入。 – user1694820
GitHub copy已测试并确认可在Magento 1.9.2.4中使用 - 只需修改是由于课程重写中的冲突(因为网站上已安装其他扩展) – Meogi
假设选项的文本字段,你可以做这样的:
// 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
}
让我知道,如果它的工作...
问候
他说$ _product-> getName()没有返回任何内容。这意味着他不知道如何获得产品的对象,这绝对是主要问题 – ivantedja
我更新了我的答案... – user1638055
您希望在购物车页面,结账页面或其他地方显示这些条款和条件? –
是$ this-> getData('product_id')的设置吗?也就是说,如果你回应那么显示什么? –
你仍然没有选择任何答案作为接受的答案。他们没有一个满意吗? –