Membuat Opsi Kustom pada Simpan Produk

18

Saya sedang berupaya membuat opsi khusus untuk produk saya secara otomatis setiap kali produk dibuat. Apa yang saya dapatkan sejauh ini adalah seorang pengamat yang menyalakan catalog_product_save_beforeacara dan menjalankan kode berikut:

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

Jika saya meninggalkan $product->save()di, saya berakhir dengan 2 opsi khusus yang dibuat, meskipun saya sudah memeriksa untuk memverifikasi ke-2 kalinya acara kebakaran pernyataan kembali disebut di loop foreach.

Jika saya mengeluarkannya. Tidak ada opsi khusus yang dibuat.

Bisakah seseorang memberi tahu saya apa yang saya lakukan salah?
Saya bekerja dengan Magento 1.7

Jason Neumann
sumber
Hai, karena Anda menggunakan catalog_product_save_sebelum acara, Anda tidak perlu memanggil -> simpan, karena produk akan disimpan setelah acara selesai. Apa yang terjadi jika Anda menghapus panggilan simpan itu di pengamat Anda?
ProxiBlue
Jika saya menghapus panggilan untuk menyimpan () tidak ada opsi khusus dibuat.
Jason Neumann

Jawaban:

12

Sampai saya menemukan masalah yang tepat di sini adalah solusinya. Alih-alih catalog_product_save_beforemenggunakan acara tersebut catalog_product_prepare_save. Kelemahan dari ini adalah bahwa prepare_saveacara tersebut dikirim hanya ketika menyimpan produk dari antarmuka admin atau API. Jadi, jika Anda menyimpan dari kode khusus ini tidak akan dipicu kecuali Anda memicunya secara manual.

Saya punya firasat bahwa masalahnya ada hubungannya dengan Mage_Catalog_Model_Product::_beforeSave()metode. Di sana ada beberapa pemrosesan opsi khusus.
Tetapi catalog_product_save_beforedikirim setelah pemrosesan ini terjadi, jadi ketika opsi khusus diproses, Mage_Catalog_Model_Product::_beforeSave()sebenarnya kosong karena acara belum diaktifkan sehingga tidak ditambahkan.
Jika Anda memindahkan baris parent::_beforeSave();dalam metode yang saya sebutkan di bagian atas metode, opsi ditambahkan (masih dua kali, tetapi mereka ditambahkan). Saya akan memposting lebih banyak ketika / jika saya menemukan masalah.

[EDIT]
Menemukannya. Entah bagaimana saya benar di baris di atas.
Seperti saya katakan masalahnya adalah yang catalog_product_save_beforedikirim setelah opsi kustom diproses. tapi inilah mengapa itu tidak berhasil.
Opsi khusus disimpan Mage_Catalog_Model_Product::_afterSave()oleh kode ini:

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

Tetapi $this->getOptionInstance()diisi dengan opsi _beforeSaveketika array opsi kosong dalam kasus Anda. Karenanya ... tidak ada yang bisa disimpan.
Jika Anda masih ingin menggunakan di catalog_product_save_beforesini adalah kode yang seharusnya berfungsi.

//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
sumber
Hello @Marius boleh saya gunakan catalog_product_prepare_savesebagai ganti catalog_product_save_beforedan bagaimana saya bisa memutakhirkan opsi jika ada perubahan yang diperlukan.
Zaheerabbas
0

Saya hanya memiliki masalah yang sama, jawaban dari marius bekerja dengan baik. Butuh beberapa waktu untuk mencari tahu cara memperbarui opsi khusus. Dengan pengetahuan bahwa $ product-> getOptionInstance () -> addOption () berfungsi untuk menyimpan opsi, dan pengaturan "is_delete" ke 1 menghapus opsi untuk menyimpan, saya membuat kode ini:

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

Setelah menghapus Anda dapat menambahkan opsi kustom Anda yang diperbarui dengan kode ini:

$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
sumber
0

Untuk membuat opsi khusus di Magento sambil menyimpan produk, ini adalah langkah-langkah yang sangat mudah.

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

Jika sudah ada opsi khusus yang dibuat maka Anda dapat menghapusnya dengan mengikuti kode

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

    $customOptions = $product->getOptions();

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

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

Terima kasih

Solusi Mage2
sumber