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




2 Answers

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

manage attributes

Резюме

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

Детали

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




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



Related

php magento

Tags

php   magento