【问题标题】:Add attribute to cart items in Magento, show separate in cart将属性添加到 Magento 中的购物车项目,在购物车中单独显示
【发布时间】:2014-12-17 18:04:53
【问题描述】:

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

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

另外,由于产品是定制的,如果这个id不同,同一个产品应该在购物车和发票中单独一行!

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

购物车现在应该是:

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

而不是:

  • ProductX 2 件 x€

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

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

自定义发生在 magento 之外。 Magento 只是有一个带有弹出窗口的链接,然后获取一些可以使用 PHP 附加的 ID。 它只存储 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. 之外我还需要修改这个?

如果 Magento 专家能为我提供一些启示,我将不胜感激!

【问题讨论】:

  • 客户可以使用弹出窗口吗?换句话说:是您的客户通过选择某些东西来设置外部 ID 吗?如果是的话,也许你想要的可以通过“自定义选项”实现更多的开箱即用。
  • 不,外部 ID 标识一个复杂的设计,并为每个设计随机生成!没有设计具有相同的 ID,永远!每个 ID 都是唯一的!
  • 是的,但这是客户选择所要求的设计,不是吗?
  • 他正在图形编辑器中创建设计

标签: php magento customization shopping-cart


【解决方案1】:

您说过您可以将 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);
}

}

【讨论】:

  • 请注意,即使这个解决方案非常好,如果客户在他的购物车中编辑产品,你会发现自己有麻烦。然后,您将遗憾地失去添加到报价单中的自定义属性。
  • 如果用户更新购物车中的多个它将保存数据,如果他们单击以在其页面上编辑产品,听起来 ID 无论如何都应该更改,因为它与用户选择的规范相关,所以我认为无论如何它都需要改变。
  • 效果很好。当用户从购物车打开一个产品页面时,id 是一个 url 参数,因此他会返回到那个确切的产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多