Creazione di un'opzione personalizzata sul salvataggio del prodotto


18

Sto lavorando alla creazione di un'opzione personalizzata per i miei prodotti automaticamente ogni volta che viene creato un prodotto. Quello che ho finora è un osservatore che si attiva catalog_product_save_beforesull'evento ed esegue il seguente codice:

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

Se lascio il comando $product->save()in, finisco con la creazione di 2 opzioni personalizzate, anche se ho verificato per verificare la seconda volta che l'evento viene generato, l'istruzione return viene chiamata nel ciclo foreach.

Se lo tolgo. Non sono state create opzioni personalizzate.

Qualcuno può dirmi cosa sto facendo di sbagliato?
Sto lavorando con Magento 1.7


Ciao, poiché stai usando l'evento catalog_product_save_before non avresti bisogno di chiamare il -> save, poiché il prodotto non salverà dopo il completamento dell'evento. Cosa succede se rimuovi quella chiamata di salvataggio nel tuo osservatore?
ProxiBlue,

Se rimuovo la chiamata per save () non vengono create opzioni personalizzate.
Jason Neumann,

Risposte:


12

Fino a quando non trovo il problema esatto ecco la soluzione. Invece catalog_product_save_beforeusa l'evento catalog_product_prepare_save. L'aspetto negativo di questo è che l' prepare_saveevento viene inviato solo quando si salva un prodotto dall'interfaccia di amministrazione o dall'API. Quindi, se stai salvando da un codice personalizzato, questo non verrà attivato a meno che non lo attivi manualmente.

Ho la sensazione che il problema abbia a che fare con il Mage_Catalog_Model_Product::_beforeSave()metodo. Là dentro c'è qualche elaborazione delle opzioni personalizzate.
Ma catalog_product_save_beforeviene inviato dopo che si verifica questa elaborazione, quindi mentre le opzioni personalizzate vengono elaborate in Mage_Catalog_Model_Product::_beforeSave()esse sono effettivamente vuote perché l'evento non si è ancora attivato, quindi non vengono aggiunte.
Se sposti la linea parent::_beforeSave();nel metodo che ho citato all'inizio del metodo, le opzioni vengono aggiunte (ancora due volte, ma vengono aggiunte). Pubblicherò di più quando / se trovo il problema.

[EDIT]
Trovato. Ero in qualche modo proprio nelle righe sopra.
Come ho detto, il problema è che catalog_product_save_beforeviene inviato dopo l'elaborazione delle opzioni personalizzate. ma è per questo che non funziona.
Le opzioni personalizzate vengono salvate Mage_Catalog_Model_Product::_afterSave()da questo codice:

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

Ma $this->getOptionInstance()è popolato con opzioni _beforeSavequando l'array di opzioni è vuoto nel tuo caso. Quindi ... niente da salvare.
Se vuoi ancora usare catalog_product_save_beforequesto è il codice che dovrebbe funzionare.

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

Ciao @Marius posso usare al catalog_product_prepare_saveposto di catalog_product_save_beforee come posso aggiornare l'opzione se sono necessarie modifiche.
Zaheerabbas,

0

Ho appena avuto lo stesso problema, la risposta di Marius ha funzionato alla grande. Mi ci è voluto del tempo per capire come aggiornare un'opzione personalizzata. Con la consapevolezza che $ product-> getOptionInstance () -> addOption () funziona per il salvataggio di un'opzione e l'impostazione "is_delete" su 1 rimuove un'opzione sul salvataggio, ho trovato questo codice:

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

Dopo aver eliminato puoi aggiungere l'opzione personalizzata aggiornata con questo codice:

$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

Per creare un'opzione personalizzata in magento salvando il prodotto, questi sono passaggi molto semplici.

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

Se è già stata creata un'opzione personalizzata, puoi eliminarla seguendo il codice

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

    $customOptions = $product->getOptions();

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

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

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.