質問

作成した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.


ノート

  1. または、上記のすべてのPHPコードをテンプレートに配置することもできますが、これは非常に厄介で、Magentoのコーディング基準とベストプラクティスに違反しています。

  2. どうやらMagentoには、独自の事前定義されたブロックタイプが付属しています catalog/product_list_random, 、しかし、それは使用します order('rand()'), 、そのため、上記のパフォーマンス上の理由ではお勧めしません。

カスタムブロックに製品コレクション全体をロードして使用することができます array_rand TPLファイルに返される5つのIDを選択します。

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

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top