ホームページ上の4つのランダム製品
-
16-10-2019 - |
質問
作成したTPLファイル内でPHPを使用して、ホームページで4つのランダム製品を取得しようとしています。以下に示すコードで何らかのフォーマットを使用しているので、製品をフォーマーチループでフォーマットできるようにしたいと思います...
<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>
Googleで見つけたものをいくつか試しましたが、まだ運がありません。配列内のカテゴリの設定は、私がやろうとしていることのために確かに機能しますが、カテゴリがランダムであれば機能します。
ありがとう!
解決
これを試して。私は私のために働いた:
$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;?>
他のヒント
ランダム製品のブロックを作成します
新しいブロックタイプのカスタムモジュールを作成する必要があります。延長することをお勧めします Mage_Catalog_Block_Product_List
, 、デフォルトの製品リストレイアウトで十分な場合、独自のテンプレートを設計する必要さえありません。
その後、オーバーライドします _getProductCollection()
または、拡張しない場合 Mage_Catalog_Block_Product_list
新しいパブリック方法を書いてください getProductCollection()
.
この方法で製品コレクションを準備する方法:
コレクションフィルター
まず、コレクションを作成し、標準フィルターを適用します(カタログに表示され、現在のストアで利用可能):
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
->addStoreFilter()
->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
パフォーマンスランダム選択
ORDER BY RAND()
リソースの集中的な温度テーブルコピーをもたらすため、大きなテーブルでは成形されていません。すべての結果を一時テーブルにロードし、各行に乱数を割り当ててから、インデックスなしで並べ替える必要があります。代わりに、すべてのIDを取得します(これは高速で、大規模なカタログでもデータの量が管理できます)。ランダムに選択して、これらの行を直接取得します。
そのために、コレクションのフィルターが適用された後にこのコードを挿入しました。
$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);
あなたは私のブログで詳細に読むことができます: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-aredoing-it-doing/
必要な属性を取得します
次に、ロードされる属性を指定し、価格とURLインデックスを結合して、適切な価格と製品URLを表示できるようにします。
$productCollection
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
最後になりましたが、コレクションを返します。
return $productCollection;
このコレクションはこれで使用できます Mage_Catalog_Block_Product_List
ブロックまたはあなた自身のテンプレートで foreach ($this->getProductCollection() as $product)
マリウスの答えのように。
CMSにカスタムブロックを挿入します
このコードを使用して、ホームページにブロックを挿入し、 your/block
ブロッククラスのエイリアスである:
{{block type="your/block" name="random_products" template="catalog/product/list.phtml" column_count="4"}}
必要に応じて、独自のテンプレートを指定します。 column_count
で使用されます Mage_Catalog_Block_Product_List
.
ノート
または、上記のすべてのPHPコードをテンプレートに配置することもできますが、これは非常に厄介で、Magentoのコーディング基準とベストプラクティスに違反しています。
どうやらMagentoには、独自の事前定義されたブロックタイプが付属しています
catalog/product_list_random
, 、しかし、それは使用しますorder('rand()')
, 、そのため、上記のパフォーマンス上の理由ではお勧めしません。
カスタムブロックに製品コレクション全体をロードして使用することができます array_rand
TPLファイルに返される5つのIDを選択します。