Bốn sản phẩm ngẫu nhiên trên trang chủ


7

Tôi đang cố gắng để có được 4 sản phẩm ngẫu nhiên trên trang chủ bằng PHP trong tệp TPL tôi đã tạo. Tôi muốn có thể định dạng các sản phẩm trong một vòng lặp foreach vì tôi đang sử dụng một số định dạng trong mã được thấy bên dưới ...

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="product_page.html"><img src="<?php echo $this->getSkinUrl('images/products/place_holder.jpg'); ?>" alt=" "></a>
    </div>

    <div class="product_title">
      <a href="product_page.html">240 Serving Package</a>
    </div>

    <div class="price_hp">$454.99</div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="#">ADD TO CART</a>
    </div>
  </div>
</div>

Tôi đã thử một vài thứ được tìm thấy trên Google nhưng chưa có may mắn. Đặt các danh mục trong một mảng chắc chắn sẽ hoạt động cho những gì tôi đang cố gắng thực hiện nhưng nó cũng hoạt động nếu các danh mục là ngẫu nhiên.

Cảm ơn!

Câu trả lời:


9

Thử cái này. Tôi đã làm việc cho tôi:

$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToSelect(array('name', 'thumbnail', 'price')); //feel free to add any other attribues you need.
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products); 
$products->getSelect()->order('RAND()');
$products->getSelect()->limit(4);
foreach ($products as $product)  : ?>

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="<?php echo $product->getProductUrl()?>"><img src="<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail')->resize(100, 80)?>" alt=""></a>
    </div>

    <div class="product_title">
      <a href="<?php echo $product->getProductUrl()?>"><?php echo $product->getName()?></a>
    </div>

    <div class="price_hp"><?php echo Mage::app()->getStore()->getCurrentCurrency()->format($product->getFinalPrice());?></div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="<?php echo Mage::helper('checkout/cart')->getAddUrl($product)?>">ADD TO CART</a>
    </div>
  </div>
</div>
<?php 
endforeach;?>

Này Marius! Điều này đã làm việc - cảm ơn bạn rất nhiều! Bạn có thể cho tôi biết (có thể) tại sao nút thêm vào giỏ hàng không hoạt động không? Bản demo có sẵn tại dev.wisefoodsupply.com
Brian Schroeter

thực tế không có gì hoạt động ngoại trừ trang chủ. Bạn không có quyền thực thi trên index.php. Ít nhất đó là những gì thông báo lỗi nói.
Marius

2
Không sử dụng ORDER BY RAND () trên một danh mục lớn, nó có vấn đề về hiệu suất
Fabian Schmengler 14/08/2015

Tôi sẽ không chỉnh sửa bài viết của bạn, nhưng bạn có thể kiểm tra Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);không? Dường như không làm gì cả.
sv3n

Nó đã từng làm một cái gì đó 5 năm trước .... tôi nghĩ.
Marius

4

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_listviế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_Listcá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/blockbí 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ú

  1. 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.

  2. 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.


0

Bạn có thể thử tải toàn bộ bộ sưu tập sản phẩm trong một Khối tùy chỉnh và sử dụng array_randđể chọn ra 5 ID được trả về tệp TPL.

http://php.net/manual/en/feft.array-rand.php


3
Đây không phải là ý tưởng tốt. Nếu bạn có sản phẩm 30k thì sao? Trên thực tế, danh sách các sản phẩm ngẫu nhiên không phải là một ý tưởng tốt nhưng nếu bạn phải làm điều đó, tải bộ sưu tập đầy đủ không phải là cách để đi.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.