Tugasnya sepele. Saya perlu mendapatkan daftar produk untuk tampilan toko tertentu dengan katalog datar diaktifkan. Solusi yang paling jelas adalah sebagai berikut:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
Sebenarnya setStore()
metode ini tidak membuat perbedaan di sini karena ini disebut setelah _initSelect()
metode Mage_Catalog_Model_Resource_Product_Collection
yang mendapatkan nama tabel datar berdasarkan ID toko. Karena ID toko belum disetel, ID toko saat ini diperlukan.
Jadi solusi yang jelas adalah dengan menetapkan ID toko saat ini sebelum mendapatkan model.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Itu akan berhasil. Tetapi hanya jika Anda perlu mendapatkan koleksi sekali. Jika Anda perlu mendapatkan koleksi di loop atau Anda hanya perlu dua koleksi back to back Anda tidak akan dapat mengatur toko khusus untuk mereka.
Alasannya adalah bahwa Mage_Catalog_Model_Resource_Product_Flat
kelas memiliki _storeId
properti itu sendiri dan dalam konstruktor itu diatur ke ID toko saat ini. Itu sebabnya ini akan ditetapkan pertama kali. Kemudian untuk beberapa alasan (surga tahu saya harap ada satu) di Mage_Eav_Model_Entity_Collection_Abstract::_init
setiap modul sumber daya diambil sebagai singleton. Jadi tidak ada konstruktor untuk panggilan kedua.
Ini semua terlihat sangat salah sehingga saya cukup yakin saya salah dan itu bukan bug Magento lainnya (atau dua). Semoga seseorang bisa menjelaskannya.