Magento – атрибут товара / заказа товара / товара на основе ввода пользователем

Резюме

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

Детали

  • Как и в случае с пользовательскими опциями , элемент формы должен быть добавлен на страницу продукта frontend.
    • В отличие от пользовательских параметров, это не фактический атрибут продукта. Он не должен отображаться на страницах продукта или наборов атрибутов администратора.
    • Клиент должен предоставить действительное значение. Мне нужно сделать проверку на стороне сервера.
    • Я хочу создать шаблон .phtml, создающий его html. В настоящее время я могу переопределить приложение / дизайн / frontend / base / default / catalog / product / view / type / default.phtml с удовлетворительными (проектными) результатами. Однако я не знаю, как захватить, подтвердить и в конечном итоге сохранить его ценность.
  • Значение этого элемента формы должно быть сохранено с помощью элемента товара quote / order.
    • Это значение должно отображаться на всех счетах, заказах, электронных почтовых отправлениях.
    • Я хочу управлять выходом с помощью шаблона или, по крайней мере, иметь возможность возвращать строку, которая используется для отображения значения

Мои вопросы

  1. Как проверить и, в конечном итоге, сохранить значение с <input> на странице продукта frontend в элементе котировки, когда продукт добавлен в корзину, а затем в процессе оформления заказа в элемент заказа?
  2. Как отобразить это значение в заказе, счете-фактуре, торговых письмах и таких страницах?
  3. Как я могу отфильтровать коллекцию заказов для извлечения заказов, у которых есть элементы с моим значением, заданным для определенного значения?

Обновление 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. Однако я до сих пор не знаю, где это подходит для запуска этого кода, и я не знаю, как отображать его на страницах бэкэнда / цитаты / отчета. Кроме того, я считаю, что, поскольку это хранится как сериализованное значение в базе данных, будет очень сложно получить коллекции котировок / заказов на основе моих пользовательских данных.

Solutions Collecting From Web of "Magento – атрибут товара / заказа товара / товара на основе ввода пользователем"

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, и концепция прекрасна, но в этой статье есть несколько практических примеров, которые невелики. Вещи, которые я буду делать по-другому:

  1. Используйте сценарий установки, чтобы добавлять поля в базу данных, а не делать это напрямую.
  2. Используйте объект запроса Magento, а не напрямую обращайтесь к $ _REQUEST.
  3. Используйте расширения и переписывайте, а не модифицируйте ядро ​​Magento.
  4. Внесите изменения в config.xml из расширения, а не в изменение ядра.

Как правило, лучше избегать модификации ядра 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')