Je travaille sur la création automatique d'une option personnalisée pour mes produits chaque fois qu'un produit est créé. Ce que j'ai jusqu'à présent, c'est un observateur qui se déclenche sur l' catalog_product_save_before
événement et exécute le code suivant:
//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 je laisse l' $product->save()
entrée, je termine avec la création de 2 options personnalisées, même si j'ai vérifié pour vérifier la deuxième fois que l'événement se déclenche, l'instruction de retour est appelée dans la boucle foreach.
Si je le retire. Aucune option personnalisée n'est créée.
Quelqu'un peut-il me dire ce que je fais mal?
Je travaille avec Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
la source
la source
Réponses:
Jusqu'à ce que je trouve le problème exact, voici la solution.
catalog_product_save_before
Utilisez plutôt l'événementcatalog_product_prepare_save
. L'inconvénient est que l'prepare_save
événement n'est distribué que lors de l'enregistrement d'un produit à partir de l'interface d'administration ou de l'API. Donc, si vous enregistrez à partir d'un code personnalisé, cela ne se déclenchera que si vous le déclenchez manuellement.J'ai le pressentiment que le problème a quelque chose à voir avec la
Mage_Catalog_Model_Product::_beforeSave()
méthode. Il y a un certain traitement des options personnalisées.Mais
catalog_product_save_before
est distribué après que ce traitement se soit produit. Ainsi, bien que les options personnalisées soient traitées,Mage_Catalog_Model_Product::_beforeSave()
elles sont en fait vides car l'événement ne s'est pas encore déclenché et ne sont donc pas ajoutées.Si vous déplacez la ligne
parent::_beforeSave();
dans la méthode que j'ai mentionnée en haut de la méthode, les options sont ajoutées (toujours deux fois, mais elles sont ajoutées). Je posterai plus quand / si je trouve le problème.[EDIT] Je l'ai
trouvé. J'avais en quelque sorte raison dans les lignes ci-dessus.
Comme je l'ai dit, le problème est qu'il
catalog_product_save_before
est distribué après le traitement des options personnalisées. mais c'est pourquoi cela ne fonctionne pas.Les options personnalisées sont enregistrées dans
Mage_Catalog_Model_Product::_afterSave()
ce code:Mais
$this->getOptionInstance()
est rempli d'options_beforeSave
lorsque le tableau d'options est vide dans votre cas. Par conséquent ... rien à sauver.Si vous souhaitez toujours utiliser le
catalog_product_save_before
voici le code qui devrait fonctionner.la source
catalog_product_prepare_save
place decatalog_product_save_before
et comment puis-je mettre à jour l'option si des modifications sont nécessaires.J'ai juste eu le même problème, la réponse de marius a très bien fonctionné. Il m'a cependant fallu un certain temps pour comprendre comment mettre à jour une option personnalisée. Sachant que $ product-> getOptionInstance () -> addOption () fonctionne pour enregistrer une option, et définir "is_delete" sur 1 supprime une option lors de l'enregistrement, j'ai trouvé ce code:
Après la suppression, vous pouvez ajouter votre option personnalisée mise à jour avec ce code:
la source
Pour créer une option personnalisée dans magento tout en enregistrant le produit, ce sont des étapes très faciles.
Si une option personnalisée est déjà créée, vous pouvez la supprimer en suivant le code
Merci
la source