Nhiệm vụ là tầm thường. Tôi cần lấy danh sách các sản phẩm để xem cửa hàng cụ thể với danh mục phẳng được bật. Giải pháp rõ ràng nhất là như sau:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
Trong thực tế, setStore()
phương thức này không tạo ra bất kỳ sự khác biệt nào ở đây bởi vì nó được gọi sau _initSelect()
phương thức Mage_Catalog_Model_Resource_Product_Collection
lấy tên của bảng phẳng dựa trên ID cửa hàng. Vì ID cửa hàng chưa được đặt, nó sẽ lấy ID cửa hàng hiện tại.
Vì vậy, cách giải quyết rõ ràng sẽ là đặt ID cửa hàng hiện tại trước khi lấy mô hình.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Nó sẽ làm việc. Nhưng chỉ khi bạn cần có được một bộ sưu tập một lần. Nếu bạn cần lấy một bộ sưu tập trong vòng lặp hoặc bạn chỉ cần hai bộ sưu tập quay lại, bạn sẽ không thể đặt một cửa hàng cụ thể cho chúng.
Lý do là Mage_Catalog_Model_Resource_Product_Flat
lớp có thuộc tính riêng của nó _storeId
và trong hàm tạo, nó được đặt thành ID cửa hàng hiện tại. Đó là lý do tại sao nó sẽ được thiết lập lần đầu tiên. Sau đó, vì một số lý do (trời biết tôi hy vọng có một) trong Mage_Eav_Model_Entity_Collection_Abstract::_init
mỗi mô-đun tài nguyên được tìm nạp dưới dạng đơn lẻ. Vì vậy, không có nhà xây dựng cho cuộc gọi thứ 2.
Tất cả điều này có vẻ sai đến nỗi tôi khá chắc chắn rằng tôi đã sai và đó không phải là một lỗi Magento (hoặc hai) khác. Hy vọng ai đó có thể làm sáng tỏ về nó.