Erstellen einer benutzerdefinierten Option beim Speichern des Produkts


18

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


Hallo, da Sie das Ereignis catalog_product_save_before verwenden, müssten Sie nicht -> save aufrufen, da das Produkt nach Abschluss des Ereignisses gespeichert werden muss. Was passiert, wenn Sie diesen gespeicherten Anruf in Ihrem Beobachter entfernen?
ProxiBlue

Wenn ich den Aufruf zum Speichern () entferne, werden keine benutzerdefinierten Optionen erstellt.
Jason Neumann

Antworten:


12

Bis ich das genaue Problem finde, ist hier die Lösung. catalog_product_save_beforeVerwenden Sie stattdessen das Ereignis catalog_product_prepare_save. Dies hat den Nachteil, dass das prepare_saveEreignis 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_beforewird 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_beforeVersand 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 :

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

Wird $this->getOptionInstance()jedoch mit Optionen in gefüllt, _beforeSavewenn das Options-Array in Ihrem Fall leer ist. Daher ... nichts zu retten.
Wenn du das noch benutzen willst catalog_product_save_beforeist hier der Code der funktionieren sollte.

//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);

Hallo @Marius, kann ich catalog_product_prepare_saveanstelle von verwenden catalog_product_save_beforeund wie kann ich die Option aktualisieren, wenn Änderungen erforderlich sind.
Zaheerabbas

0

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:

$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]);
    }
}

Nach dem Löschen können Sie Ihre aktualisierte benutzerdefinierte Option mit folgendem Code hinzufügen:

$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);

0

Das Erstellen einer benutzerdefinierten Option in Magento beim Speichern des Produkts ist ganz einfach.

   $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();`

Wenn bereits eine benutzerdefinierte Option erstellt wurde, können Sie diese mithilfe des folgenden Codes löschen

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

    $customOptions = $product->getOptions();

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

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

Vielen Dank

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.