Magento - Цитировать / заказывать товарный атрибут на основе пользовательского ввода - PullRequest
63 голосов
/ 23 февраля 2012

Сводка

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

Подробности

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

Мои вопросы

  1. Как проверить и в конечном итоге сохранить значение из <input> встраница внешнего продукта для элемента цитаты, когда продукт добавлен в корзину, а затем в процессе оформления заказа для элемента заказа?
  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 ]

140 голосов
/ 29 февраля 2012

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-файлах.

Добавлена ​​поддержка для переупорядочений

Чтобы перенести оприоны в новый порядок во время переупорядочения, вам необходимо позаботиться о том, чтобы скопировать их.Вот одна возможность, используя событие 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).

11 голосов
/ 29 февраля 2012

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

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

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

1 голос
/ 22 марта 2017

Мое решение в 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...