TL; DR , Persyaratannya adalah memiliki tingkat persediaan persediaan ditampilkan pada halaman daftar produk kategori dengan sedikit pertanyaan tambahan / memori dengan kinerja dalam pikiran yang mematuhi kerangka kerja Magento.
Setelah membaca artikel Vinai Kopp tentang preloading untuk skalabilitas .
Apa cara terbaik untuk memasukkan level persediaan inventaris pada halaman daftar produk kategori ( list.phtml ) dengan sedikit pertanyaan / beban tambahan untuk kinerja?
Saya mengetahui beberapa pendekatan:
afterLoad () tampaknya berfungsi dengan baik denganmedia_gallery
penyertaan tanpa permintaan tambahan, namun saya belum berhasil menerapkan pendekatan yang sama dengan inventaris.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
SQL langsung untuk mengumpulkan data yang diperlukan secara paralel dengan pengumpulan dengan product_id
kunci misalnya. Tetapi mencari lebih banyak sarana melalui kerangka kerja.
Saat ini saya hanya memuat stock_item
objek melalui:
$_product->load('stock_item')->getTotalQty();
Yang berhasil, tapi saya perhatikan penambahan lebih banyak permintaan untuk mendapatkan total stok persediaan dari semua produk dalam koleksi.
...
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
...
anehnya, ini berhasil. Keajaiban terjadi di Mage_Eav_Model_Entity_Abstract-> memuat ($ objek, $ entitasId, $ atribut). Jika $ atribut kosong itu akan memanggil loadAllAttribute ($ objek). Jadi $ product-> load ('blah') akan memuat semua atribut yang hilang, termasuk 'media_gallery' - William Tran 19 Nov 14 pada jam 4:45
Tambahkan nilai yang diperlukan ke koleksi yang sudah dimuat.
Pendekatan sederhana yang jelas untuk menambahkan data yang diperlukan ke koleksi produksi tingkat atas di lapisan / filter, tampaknya akan menjadi pendekatan terbaik.
Saya memang melihat pengamat addInventoryDataToCollection () di Mage_CatalogInventory_Model_Observer yang kedengarannya akan mencapai itu, tetapi menambahkan metode ke pengamat modul khusus tampaknya tidak kompatibel.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Yang mengakibatkan:
Peringatan: Argumen tidak valid diberikan untuk foreach () di /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php on line 71
sumber
Jawaban:
Masalah sebenarnya di sini bukan preloading, ini akurasinya. Ini relatif mudah untuk mendapatkan jumlah stok untuk koleksi produk:
Sekarang dengan dua pertanyaan, Anda memiliki semua informasi yang Anda butuhkan. Mereka hanya sulit untuk berhubungan satu sama lain, yang dapat diperbaiki dengan menggunakan array asosiatif
'product_id' => 'stock'
dan menulis pengambil. Juga, addProductsFilter dapat dioptimalkan:Ini menghemat jenis cek dan array kloning.
Masalahnya sekarang adalah Blok HTML cache. Halaman kategori ini perlu dibersihkan ketika stok apa pun diperbarui pada produk yang terkandung di dalamnya. Sejauh yang saya tahu, ini bukan standar, karena hanya perubahan status stok membersihkan halaman kategori yang berisi produk (atau lebih tepatnya, perubahan visibilitas). Jadi, Anda harus mengamati setidaknya
cataloginventory_stock_item_before_save
dan mungkin beberapa orang lain dan membersihkan blok html cache (dan FPC cache) untuk halaman kategori itu.sumber
Saya melihat Anda sudah menerima dan sudah pasti mengimplementasikan sesuatu sekarang, namun saya ingin menunjukkan seberapa dekat Anda dengan
addInventoryDataToCollection()
tetapi sepertinya Anda salah mengutip file konfigurasi atau kami menggunakan versi magento yang sangat berbeda. Salinan sayaCatalogInventory/etc/config.xml
memiliki metode berbeda yang diperlukancatalog_product_collection_load_after
addInventoryDataToCollection()
dipanggil<sales_quote_item_collection_products_after_load>
Sumbernya
addStockStatusToCollection()
adalah:Anda bisa mengatur bendera
require_stock_items
pada koleksi sebelum dimuat, mungkin tidak mudah untuk blok di belakang daftar kategori, atau Anda dapat memanggilMage::getModel('cataloginventory/stock')->addItemsToProducts($productCollection)
secara manual pada koleksi, setelah sudah dimuat.addItemsToProducts()
dapatkan semua StockItems untuk Anda dan tempelkan ke ProductCollection Andasumber
Apakah Anda menggunakan Varnish atau FPC sama sekali, atau berencana untuk di masa depan?
Kami menemukan dengan jumlah permintaan hole punch / ESI yang diperlukan pada daftar produk, hampir tidak ada gunanya melakukan caching sehingga memilih pendekatan yang berbeda.
Kami menerapkan solusi pada satu situs web yang menggunakan permintaan AJAX ke pengontrol khusus untuk mengambil data stok untuk produk dan javascript menangani pembaruan DOM. Permintaan tambahan untuk data stok membutuhkan ~ 100 ms yang tidak berdampak pada keseluruhan waktu pemuatan halaman (terlihat). Pasangan yang dengan FPC prima menjatuhkan permintaan halaman ke bawah di bawah 100 ms, Anda memiliki satu situs cepat dengan overhead kinerja rendah untuk menampilkan data stok pada daftar produk.
Yang perlu Anda lakukan template bijaksana adalah menambahkan productId ke setiap produk html pembungkus sehingga javascript Anda tahu data stok mana yang berlaku untuk setiap produk.
Jika Anda melihat teknik caching tambahan untuk data stok aktual Anda bisa menjatuhkan yang jauh di bawah 100 ms dengan tidak harus init Mage / tekan database pada setiap permintaan.
Maaf jika ini tidak sesuai dengan apa yang Anda cari, tetapi kami menemukan itu sebagai pendekatan terbaik untuk skalabilitas dan kinerja terhadap persyaratan kami.
sumber