Tworzenie niestandardowej opcji przy zapisywaniu produktu

18

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_beforezdarzenie 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

Jason Neumann
źródło
Cześć, ponieważ używasz zdarzenia catalog_product_save_before przed wywołaniem, nie musisz wywoływać opcji -> save, ponieważ produkt zostanie zapisany po zakończeniu zdarzenia. Co się stanie, jeśli usuniesz to połączenie zapisu w swoim obserwatorze?
ProxiBlue
Jeśli usunę połączenie, aby zapisać (), nie zostaną utworzone żadne niestandardowe opcje.
Jason Neumann

Odpowiedzi:

12

Dopóki nie znajdę dokładnego problemu, tutaj jest rozwiązanie. Zamiast tego catalog_product_save_beforeużyj zdarzenia catalog_product_prepare_save. Wadą tego jest to, że prepare_savezdarzenie 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_beforejest 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_beforejest 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:

$this->getOptionInstance()->setProduct($this)
            ->saveOptions();

Ale $this->getOptionInstance()jest zapełniany opcjami, _beforeSavegdy tablica opcji jest pusta w twoim przypadku. Stąd ... nic do ocalenia.
Jeśli nadal chcesz korzystać z catalog_product_save_beforetego kodu, który powinien działać.

//check that we haven't made the option already
$options = $product->getOptions();
if ($options){
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
}
$option = array(
    'title' => 'Auto Date & Time',
    'type' => 'date_time',
    'is_require' => 1,
    'sort_order' => 0,
    'is_delete' => '',
    'previous_type' => '',
    'previous_group' => '',
    'price' => '0.00',
    'price_type' => 'fixed',
    'sku' => ''
);
//don't use it like this because it has no effect
//$product->setProductOptions($options);
$product->setCanSaveCustomOptions(true);
//use it this way. Populate `$product->getOptionInstance()` directly
$product->getOptionInstance()->addOption($option);
//don't forget to state that the product has custom options
$product->setHasOptions(true);
Marius
źródło
Witaj @Marius mogę użyć catalog_product_prepare_savezamiast catalog_product_save_beforei jak mogę zaktualizować opcję, jeśli wymagane są jakiekolwiek zmiany.
Zaheerabbas
0

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:

$oldOptions = $product->getOptionInstance()->getOptions();
foreach ($oldOptions as $key => $option){
    if($option['title'] == "Custom Option Title") {
        $oldOptions[$key]['is_delete'] = 1;                 
        $product->getOptionInstance()->addOption($oldOptions[$key]);
    }
}

Po usunięciu możesz dodać zaktualizowaną opcję niestandardową za pomocą tego kodu:

$newOption = array(
    'title' => "Custom Option Title",
    'type' => 'radio',
    'is_require' => 1,
    'sort_order' => 20,
    'values' => array(
        array(
            'title' => "Value 1 Title",
            'price' => 42.00,
            'price_type' => 'fixed',
            'sku' => "",
            'sort_order' => '1'
        ),
        array(
            'title' => "Value 2 Title",
            'price' => 50,
            'price_type' => 'percent',
            'sku' => "",
            'sort_order' => '2'
        )
    )
);
$product->getOptionInstance()->addOption($newOption);
Andreas Riedmüller
źródło
0

Aby utworzyć niestandardową opcję w Magento podczas zapisywania produktu, są to bardzo proste kroki.

   $product = Mage::getModel("catalog/product")->load($productid);

    $options[] = array(
            'title' => 'Pet',
            'type' => 'field',
            'is_require' => 0,
            'sort_order' => 0,
        );
    $options[] = array(
            'title' => 'Date',
            'type' => 'field',
            'is_require' => 1,
            'sort_order' => 2,
        );

    $product->setProductOptions(($options));
    $product->setCanSaveCustomOptions(true);
    $product->save();`

Jeśli utworzono już niestandardową opcję, możesz ją usunąć, postępując zgodnie z kodem

$product = Mage::getModel("catalog/product")->load($productid);

    $customOptions = $product->getOptions();

    foreach ($customOptions as $option) {
        $option->delete();
    }

    $product->setHasOptions(0);
    $product->save();

Dzięki

Mage2Solutions
źródło