Estoy trabajando en crear una opción personalizada para mis productos automáticamente cada vez que se crea un producto. Lo que tengo hasta ahora es un observador que dispara el catalog_product_save_before
evento y ejecuta el siguiente código:
//check that we haven't made the option already
$options = $product->getProductOptions();
foreach ($options as $option) {
if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
//we've already added the option
return;
}
}
$options[] = array(
'title' => $product->getDateLabel(),
'type' => 'date_time',
'is_require' => 1,
'sort_order' => 0,
'is_delete' => '',
'previous_type' => '',
'previous_group' => '',
'price' => '0.00',
'price_type' => 'fixed',
'sku' => ''
);
$product->setProductOptions($options);
$product->setCanSaveCustomOptions(true);
//this line doesnt make sense here, but it works ... kinda
$product->save();
Si dejo la entrada $product->save()
, termino con 2 opciones personalizadas que se crean, a pesar de que compruebo para verificar la segunda vez que se activa el evento, la declaración de devolución se llama en el bucle foreach.
Si lo saco. No se crean opciones personalizadas.
¿Alguien puede decirme qué estoy haciendo mal?
Estoy trabajando con Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
fuente
fuente
Respuestas:
Hasta que encuentre el problema exacto aquí está la solución. En
catalog_product_save_before
su lugar, use el eventocatalog_product_prepare_save
. La desventaja de esto es que elprepare_save
evento se envía solo cuando se guarda un producto desde la interfaz de administración o la API. Entonces, si está guardando desde un código personalizado, esto no se activará a menos que lo active manualmente.Tengo el presentimiento de que el problema tiene algo que ver con el
Mage_Catalog_Model_Product::_beforeSave()
método. Allí hay un procesamiento de las opciones personalizadas.Pero
catalog_product_save_before
se envía después de que se produce este procesamiento, por lo que, aunque se procesan las opciones personalizadas, enMage_Catalog_Model_Product::_beforeSave()
realidad están vacías porque el evento aún no se activó, por lo que no se agregaron.Si mueve la línea
parent::_beforeSave();
en el método que mencioné en la parte superior del método, las opciones se agregan (todavía dos veces, pero se agregan). Publicaré más cuando / si encuentro el problema.[EDITAR] Lo
encontré. De alguna manera estaba justo en las líneas de arriba.
Como dije, el problema es que
catalog_product_save_before
se envía después de que se procesan las opciones personalizadas. Pero es por eso que no funciona.Las opciones personalizadas se guardan en
Mage_Catalog_Model_Product::_afterSave()
este código:Pero
$this->getOptionInstance()
se llena con opciones_beforeSave
cuando la matriz de opciones está vacía en su caso. Por lo tanto ... nada que salvar.Si aún desea utilizar
catalog_product_save_before
el código aquí, debería funcionar.fuente
catalog_product_prepare_save
lugar decatalog_product_save_before
y cómo puedo actualizar la opción si se requiere algún cambio?Acabo de tener el mismo problema, la respuesta de Mario funcionó muy bien. Sin embargo, me llevó algo de tiempo descubrir cómo actualizar una opción personalizada. Con el conocimiento de que $ product-> getOptionInstance () -> addOption () funciona para guardar una opción, y establecer "is_delete" en 1 elimina una opción al guardar, se me ocurrió este código:
Después de eliminar, puede agregar su opción personalizada actualizada con este código:
fuente
Para crear una opción personalizada en magento mientras se guarda el producto, estos son pasos muy fáciles.
Si ya se ha creado una opción personalizada, puede eliminarla siguiendo el código
Gracias
fuente