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

Резюме

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

Подробнее

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

Мои вопросы

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

Обновление 1

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

Ответ 1

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 additional_options).

Ответ 2

В элементе Quote можно добавить настраиваемые поля. Как добавить настраиваемые поля для позиций заказа в в Magento для начала. Я недавно использовал эту инструкцию, чтобы добавить настраиваемые поля в пункт Quote Magento, и концепция прекрасна, но в этой статье есть несколько практических примеров, которые невелики. Вещи, которые я буду делать по-другому:

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

Как правило, лучше избегать модификации ядра Magento и применять ваши настройки через модуль, поскольку это упрощает/улучшает возможности обновления в будущем. Если вы еще не создали собственное расширение до moduleCreator, вы можете сгенерировать необходимый шаблон.

Ответ 3

Мое решение в 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')