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


Add attribute to cart items in Magento, show separate in cart

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

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

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

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

购物车现在应该是:

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

而不是:

  • 产品X 2 件 x€

但是,客户仍然应该能够订购具有相同ID的多个相同产品!所以例如

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

自定义发生在洋红色之外。Magento只有一个带有弹出窗口的链接,然后获取一些ID,然后可以使用PHP附加。它只是存储ID,并且必须能够获得购物车/发票/中每个产品的ID。

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

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

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

    1. https://magento.stackexchange.com/a/1382我不太确定...如何获取 ID,该 ID 可在观察者内部的商品详细信息页面上找到...

    2. 如何将每个产品作为新商品添加到购物车中也许除了 1 之外,我还需要修改它。或 2.?

如果Magento专家能为我阐明这一点,我将不胜感激!

您说您可以负责将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>   

在模块文件夹中,创建或打开公司/模块/模型/观察者.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>

并将此功能添加到公司/模块/模型/观察者.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);
}

}