Ответ 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
).