Пользовательские параметры сохраняются только в котировке как идентификаторы параметров и их значения. Каждый раз, когда параметры отображаются, они в основном перезагружаются из базы данных.
Если вы измените значения, вам нужно будет их сохранить, и это установит их для всех.
Это говорит о том, что я обойду проблему, добавив дополнительную настраиваемую опцию с измененным значением «на лету», используя наблюдателя событий. Для этого я использую дополнительные опции.
Затем я удаляю оригинальную пользовательскую опцию из позиции котировки.
До 1.4 Magento позаботился об остальном, но с этого момента вам необходимо скопировать дополнительные параметры в элемент заказа вручную, а также нужно позаботиться о том, чтобы он снова был установлен, если предмет переупорядочен.
Итак, вот пример конфигурации наблюдателя.
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>checkoutCartProductAddAfter</method>
</customoptions>
</observers>
</checkout_cart_product_add_after>
<sales_convert_quote_item_to_order_item>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</customoptions>
</observers>
</sales_convert_quote_item_to_order_item>
</events>
</frontend>
остальное обрабатывается в классе наблюдателя.
/**
* Add additional options to order item product options (this is missing in the core)
*
* @param Varien_Event_Observer $observer
*/
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);
}
}
/**
* Manipulate the custom product options
*
* @param Varien_Event_Observer $observer
* @return void
*/
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$item = $observer->getQuoteItem();
$infoArr = array();
if ($info = $item->getProduct()->getCustomOption('info_buyRequest')) {
$infoArr = unserialize($info->getValue());
}
// Set additional options in case of a reorder
if ($infoArr && isset($infoArr['additional_options'])) {
// An additional options array is set on the buy request - this is a reorder
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($infoArr['additional_options'])
));
return;
}
$options = Mage::helper('catalog/product_configuration')->getCustomOptions($item);
foreach ($options as $option)
{
// The only way to identify a custom option without
// hardcoding ID's is the label :-(
// But manipulating options this way is hackish anyway
if ('Size' === $option['label'])
{
$optId = $option['option_id'];
// Add replacement custom option with modified value
$additionalOptions = array(array(
'code' => 'my_code',
'label' => $option['label'],
'value' => $option['value'] . ' YOUR EXTRA TEXT',
'print_value' => $option['print_value'] . ' YOUR EXTRA TEXT',
));
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($additionalOptions),
));
// Update info_buyRequest to reflect changes
if ($infoArr &&
isset($infoArr['options']) &&
isset($infoArr['options'][$optId]))
{
// Remove real custom option
unset($infoArr['options'][$optId]);
// Add replacement additional option for reorder (see above)
$infoArr['additional_options'] = $additionalOptions;
$info->setValue(serialize($infoArr));
$item->addOption($info);
}
// Remove real custom option id from option_ids list
if ($optionIdsOption = $item->getProduct()->getCustomOption('option_ids')) {
$optionIds = explode(',', $optionIdsOption->getValue());
if (false !== ($idx = array_search($optId, $optionIds))) {
unset($optionIds[$idx]);
$optionIdsOption->setValue(implode(',', $optionIds));
$item->addOption($optionIdsOption);
}
}
// Remove real custom option
$item->removeOption('option_' . $optId);
}
}
Это он в двух словах. Добавьте проверку ошибок и позаботьтесь о специальных случаях, например, при необходимости добавьте один и тот же продукт в корзину.
Надеюсь, вам придётся работать с пользовательскими параметрами продукта. Не наполовину плохо, когда вы знакомы с ними.
спасают вас эти дополнительные данные каким-то образом? Когда вы проверяете Admin для заказа, появляются ли пояса, сундук, длина и т. Д.? – seanbreeden
Извините, если бы я не был достаточно ясен. Я просто показываю эту информацию, если javascript жестко закодирован в файле phtml. например, если (val == small), то покажите Waist 30, Chest 36, Length 42 ... Теперь я хочу добавить эту дополнительную информацию в заказ, чтобы она хранилась для каждого элемента. – Farrukh