Как изменить атрибут продукта с помощью PHP во время оформления корзины в Magento?

У меня есть вопрос из двух частей о настройке моего магазина Magento.

Когда кто-то покупает загружаемый продукт, я хочу сгенерировать лицензионный код и включить его в счет.

Я добавил атрибут продукта под названием «license_code» в набор атрибутов моего продукта по умолчанию, и я хочу установить его значение с помощью php, когда клиент оформляет заказ.

Какое событие позволит мне получить доступ к продуктам в корзине сразу после их покупки, но до создания счета?

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

Спасибо за помощь!


person brushyfork23    schedule 11.03.2011    source источник


Ответы (2)


Возможные события: sales_order_place_before или sales_convert_quote_*.

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

function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
    $orderItem = $observer->getOrderItem();
    $options = $orderItem->getProductOptions();
    $options['licence_code'] = YOUR-DOWNLOADABLE-CODE-HERE;
    $orderItem->setProductOptions($options);
}

Получение кода позже — это, по сути, тот же процесс с getProductOptions(), объекты элементов заказа уже используются на страницах просмотра заказов, поэтому их легко найти и использовать в вашей теме.

person clockworkgeek    schedule 12.03.2011
comment
Спасибо. Это действительно полезно и, вероятно, то, что мне нужно, чтобы сохранить параметры продукта. Однако теперь я застрял, пытаясь получить предметы от этого наблюдателя. Я добавил наблюдатель событий для «sales_order_place_before», но не могу понять, какую функцию использовать для получения массива элементов из $observer. - person brushyfork23; 15.03.2011
comment
Я имел в виду, что событие будет sales_convert_quote_item_to_order_item, но теперь я вижу, что у вас есть ответ. Поздравляем. Для каждого действия всегда есть несколько событий, так что есть из чего выбрать. - person clockworkgeek; 15.03.2011

Хорошо, я думаю, я понял это.

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

<events>
    <sales_order_item_save_before>
        <observers>
            <downloadable_observer>
                <class>Licensing_Catalog_Model_Observer</class>
                <method>generate_licenses</method>
            </downloadable_observer>
        </observers>
    </sales_order_item_save_before>
</events>

а затем моя функция наблюдения как:

public function generate_licenses($observer)
{
    $orderItem = $observer->getEvent()->getItem();
    $options = $orderItem->getProductOptions();
    $options['licence_code'] = 'YOUR-DOWNLOADABLE-CODE-HERE';
    $orderItem->setProductOptions($options);

  return $this;
}

Большое спасибо за помощь, часовщик!

person brushyfork23    schedule 14.03.2011
comment
Исправление: событие sales_order_item_save_before - person brushyfork23; 16.03.2011
comment
В текущей версии Magento поддерживаются следующие события: - person nithin alex; 14.11.2011