У меня есть наблюдатель, который добавляет динамические настраиваемые параметры на страницу сведений о продукте, которая вызывается для catalog_controller_product_view
события. Это позволяет клиенту выбрать из выпадающего списка существующих кодов лицензии.
public function addLicenseOptions(Varien_Event_Observer $observer) {
$product = $observer->getEvent()->getProduct();
if ($product->isSubscriptionProduct()) {
$optionModel = Mage::getModel('catalog/product_option')
->setTitle('License Code')
->setProductId($product->getId())
->setStoreId($product->getStoreId())
->setId('license_code')
->setType('drop_down')
->setPrice(null)
->setPriceType(null)
->setIsRequire(true);
$customer = Mage::getSingleton('customer/session')->getCustomer();
if ($customer->getId()) {
$linksPurchased = Mage::getResourceModel('downloadable/link_purchased_collection')
->addFieldToFilter('customer_id', $customer->getId());
if ($linksPurchased->count() > 0) {
foreach ($linksPurchased as $linkPurchased) {
$valueModel = Mage::getModel('catalog/product_option_value')
->setTitle($linkPurchased->getData('key_code'))
->setProduct($product)
->setOption($optionModel)
->setId($linkPurchased->getData('license_code'))
->setPrice(null)
->setPriceType('fixed')
->setSku(null);
$optionModel->addValue($valueModel);
}
$product->setHasOptions(1);
$product->addOption($optionModel);
}
}
}
}
Но когда я размещаю заказ, выбранные параметры сохраняются только в info_buyRequest
. Есть ли способ заставить его сохранить, как если бы это была опция продукта, созданная в админке?
Привязывая к ответу Мариуса, вот что я придумал:
У меня есть собственный контроллер, который обрабатывает конфигурацию пользовательского типа продукта. Этот контроллер добавляет
additional_options
во время добавления в корзину.В наблюдателе за событием
sales_convert_quote_item_to_order_item
я затем хватаюadditional_options
и устанавливаю в качестве параметров позиции заказа:При использовании
additional_options
вам не нужно беспокоиться о различных блоках / шаблонах, отображающих параметры (хотя вы можете предпочесть измененный формат), так как эти блоки будут вызывать$options['additional_options']
См. Здесьисточник