将商品添加到购物车时是否修改其自定义选项?


8

我正在侦听sales_quote_save_before事件,以通知何时将商品添加到购物车。一旦触发,我将遍历以下项目选项:

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

如您所见,一旦到达某个选项(示例中为myOptionA),我想更改所选选项。因此,可以说myOptionA是一个下拉列表,它有4个可能的值。如果选择了值1,我想为该项目设置值4。因此,当购物车完成加载时,myOptionA的值应为4。不仅是它的名字,还有它的价格。我该怎么办?


CMIIW,此循环为您提供可用值,而不是所选值。要获取已设置的实际自定义选项,请解析$ array_sku = explode('-',$ item-> getSku());。显然,第一个是实际产品的SKU $ sku = reset($ array_sku); 尚无解决方案来获取数据。
nicolallias

我正在看的关键是能够设置期权价值的价格。最近几天,我一直在关注这一点,但没有发现一种明显的方法来设定价值的价格。似乎报价项目需要删除选项,然后从请求中重建。
pspahn 2014年

Answers:


8

您可以catalog_product_type_prepare_full_options改为为事件编写观察者,这是在实际将产品添加到购物车之前以及准备好自定义选项之后,添加到购物车流程中的最后一个事件。

在观察器中,您可以使用以下参数:

  • 运输:运输所有自定义选项的对象,因此您可以在观察器中更改条件。transport->options是形式为的数组option_id => option_value。注意,传输本身是一个stdClass对象,而不是Varien_Object您所期望的实例。因此,没有针对的getter和setter方法transport->options
  • 产品:稍后将转换为报价项目的产品。
  • buy_request: buyRequest对象,您可以在此处阅读并仍然对其进行修改。它Varien_Object包含以下内容:

    • 产品:产品编号
    • options:以下形式的自定义选项数组:

      option_id => value

来源和更多信息: info_buy请求参考

因此,您的观察者可能看起来像这样:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

第一部分(更改$transport)与实际更改选项OPTION_A_ID的值有关。第二部分(更改$buyRequest)是可选的,它将仅删除客户选择的值的所有痕迹,如果他重新订购该订单,则将立即选择新值,因为购买请求已通过更改后的参数“执行”。您必须决定是否要这样做。


出于类似目的,同一事件可用于magento 2。
Bartosz Kubicki

它在magento2中不起作用
Magento2 Devloper

0

如果您已通过代码(例如,使用安装脚本)设置了属性,则会在的列中找到属性sales_flat_quote_item

如果存在,则可以访问$ item变量,您应该能够使用与属性有关的魔术方法:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

如果是这种情况,那么您应该能够如下简化代码:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

如前所述,该解决方案仅适用于以编程方式设置的报价项目属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.