我已按照此答案在类别列表页面上隐藏没有图像的产品。它工作了一段时间。
现在,由于某种原因,似乎没有图像的产品仍然显示在列表页面上。关于为什么会发生这种情况的任何想法?
注意: 正在使用相同的 list.phtml 页面。
谢谢你。
将以下内容添加到 list.phtm:
//$_productCollection=$this->getLoadedProductCollection();
$_productCollection = clone $this->getLoadedProductCollection();
$_productCollection->clear()
->addAttributeToFilter('small_image', array('neq' => 'no_selection'))
->load();
这个答案推荐了以下内容:
->addAttributeToFilter('image', array('neq' => 'no_selection'))
而我已将其设置为:
->addAttributeToFilter('small_image', array('neq' => 'no_selection'))
上一个答案不起作用的原因是因为产品集合没有加载常规图像,因此无法将常规图像添加为过滤的属性,所以我将small_image添加为过滤的属性。
您还可以尝试RS 的答案,他将图像添加到页面并因此添加到集合中。您可能还必须使用以下方法添加所有属性:
->addAttributeToSelect('*')
有一些技巧可以让 Magento 保持一致。我了解到的一件事是,Magento 模型会因许多不同的原因而改变,而且很难弄清楚原因。有更好的方法来做到这一点(修改集合等),但有时它只是不起作用,你没有时间找出原因。
如果您想要确保图像存在的万无一失的方法,请使用以下代码......它可能不是“magento 方式”,但它可以工作,我在我的网站上对其进行了测试(Magento EE 1.12)。把它放在一个函数中,或者如果你想直接在你的 phtml 中使用它!
它基本上只是确保 URL 存在。
$exists = false;
$entity_id = 8800;
$product = Mage::getModel('catalog/product')->load($entity_id);
$mediaUrl= Mage::getBaseUrl('media');
$imageUrl = $mediaUrl . "catalog/product" . $product->getImage();
$file_headers = @get_headers($imageUrl);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
}
else {
$exists = true;
}
var_dump($exists);
var_dump($imageUrl);
echo '<img src="' . $imageUrl . '" />';
$exists 将是 true(图像确实存在)或 false(图像不存在)
我认为问题在于您正在尝试获取 list.phtml 上的“图像”(基本图像)属性(默认情况下,我只能访问缩略图 small_image)。
在 list.phtml 上(不像 view.pthml 那样加载完整的产品资源)
echo $_product->getImage() //null
echo $_product->getThumbnail() // path/name.jpg
echo $_product->getSmallImage() // path/name.jpg
我认为您可能需要添加类似这样的内容到 app/design/frontend/default/yourtheme/layout/catalog.xml
<action method="addAttribute"><name>image</name></action>