Estou trabalhando para criar uma opção personalizada para meus produtos automaticamente sempre que um produto for criado. O que eu tenho até agora é um observador que dispara no catalog_product_save_before
evento e executa o seguinte 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();
Se eu deixar o $product->save()
in, termino com duas opções personalizadas sendo criadas, mesmo que eu tenha verificado se a segunda vez que o evento dispara, a declaração de retorno é chamada no loop foreach.
Se eu tirar. Nenhuma opção personalizada é criada.
Alguém pode me dizer o que estou fazendo de errado?
Eu estou trabalhando com Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
fonte
fonte
Respostas:
Até encontrar o problema exato, aqui está a solução. Em vez disso,
catalog_product_save_before
use o eventocatalog_product_prepare_save
. A desvantagem disso é que oprepare_save
evento é despachado apenas ao salvar um produto da interface administrativa ou da API. Portanto, se você estiver salvando de um código personalizado, isso não será acionado, a menos que você seja acionado manualmente.Eu tenho um palpite de que o problema tem algo a ver com o
Mage_Catalog_Model_Product::_beforeSave()
método. Existe algum processamento das opções personalizadas.Mas
catalog_product_save_before
é despachado depois que esse processamento ocorre, portanto, enquanto as opções personalizadas são processadas,Mage_Catalog_Model_Product::_beforeSave()
elas estão realmente vazias porque o evento ainda não foi acionado e, portanto, não foram adicionadas.Se você mover a linha
parent::_beforeSave();
no método que mencionei na parte superior do método, as opções serão adicionadas (ainda duas vezes, mas são adicionadas). Vou postar mais quando / se encontrar o problema.[EDIT]
Encontrei. De alguma forma, eu estava certo nas falas acima.
Como eu disse, o problema é que
catalog_product_save_before
é despachado após o processamento das opções personalizadas. mas é por isso que não funciona.As opções personalizadas são salvas
Mage_Catalog_Model_Product::_afterSave()
neste código:Mas
$this->getOptionInstance()
é preenchido com opções_beforeSave
quando a matriz de opções está vazia no seu caso. Portanto ... nada para salvar.Se você ainda deseja usar,
catalog_product_save_before
aqui está o código que deve funcionar.fonte
catalog_product_prepare_save
vez decatalog_product_save_before
e como posso atualizar a opção, se houver alguma alteração necessária.Eu apenas tive o mesmo problema, a resposta de marius funcionou muito bem. Levei algum tempo para descobrir como atualizar uma opção personalizada. Com o conhecimento de que $ product-> getOptionInstance () -> addOption () trabalha para salvar uma opção, e definir "is_delete" como 1 remove uma opção para salvar, vim com esse código:
Após a exclusão, você pode adicionar sua opção personalizada atualizada com este código:
fonte
Para criar uma opção personalizada no magento ao salvar o produto, essas são etapas muito fáceis.
Se já houver uma opção personalizada criada, você poderá excluí-la seguindo o código
obrigado
fonte