我正在尝试为该magento(1.9.1)商店中的特定产品(可配置产品)实现仅卡支付选项。我使用的代码的问题是,我需要转到每个简单的产品并更新属性值才能生效。我想知道的是,如果我可以对代码进行更改,那么无论简单产品使用什么值,都可以使用父产品的值,而不是使用简单产品的值。所以我只需要更新可配置的产品,说这个产品是不是只有卡。
此模块的My Observer.php
<?php
class JMAWD_CardOnly_Model_Observer
{
public function cardOnly(Varien_Event_Observer $observer)
{
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$cardonly = false;
foreach (Mage::getSingleton('checkout/cart')->getQuote()->getAllVisibleItems() as $item)
{
if($item->getProduct()->getCardOnly()){
$cardonly = true;
}
}
if($method->getCode() == "cashondelivery" && $cardonly){
$result->isAvailable = false;
}
}
}
我的这个模块的config.xml
<?xml version="1.0"?>
<config>
<modules>
<JMAWD_CardOnly>
<version>0.1.0</version>
</JMAWD_CardOnly>
</modules>
<global>
<events>
<payment_method_is_active>
<observers>
<card_only>
<type>singleton</type>
<class>cardonly/observer</class>
<method>cardOnly</method>
</card_only>
</observers>
</payment_method_is_active>
</events>
<models>
<cardonly>
<class>JMAWD_CardOnly_Model</class>
<resourceModel>cardonly_mysql4</resourceModel>
</cardonly>
</models>
<sales>
<quote>
<item>
<product_attributes>
<card_only/>
</product_attributes>
</item>
</quote>
</sales>
</global>
</config>
帮助&感谢您的建议。感谢
如果您的报价中有可配置的子项,您可以获取可配置的父项并检查card_only属性。这样你就不需要关心那些简单的孩子了。
类似这样的东西:
$quoteItemsCollection = Mage::getSingleton('checkout/cart')->getQuote()->getItemsCollection();
foreach ($quoteItemsCollection as $quoteItem) {
$productType = $quoteItem->getProductType();
// if productType is config and getCardOnly(), then $cardonly = true;
getAllVisibleItems()
不应该发生这种情况。如本答案所述:
加载项目集合,然后返回未标记为已删除且没有父项的所有项目的数组(即,您获得的是捆绑和可配置产品的项目,而不是其关联的子项)。每个数组项目对应于购物车页面中显示的一行。
我怀疑您使用的是类似"简单可配置产品"或"更好可配置的产品"这样的扩展,它会更改可配置产品类型,以便显示和使用简单产品的属性(尤其是价格),而购物车中的产品实际上只是没有父级的简单产品。
如果是这种情况,您必须检查扩展的代码,以了解它在哪里以及如何存储有关可配置产品的信息。您也可以查看sales_flat_quote_item_option
表,因为它通常存储有关报价项的所有附加信息。