Las opciones personalizadas solo se almacenan en el presupuesto como ID y valores de la opción. Cada vez que se representan las opciones, básicamente se vuelven a cargar desde la base de datos.
Si modifica los valores, deberá guardarlos y eso los establecerá para todos.
Dicho esto, soluciono el problema añadiendo una opción personalizada adicional con el valor modificado sobre la marcha, utilizando un observador de eventos. Para esto utilizo opciones adicionales.
Luego elimino la opción personalizada original del elemento de cita.
Hasta 1.4 Magento se encargó del resto, pero desde entonces debe copiar las opciones adicionales a la posición de pedido manualmente, y también debe tener cuidado de que se establezca nuevamente si se reordena un artículo.
Aquí hay una configuración de ejemplo de observador.
<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>
El resto se maneja en la clase observador.
/**
* 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);
}
}
Esto es en pocas palabras. Agregue la comprobación de errores y se encargue de casos especiales, como volver a agregar el mismo producto al carrito según sea necesario.
Espero que esto comience a trabajar con opciones personalizadas de productos. No está nada mal una vez que te hayas familiarizado con ellos.
¿Está ahorrando estos datos adicionales de alguna manera? Cuando comprueba la administración para el pedido, ¿aparece la cintura, el cofre, la longitud, etc.? – seanbreeden
Lo siento, si no hubiera sido lo suficientemente claro. Solo muestro esta información si JavaScript está codificado en un archivo phtml. por ejemplo, si (val == small) luego muestra Waist 30, Chest 36, Length 42 ... Ahora quiero agregar esta información adicional al pedido para que se almacene para cada artículo. – Farrukh