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