-
16-10-2019 - |
题
我正在尝试在我创建的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
.
笔记
另外,您可以在模板中将所有PHP代码放在上面的所有PHP代码中,但这很混乱,违反了Magento的编码标准和最佳实践。
显然Magento带有其自己的预定块类型
catalog/product_list_random
, ,但它使用order('rand()')
, ,所以我不会出于上述表现原因而推荐它。
您可以尝试将整个产品集合加载到自定义块中并使用 array_rand
挑选返回到TPL文件的5个ID。