我正在尝试在我创建的TPL文件中使用PHP在主页上获取4个随机产品。我希望能够在foreach循环中格式化产品,因为我在下面看到的代码中使用了一些格式...

<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-are-are-doing-it-wrong/

检索必要的属性

然后,我们指定要加载的属性并加入价格和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代码放在上面的所有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归因
scroll top