Я слушаю событие 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. Не только его имя, но и цена. Как я мог это сделать?
cart
event-observer
custom-options
user1638055
источник
источник
Ответы:
catalog_product_type_prepare_full_options
Вместо этого вы можете написать наблюдателя для события , которое является последним событием в процессе добавления в корзину до фактического добавления продукта в корзину и после подготовки пользовательских параметров.В обозревателе доступны следующие параметры:
transport->options
это массив в формеoption_id => option_value
. Внимание, транспорт сам по себе являетсяstdClass
объектом, а не экземпляромVarien_Object
, как вы могли ожидать. Таким образом, нет методов получения и установкиtransport->options
.buy_request: объект buyRequest, вы можете прочитать его здесь и по-прежнему изменять его. Это
Varien_Object
, среди прочего, содержит:options: Массив пользовательских параметров в форме:
Так что ваш наблюдатель может выглядеть так:
Первая часть (изменение
$transport
) имеет отношение к фактическому изменению значения параметра OPTION_A_ID. Вторая часть (изменение$buyRequest
) является необязательной, она просто удалит все следы значения, выбранного клиентом, и, если он переупорядочит заказ, будет немедленно выбрано новое значение, поскольку запрос на покупку «исполняется» с измененными параметрами. Вы должны решить, если вы этого хотите.источник
Если вы настроили свой атрибут с помощью кода, то есть с помощью сценария установки - вы найдете свой атрибут в виде столбца под
sales_flat_quote_item
.Если он есть, то, имея доступ к переменной $ item, вы сможете использовать магические методы, относящиеся к вашему атрибуту:
Если это так, то вы сможете упростить код следующим образом:
Как уже упоминалось, это решение будет относиться только к тем атрибутам элемента цитаты, которые установлены программно.
источник