Ich arbeite daran, bei jeder Produkterstellung automatisch eine benutzerdefinierte Option für meine Produkte zu erstellen. Was ich bisher habe, ist ein Beobachter, der das catalog_product_save_before
Ereignis abfeuert und den folgenden Code ausführt:
//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();
Wenn ich den Eingang verlasse $product->save()
, werden zwei benutzerdefinierte Optionen erstellt, obwohl ich beim zweiten Auslösen des Ereignisses überprüft habe, ob die return-Anweisung in der foreach-Schleife aufgerufen wird.
Wenn ich es rausnehme. Es werden keine benutzerdefinierten Optionen erstellt.
Kann mir jemand sagen, was ich falsch mache?
Ich arbeite mit Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
quelle
quelle
Antworten:
Bis ich das genaue Problem finde, ist hier die Lösung.
catalog_product_save_before
Verwenden Sie stattdessen das Ereigniscatalog_product_prepare_save
. Dies hat den Nachteil, dass dasprepare_save
Ereignis nur ausgelöst wird, wenn ein Produkt über die Administrationsoberfläche oder die API gespeichert wird. Wenn Sie also einen benutzerdefinierten Code speichern, wird dieser nur ausgelöst, wenn Sie ihn manuell auslösen.Ich habe die Vermutung, dass das Problem etwas mit der
Mage_Catalog_Model_Product::_beforeSave()
Methode zu tun hat . Dort werden einige benutzerdefinierte Optionen verarbeitet.Aber
catalog_product_save_before
wird ausgelöst , nachdem diese Verarbeitung erfolgt, also , während die benutzerdefinierten Optionen verarbeitet werden ,Mage_Catalog_Model_Product::_beforeSave()
sie tatsächlich leer sind , weil das Ereignis noch nicht feuern , so dass sie nicht hinzugefügt werden .Wenn Sie die Zeile
parent::_beforeSave();
in der Methode verschieben, die ich oben in der Methode erwähnt habe, werden die Optionen hinzugefügt (immer noch zweimal, aber sie werden hinzugefügt). Ich werde mehr posten, wenn / wenn ich das Problem finde.[BEARBEITEN]
Fand es. Ich war irgendwie richtig in den Zeilen darüber.
Wie gesagt, das Problem ist, dass der
catalog_product_save_before
Versand erfolgt, nachdem die benutzerdefinierten Optionen verarbeitet wurden. aber deshalb funktioniert es nicht.Die benutzerdefinierten Optionen werden
Mage_Catalog_Model_Product::_afterSave()
mit folgendem Code gespeichert :Wird
$this->getOptionInstance()
jedoch mit Optionen in gefüllt,_beforeSave
wenn das Options-Array in Ihrem Fall leer ist. Daher ... nichts zu retten.Wenn du das noch benutzen willst
catalog_product_save_before
ist hier der Code der funktionieren sollte.quelle
catalog_product_prepare_save
anstelle von verwendencatalog_product_save_before
und wie kann ich die Option aktualisieren, wenn Änderungen erforderlich sind.Ich hatte nur das gleiche Problem, die Antwort von Marius funktionierte großartig. Ich habe einige Zeit gebraucht, um herauszufinden, wie eine benutzerdefinierte Option aktualisiert werden kann. Mit dem Wissen, dass $ product-> getOptionInstance () -> addOption () zum Speichern einer Option funktioniert und das Setzen von "is_delete" auf 1 eine Option beim Speichern entfernt, kam ich auf diesen Code:
Nach dem Löschen können Sie Ihre aktualisierte benutzerdefinierte Option mit folgendem Code hinzufügen:
quelle
Das Erstellen einer benutzerdefinierten Option in Magento beim Speichern des Produkts ist ganz einfach.
Wenn bereits eine benutzerdefinierte Option erstellt wurde, können Sie diese mithilfe des folgenden Codes löschen
Vielen Dank
quelle