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_before
acara 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
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Jason Neumann
sumber
sumber
Jawaban:
Sampai saya menemukan masalah yang tepat di sini adalah solusinya. Alih-alih
catalog_product_save_before
menggunakan acara tersebutcatalog_product_prepare_save
. Kelemahan dari ini adalah bahwaprepare_save
acara 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_before
dikirim 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_before
dikirim setelah opsi kustom diproses. tapi inilah mengapa itu tidak berhasil.Opsi khusus disimpan
Mage_Catalog_Model_Product::_afterSave()
oleh kode ini:Tetapi
$this->getOptionInstance()
diisi dengan opsi_beforeSave
ketika array opsi kosong dalam kasus Anda. Karenanya ... tidak ada yang bisa disimpan.Jika Anda masih ingin menggunakan di
catalog_product_save_before
sini adalah kode yang seharusnya berfungsi.sumber
catalog_product_prepare_save
sebagai ganticatalog_product_save_before
dan bagaimana saya bisa memutakhirkan opsi jika ada perubahan yang diperlukan.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:
Setelah menghapus Anda dapat menambahkan opsi kustom Anda yang diperbarui dengan kode ini:
sumber
Untuk membuat opsi khusus di Magento sambil menyimpan produk, ini adalah langkah-langkah yang sangat mudah.
Jika sudah ada opsi khusus yang dibuat maka Anda dapat menghapusnya dengan mengikuti kode
Terima kasih
sumber