Резюме
Я хочу создать атрибут продукта, который не сохраняется в продуктах, или отображается на странице редактирования продукта, как обычные атрибуты продукта. Вместо этого я хочу, чтобы он был сохранен в позиции заказа / котировки и отображался по заказам, счетам и тому подобным. Он также должен быть настроен клиентом в интерфейсе перед добавлением продукта в корзину.
Детали
Мои вопросы
<input>
на странице продукта frontend в элементе котировки, когда продукт добавлен в корзину, а затем в процессе оформления заказа в элемент заказа? Обновление 1
Я обнаружил, что я могу запустить этот код в catalog/product
модели catalog/product
(и, вероятно, sales/quote_item
) во время таких событий, как sales_quote_item_qty_set_after
$infoBuyRequest = $product->getCustomOption('info_buyRequest'); $buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue())); $myData = $buyRequest->getMyData();
Таким образом, я смог получить мои пользовательские данные, предоставленные клиентом, с моего <input>
на странице продукта.
Я подозреваю, что этот info_buyRequest
сохраняется с элементами котировки и заказа. Если это так, это частично разрешило мои проблемы 1 и 2. Однако я до сих пор не знаю, где это подходит для запуска этого кода, и я не знаю, как отображать его на страницах бэкэнда / цитаты / отчета. Кроме того, я считаю, что, поскольку это хранится как сериализованное значение в базе данных, будет очень сложно получить коллекции котировок / заказов на основе моих пользовательских данных.
Magento предоставляет возможность добавления параметров, которые не являются атрибутами продукта или пользовательскими параметрами продукта. Они устанавливаются на товары и котируются с дополнительным кодом additional_options
.
Вам нужно выполнить два шага, каждый из которых может обрабатываться через наблюдателя событий. Если вы хотите, чтобы дополнительные опции выполняли переупорядочение, вам также необходимо будет наблюдать третье событие.
Первым шагом является добавление наблюдателя событий для установки дополнительных параметров загруженного продукта до его добавления в корзину. Один из вариантов – использовать событие catalog_product_load_after
.
<catalog_product_load_after> <observers> <extra_options> <type>model</type> <class>extra_options/observer</class> <method>catalogProductLoadAfter</method> </extra_options> </observers> </catalog_product_load_after>
В случае, если наблюдатель вы можете добавить дополнительные проверки, запрашиваемая страница действительно является дополнением к действию в корзину. Главным моментом этого метода наблюдателя является добавление выбора ваших специальных опций в опцию additional_options
на модели продукта.
public function catalogProductLoadAfter(Varien_Event_Observer $observer) { // set the additional options on the product $action = Mage::app()->getFrontController()->getAction(); if ($action->getFullActionName() == 'checkout_cart_add') { // assuming you are posting your custom form values in an array called extra_options... if ($options = $action->getRequest()->getParam('extra_options')) { $product = $observer->getProduct(); // add to the additional options array $additionalOptions = array(); if ($additionalOption = $product->getCustomOption('additional_options')) { $additionalOptions = (array) unserialize($additionalOption->getValue()); } foreach ($options as $key => $value) { $additionalOptions[] = array( 'label' => $key, 'value' => $value, ); } // add the additional options array with the option code additional_options $observer->getProduct() ->addCustomOption('additional_options', serialize($additionalOptions)); } } }
Дополнительные параметры будут автоматически перемещены из продукта в элемент котировки. При наличии этого наблюдателя ваши варианты появятся в корзине и просмотре проверки.
Чтобы они сохранялись, необходим еще один наблюдатель (только с Magento 1.5).
<sales_convert_quote_item_to_order_item> <observers> <extra_options> <type>model</type> <class>extra_options/observer</class> <method>salesConvertQuoteItemToOrderItem</method> </extra_options> </observers> </sales_convert_quote_item_to_order_item>
Здесь мы перемещаем опцию из позиции котировки в элемент заказа.
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer) { $quoteItem = $observer->getItem(); if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) { $orderItem = $observer->getOrderItem(); $options = $orderItem->getProductOptions(); $options['additional_options'] = unserialize($additionalOptions->getValue()); $orderItem->setProductOptions($options); } }
С этого момента дополнительные параметры будут отображаться в истории заказов клиентов в интерфейсе и электронной почте заказа, а также в представлении заказа интерфейса администратора, счетах-фактурах, отгрузках, кредитах и PDF-файлах.
Чтобы переложить отпечатки на новый порядок во время переупорядочения, вам необходимо позаботиться о том, чтобы скопировать их. Вот одна возможность использования события checkout_cart_product_add_after
.
<checkout_cart_product_add_after> <observers> <extra_options> <type>singleton</type> <class>extra_options/observer</class> <method>checkoutCartProductAddAfter</method> </extra_options> </observers> </checkout_cart_product_add_after>
Разбор дополнительных параметров и создание дополнительного массива опций следует перенести в отдельную функцию, чтобы избежать дублирования кода, но в этом примере я оставил логику для каждого метода на месте для ясности.
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer) { $action = Mage::app()->getFrontController()->getAction(); if ($action->getFullActionName() == 'sales_order_reorder') { $item = $observer->getQuoteItem(); $buyInfo = $item->getBuyRequest(); if ($options = $buyInfo->getExtraOptions()) { $additionalOptions = array(); if ($additionalOption = $item->getOptionByCode('additional_options')) { $additionalOptions = (array) unserialize($additionalOption->getValue()); } foreach ($options as $key => $value) { $additionalOptions[] = array( 'label' => $key, 'value' => $value, ); } $item->addOption(array( 'code' => 'additional_options', 'value' => serialize($additionalOptions) )); } } }
Не существует механизма для перевода этих меток или значений. Вот несколько идей, которые могут быть полезны в этом отношении.
В наблюдателе событий quote_item_load_after получите дополнительный массив параметров и установите $option['print_value'] = $helper->__($option['value']);
, Если значение print_value
установлено, Magento будет использовать это для отображения дисплея.
То же самое можно сделать с элементами заказа.
Нет такой вещи, как print_label
, но вы можете установить собственный индекс (возможно, label_source
) и установить метку «на лету», используя это как источник, например $option['label'] = $helper->__($option['label_source']);
,
Помимо этого вам, вероятно, придется прибегнуть к модификации шаблонов (grep для getItemOptions()
) или переопределению классов блоков (grep getItemOptions()
).
Можно добавить пользовательские поля в элемент Quote. Как добавить пользовательские поля для позиций заказа в Magento для начала работы. Я недавно использовал эту инструкцию, чтобы добавить настраиваемые поля в пункт Quote Magento, и концепция прекрасна, но в этой статье есть несколько практических примеров, которые невелики. Вещи, которые я буду делать по-другому:
Как правило, лучше избегать модификации ядра Magento и применять свои настройки через модуль, поскольку это облегчает или улучшает возможности обновления в будущем. Если вы не создали свое собственное расширение до того, как moduleCreator поможет вам создать необходимый шаблон.
Мое решение в Magento 1.8
Задайте опцию для котировки
$quoteItem = $cart->getQuote()->getItemById($itemId); $quoteItem->addOption(array('label' => 'buymode', 'code' => 'buymode', 'value' => $data['buymode'])); $quoteItem->save();
Доступ к опции QuoteItem
$quoteItem->getOptionByCode('buymode')->getValue();
Возможность передачи в OrderItem
Зарегистрироваться для события sales_convert_quote_item_to_order_item
public function onConvertQuoteItemToOrderItem($observer) { $orderItem = $observer->getOrderItem(); $quoteItem = $observer->getItem(); $options = $orderItem->getProductOptions(); $options['buymode'] = $quoteItem->getOptionByCode('buymode')->getValue(); $orderItem->setProductOptions($options); }
Доступ к опции из OrderItem
$orderItem->getProductOptionByCode('buymode')