Magento-Quote/order Product item атрибут на основе пользовательского ввода


резюме

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

подробности

  • как с Custom Варианты, элемент формы должен быть добавлен на страницу товара интерфейс.
    • в отличие от пользовательские параметры, это не фактический атрибут продукта. Он не должен отображаться на страницах продукта администратора или наборах атрибутов.
    • клиент обязан предоставить действительное значение. Мне нужно быть в состоянии сделать проверку на стороне сервера.
    • я хочу иметь .шаблон phtml генерирует свой html. В настоящее время я могу переопределить приложения/дизайн/фронтэнда/базы/по умолчанию/каталог/продукт/вид/тип/по умолчанию.phtml С удовлетворительными результатами (дизайна). Однако я не знаю, как захватить, проверить и в конечном итоге сохранить его значение.
  • значение этого элемента формы должно быть сохранено вместе с товарной позицией предложения / заказа.
    • это значение должно отображаться на всех счетах, заказах, электронных письмах продаж.
    • я хочу управлять выводом с помощью шаблона, или по крайней мере быть возвращать строку, которая используется для отображения значения

мои вопросы

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

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

3 62

3 ответа:

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);
    }
}

С этого момента дополнительные опции будут видны в истории заказов клиентов в интерфейсе и заказ электронной почты, а также в представлении заказа интерфейса администратора, счета-фактуры, отгрузки, creditmemos и PDF-файлы.

добавить поддержку для повторных заказов

для того, чтобы нести oprions за нового порядка в ходе заказа, вы должны заботиться, чтобы скопировать их. Вот одна из возможностей использования 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 for getItemOptions()), или переопределение классов блоков (grep additional_options).

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