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(); 
?> 

,但什么都不会返回。

+0

您希望在购物车页面,结账页面或其他地方显示这些条款和条件? –

+0

是$ this-> getData('product_id')的设置吗?也就是说,如果你回应那么显示什么? –

+0

你仍然没有选择任何答案作为接受的答案。他们没有一个满意吗? –

编辑:

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

编辑END

这些步骤,你必须做出:

  1. 创建新的产品属性负责显示(或没有) 条款和条件
  2. 改写负责块在结账页面上显示
  3. 重写负责检查是否全部重新登录的帮助程序

    我假设你不希望创建更复杂的东西比实际需要: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

您可以预览我做了什么还是只下载并在网站上使用。

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

+0

对不起,我现在刚刚回到这个。有一个大手术来处理,它从我的雷达。我尝试下载扩展名,并导致我的网站崩溃,所以我从您的网站一点一点地复制了代码。我正在运行企业1.12。它并没有导致我的网站崩溃,但它似乎也没有做任何事情。当我将“启用条款和条件”设置为“是”时,会显示它。当我将它设置为no时,它不显示它。无论属性“conditional_agreements”设置为什么都无关紧要。感谢您长时间的回应,并再次对您回复。 – user1694820

+0

我得到它的工作......这是我的错误。代码运行良好,解释非常有帮助和深入。 – user1694820

+0

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 

} 

让我知道,如果它的工作...

问候

+0

他说$ _product-> getName()没有返回任何内容。这意味着他不知道如何获得产品的对象,这绝对是主要问题 – ivantedja

+0

我更新了我的答案... – user1638055