Tạo khối cho sản phẩm ngẫu nhiên
Bạn nên tạo một mô-đun tùy chỉnh với một loại khối mới. Tôi khuyên bạn nên gia hạn Mage_Catalog_Block_Product_List
, sau đó nếu bố cục danh sách sản phẩm mặc định đủ cho bạn, bạn thậm chí không cần thiết kế mẫu của riêng mình.
Sau đó ghi đè _getProductCollection()
hoặc nếu bạn không mở rộng Mage_Catalog_Block_Product_list
viết một phương thức công khai mới getProductCollection()
.
Cách chuẩn bị bộ sưu tập sản phẩm theo phương pháp này:
Bộ sưu tập Bộ lọc
Đầu tiên, tạo bộ sưu tập và áp dụng bộ lọc tiêu chuẩn (hiển thị trong danh mục và có sẵn trong cửa hàng hiện tại):
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
->addStoreFilter()
->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
Lựa chọn ngẫu nhiên
ORDER BY RAND()
không phù hợp trên các bảng lớn vì nó dẫn đến một bản sao bảng tạm thời tốn nhiều tài nguyên. Nó phải tải tất cả các kết quả vào một bảng tạm thời, gán một số ngẫu nhiên cho mỗi hàng và sau đó sắp xếp mà không có bất kỳ chỉ mục nào. Thay vào đó, chúng tôi truy xuất tất cả các id (tốc độ này nhanh hơn và lượng dữ liệu có thể quản lý được ngay cả đối với các danh mục lớn), chọn một số ngẫu nhiên và truy xuất trực tiếp các hàng này.
Để làm như vậy, chèn mã này sau khi các bộ lọc cho bộ sưu tập đã được áp dụng:
$numberOfItems = 4;
$candidateIds = $productCollection->getAllIds();
$choosenIds = [];
$maxKey = count($candidateIds)-1;
while (count($choosenIds) < $numberOfItems)) {
$randomKey = mt_rand(0, $maxKey);
$choosenIds[$randomKey] = $candidateIds[$randomKey];
}
$productCollection->addIdFilter($choosenIds);
Bạn có thể đọc chi tiết về nó trong blog của tôi: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/
Lấy các thuộc tính cần thiết
Sau đó, chúng tôi chỉ định các thuộc tính sẽ được tải và tham gia các chỉ mục giá và URL để có thể hiển thị giá sản phẩm và URL đúng:
$productCollection
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
Cuối cùng nhưng không kém phần quan trọng, trả lại bộ sưu tập:
return $productCollection;
Bộ sưu tập này hiện có thể được sử dụng trong Mage_Catalog_Block_Product_List
các khối hoặc trong mẫu của riêng bạn foreach ($this->getProductCollection() as $product)
giống như trong câu trả lời của Marius.
Chèn khối tùy chỉnh trong CMS
Sử dụng mã này để chèn khối trong trang chủ của bạn, với your/block
bí danh là lớp khối của bạn:
{{block type="your/block" name="random_products" template="catalog/product/list.phtml" column_count="4"}}
Chỉ định mẫu của riêng bạn nếu cần. column_count
được sử dụng bởi Mage_Catalog_Block_Product_List
.
Ghi chú
Ngoài ra, bạn có thể đặt tất cả mã PHP từ trên vào trong mẫu của mình nhưng điều này khá lộn xộn và vi phạm các tiêu chuẩn mã hóa và thực tiễn tốt nhất của Magento.
Rõ ràng Magento đi kèm với loại khối được xác định trước catalog/product_list_random
, nhưng nó sử dụng order('rand()')
, vì vậy tôi sẽ không đề xuất nó vì lý do hiệu suất được giải thích ở trên.