Pracuję nad automatycznym tworzeniem niestandardowej opcji dla moich produktów za każdym razem, gdy produkt jest tworzony. Do tej pory mam obserwatora, który odpala catalog_product_save_before
zdarzenie i uruchamia następujący kod:
//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();
Jeśli zostawię wejście $product->save()
, kończę z tworzeniem 2 niestandardowych opcji, mimo że sprawdzam, czy podczas drugiego uruchomienia zdarzenia sprawdzam, czy w pętli foreach wywoływana jest instrukcja return.
Jeśli to wyciągnę. Nie są tworzone żadne opcje niestandardowe.
Czy ktoś może mi powiedzieć, co robię źle?
Pracuję z Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
źródło
źródło
Odpowiedzi:
Dopóki nie znajdę dokładnego problemu, tutaj jest rozwiązanie. Zamiast tego
catalog_product_save_before
użyj zdarzeniacatalog_product_prepare_save
. Wadą tego jest to, żeprepare_save
zdarzenie jest wywoływane tylko podczas zapisywania produktu z interfejsu administratora lub interfejsu API. Więc jeśli zapisujesz z niestandardowego kodu, nie zostanie on uruchomiony, chyba że uruchomisz go ręcznie.Mam przeczucie, że problem ma coś wspólnego z tą
Mage_Catalog_Model_Product::_beforeSave()
metodą. Tam jest trochę przetwarzania niestandardowych opcji.Ale
catalog_product_save_before
jest wysyłany po tym przetwarzaniu, więc podczas przetwarzania niestandardowych opcji sąMage_Catalog_Model_Product::_beforeSave()
one faktycznie puste, ponieważ zdarzenie nie zostało jeszcze uruchomione, więc nie zostały dodane.Jeśli przesuniesz linię
parent::_beforeSave();
w metodzie, o której wspomniałem u góry metody, opcje zostaną dodane (jeszcze dwa razy, ale zostaną dodane). Wyślę więcej, gdy / jeśli znajdę problem.[EDYCJA]
Znalazłem. Miałem jakoś rację w powyższych liniach.
Tak jak powiedziałem, problem polega na tym, że
catalog_product_save_before
jest on wysyłany po przetworzeniu opcji niestandardowych. ale dlatego to nie działa.Opcje niestandardowe są zapisywane w
Mage_Catalog_Model_Product::_afterSave()
tym kodzie:Ale
$this->getOptionInstance()
jest zapełniany opcjami,_beforeSave
gdy tablica opcji jest pusta w twoim przypadku. Stąd ... nic do ocalenia.Jeśli nadal chcesz korzystać z
catalog_product_save_before
tego kodu, który powinien działać.źródło
catalog_product_prepare_save
zamiastcatalog_product_save_before
i jak mogę zaktualizować opcję, jeśli wymagane są jakiekolwiek zmiany.Właśnie miałem ten sam problem, odpowiedź od Mariusa działała świetnie. Zajęło mi jednak trochę czasu, aby dowiedzieć się, jak zaktualizować niestandardową opcję. Mając świadomość, że $ product-> getOptionInstance () -> addOption () działa do zapisywania opcji, a ustawienie „is_delete” na 1 usuwa opcję zapisywania, wymyśliłem ten kod:
Po usunięciu możesz dodać zaktualizowaną opcję niestandardową za pomocą tego kodu:
źródło
Aby utworzyć niestandardową opcję w Magento podczas zapisywania produktu, są to bardzo proste kroki.
Jeśli utworzono już niestandardową opcję, możesz ją usunąć, postępując zgodnie z kodem
Dzięki
źródło