Изменение пользовательских параметров товара при добавлении его в корзину?

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 для этого элемента. Поэтому, когда корзина закончит загрузку, она должна иметь значение 4 для myOptionA. Не только его имя, но и цена. Как я мог это сделать?

user1638055
источник
CMIIW, этот цикл дает вам доступные значения, а не выбранное. Чтобы получить действительную пользовательскую опцию, которая была установлена, выполните синтаксический анализ $ array_sku = explode ('-', $ item-> getSku ()); Очевидно, что первым является SKU фактического продукта $ sku = reset ($ array_sku); Пока нет решения, чтобы получить данные.
nicolallias
Ключевой бит, на который я смотрю, - это возможность установить цену стоимости опциона. Я смотрел на это в течение последних нескольких дней, и я не вижу очевидного способа установить цену значения. Похоже, что элемент цитаты должен быть удален, а затем перестроен из запроса.
pspahn

Ответы:

8

catalog_product_type_prepare_full_optionsВместо этого вы можете написать наблюдателя для события , которое является последним событием в процессе добавления в корзину до фактического добавления продукта в корзину и после подготовки пользовательских параметров.

В обозревателе доступны следующие параметры:

  • транспорт: Транспортный объект для всех пользовательских параметров, так что вы можете изменить его в обозревателе. transport->optionsэто массив в форме option_id => option_value. Внимание, транспорт сам по себе является stdClassобъектом, а не экземпляром Varien_Object, как вы могли ожидать. Таким образом, нет методов получения и установки transport->options.
  • продукт: продукт, который будет преобразован в элемент цитаты позже.
  • buy_request: объект buyRequest, вы можете прочитать его здесь и по-прежнему изменять его. Это Varien_Object, среди прочего, содержит:

    • product: идентификатор продукта
    • options: Массив пользовательских параметров в форме:

      option_id => value

Источник и дополнительная информация: info_buyRequest ссылка

Так что ваш наблюдатель может выглядеть так:

$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 для аналогичной цели.
Бартош Кубицкий
это не работает в 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();
}

Как уже упоминалось, это решение будет относиться только к тем атрибутам элемента цитаты, которые установлены программно.

Дэн Ханли
источник