Ürün Tasarrufunda Özel Seçenek Oluşturma


18

Bir ürün oluşturulduğunda ürünlerim için otomatik olarak özel bir seçenek oluşturmaya çalışıyorum. Şimdiye kadar ne var catalog_product_save_beforeolay ateş ve aşağıdaki kodu çalıştıran bir gözlemci :

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

Ben bırakırsanız $product->save()içinde, ben olay foreach döngüsünde denir return ifadesini ateşler 2 defa doğrulamak için kontrol ettik rağmen 2 özel seçenekleri yaratılan ile rüzgar.

Eğer çıkarırsam. Özel seçenek oluşturulmaz.

Birisi bana neyi yanlış yaptığımı söyleyebilir mi?
Magento 1.7 ile çalışıyorum


Merhaba, catalog_product_save_before olayını kullandığınız için, etkinlik tamamlandıktan sonra ürün woudl save olarak -> save komutunu çağırmanız gerekmez. Gözlemcinizdeki bu kaydetme çağrısını kaldırırsanız ne olur?
ProxiBlue

Save () çağrısını kaldırırsam hiçbir özel seçenek oluşturulmaz.
Jason Neumann

Yanıtlar:


12

Tam problemi bulana kadar çözüm burada. Bunun yerine catalog_product_save_beforeetkinliği kullanın catalog_product_prepare_save. Bunun dezavantajı, prepare_saveetkinliğin yalnızca bir ürünü yönetici arayüzünden veya API'dan kaydederken gönderilmesidir. Bu nedenle, özel bir koddan kaydediyorsanız, manuel olarak tetiklemediğiniz sürece tetiklenmez.

Ben sorunun Mage_Catalog_Model_Product::_beforeSave()yöntemi ile ilgili bir şey var bir önsezi var . Orada özel seçeneklerin bir miktar işlenmesi var.
Ancak catalog_product_save_beforebu işlem gerçekleştikten sonra gönderilir, bu nedenle özel seçenekler işlenirken Mage_Catalog_Model_Product::_beforeSave(), etkinlik henüz tetiklenmediği için aslında boşturlar, böylece eklenmezler. Yöntemin en üstünde bahsettiğim yöntemde
satırı taşırsanız, parent::_beforeSave();seçenekler eklenir (yine de iki kez, ancak eklenir). Sorunu bulduğumda / bulduğumda daha fazla yayınlayacağım.

[EDIT]
Bulundu. Bir şekilde yukarıdaki satırlardaydım.
Dediğim gibi sorun catalog_product_save_beforeözel seçenekler işlendikten sonra gönderilir olmasıdır. ama bu yüzden çalışmıyor.
Özel seçenekler Mage_Catalog_Model_Product::_afterSave()bu kodla kaydedilir :

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

Ancak $this->getOptionInstance(), _beforeSavedurumunuzda seçenekler dizisi boş olduğunda seçeneklerle doldurulur . Dolayısıyla ... kurtaracak hiçbir şey yok.
Hala kullanmak istiyorsanız catalog_product_save_beforeburada çalışması gereken kod.

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

Hello @Marius catalog_product_prepare_saveyerine catalog_product_save_beforekullanabilir miyim ve herhangi bir değişiklik gerekirse seçeneği nasıl güncelleyebilirim.
Zaheerabbas

0

Sadece aynı problemi yaşadım, marius'un cevabı harika çalıştı. Yine de özel bir seçeneği nasıl güncelleyeceğimi anlamak biraz zaman aldı. $ Product-> getOptionInstance () -> addOption () bir seçeneği kaydetmek için çalışıyor ve "is_delete" 1 ayarını kaydetme seçeneği kaldırır, bu kod ile geldi:

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

Sildikten sonra güncellenmiş özel seçeneğinizi şu kodla ekleyebilirsiniz:

$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

Magento'da ürün kaydederken özel seçenek oluşturmak için bunlar çok kolay adımlardır.

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

Önceden oluşturulmuş özel bir seçenek varsa, aşağıdaki kodu izleyerek silebilirsiniz

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

    $customOptions = $product->getOptions();

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

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

Teşekkürler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.