将属性添加到Magento中的购物车项目,在购物车中单独显示

时间:2014-12-17 18:04:53

标签: php magento customization shopping-cart

我找到了很多问题的答案,但有些是矛盾的,而且很多都不完全清楚,所以我希望Magento专家可以指出我正确的方向。

对于Magento中的某些产品,有一个复杂的定制过程。有一个自定义编辑器,每个“设计”都由一个唯一值标识。 我需要的是将此ID与产品一起存储在购物车和订单中。它不应该直接显示,而是可以在代码中访问(例如,在购物车中显示不同的缩略图或发票上的某些信息)。

此外,由于产品是定制的,如果此ID不同,同一产品应在购物车和发票中有单独的行!

例如,客户打开产品页面,进行一些自定义,此自定义获得ID“1”。 客户将其放入购物车。 他再次打开相同的产品,以不同的方式定制它,并获得id“2”。 客户也将其放入购物车!

购物车现在应该是:

  • ProductX [使用id 1代码生成的自定义文本] 1件x€
  • ProductX [使用ID 2的代码生成的自定义文本] 1件x€

和NOT:

  • ProductX 2件x€

但客户仍然可以订购多个具有相同ID的相同产品! 所以例如

  • ProductX [使用id 1代码生成的自定义文本] 4件x€
  • ProductX [使用ID 2的代码生成的自定义文本] 2件x€

定制发生在magento之外。 Magento只是有一个弹出窗口的链接,然后获得一些ID,然后可以使用PHP附加。 它只存储ID,并且必须能够获得购物车/发票/...

中每件商品的ID

重要的是,如果ID不同,则存储ID并且具有相同sku /可自定义选项的产品不会合并到购物车中! 此外,ID必须是文本字符串,而不是从与magento自定义选项一样的列表中选择!

方法我发现可能做我想做的事:

  1. http://www.atwix.com/magento/custom-product-attribute-quote-order-item/ 这看起来对我来说是最好的,有一个我可以修改的完成模块。但我不确定这是否是正确的方法。产品是否会在购物车中分开?此外,ID的值在此处设置为Product选项并在后端可见?!在客户根据我的情况定制产品之前没有任何价值!

    1. https://magento.stackexchange.com/a/1382 我不太确定......如何在观察员的内部获得产品详细信息页面上的ID ...

    2. How can I add every product as a new item into cart 也许除了1.或2之外我还需要修改它。?

  2. 如果Magento专家可以为我阐明这一点,我将不胜感激!

1 个答案:

答案 0 :(得分:5)

您说您可以负责将ID添加到产品页面。哪个好。必要时,您需要将值写入产品页面上“添加到购物车”表单中的隐藏输入字段。让我们说输入看起来像这样;

<input type="hidden" name="myid" id="myid" value="123" />

在自定义模块中,添加事件观察器。我假设您在添加到购物车时保留在产品页面上,而不是直接进入购物车。

<catalog_product_load_after>
<observers>
    <Company_Module_Model_Observer>
        <type>model</type>
        <class>Company_Module_Model_Observer</class>
        <method>addPostData</method>
    </Company_Module_Model_Observer>
</observers>
</catalog_product_load_after>   

在您的模块文件夹中,创建或打开Company / Module / Model / Observer.php并创建此功能;

class Company_Module_Model_Observer {


public function addPostData(Varien_Event_Observer $observer) {

      $action = Mage::app()->getFrontController()->getAction();
      if ($action->getFullActionName() == 'checkout_cart_add') {
         if($action->getRequest()->getParam('myid')) {
             // ID IS PRESENT, SO LETS ADD IT
             $item = $observer->getProduct();
             $additionalOptions = array();
             $additionalOptions[] = array(
                'label' => 'The unique ID',
                'value' => $action->getRequest()->getParam('myid')
            );
             $item->addCustomOption('additional_options', serialize($additionalOptions));
         }
      }

   }


}

有了这个,您将在购物车和报价中看到产品的ID,就像值来自超级属性一样。任何唯一ID都将被视为新订单项。

要针对销售订单保存此值,以便在销售电子邮件和后端显示,请添加此观察者;

<sales_convert_quote_item_to_order_item>
<observers>
    <Company_Module_Model_Observer>
        <type>model</type>
        <class>Company_Module_Model_Observer</class>
        <method>salesConvertQuoteItemToOrderItem</method>
    </Company_Module_Model_Observer>
</observers>
</sales_convert_quote_item_to_order_item>

并将此功能添加到Company / Module / Model / Observer.php

public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{


   $quoteItem = $observer->getItem();
   if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
    $orderItem = $observer->getOrderItem();
    $options = $orderItem->getProductOptions();
    $options['additional_options'] = unserialize($additionalOptions->getValue());
    $orderItem->setProductOptions($options);
}

}