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_Collectionlấ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_Flatlớp có thuộc tính riêng của nó _storeIdvà 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::_initmỗ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ó.


