3

I need help with hiding Magento products with no images or display products with images first.

I saw this $this->getLoadedProductCollection()->setOrder('image'/*or small_image*/, 'desc') in a response to another question to load all products with images first. But it didn't work for me.

I am on Magento 1.6.2.

Thanks in advance.

Update: Please see my full list.phtml below. I think I am doing something wrong. Thanks.

<?php
$_productCollection=$this->getLoadedProductCollection();
$_productCollection->addAttributeToFilter('image', array('neq' => 'no_selection'));
$_helper = $this->helper('catalog/output');
$now = date("Y-m-d H:m:s");     

?>
<?php if(!$_productCollection->count()): ?>
<p class="note-msg"><?php echo $this->__('There are no products matching the selection.') ?></p>
<?php else: ?>
<div class="category-products">
<?php echo $this->getToolbarHtml() ?>
<?php // List mode ?>
<?php if($this->getMode()!='grid'): ?>
<?php $_iterator = 0; ?>
<ol class="products-list" id="products-list">
<?php foreach ($_productCollection as $_product): ?>
    <li class="item<?php if( ++$_iterator == sizeof($_productCollection) ): ?> last<?php endif; ?>">
            <?php $newFromDate = $_product->getNewsFromDate(); ?>
            <?php $newToDate = $_product->getNewsToDate(); ?>                                               
            <?php if($newFromDate < $now && $newToDate > $now): ?>
                    <div class="newproduct_grid"><?php echo $this->__('New Product') ?></div>
            <?php endif; ?>     
        <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(192); ?>" width="192" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" /></a>
        <?php // Product description ?>
        <div class="product-shop">
            <div class="f-fix">
                <?php $_productNameStripped = $this->stripTags($_product->getName(), null, true); ?>
                <h2 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $_productNameStripped; ?>"><?php echo $_helper->productAttribute($_product, $_product->getName() , 'name'); ?></a></h2>
                <?php if($_product->getRatingSummary()): ?>
                <?php echo $this->getReviewsSummaryHtml($_product) ?>
                <?php endif; ?>
                <div id="productimgover<?php echo $_product->getId()?>" style="display: none;"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(64); ?>" width="64" height="64" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" /></div>
                <div id='productname<?php echo $_product->getId()?>' style='display:none'><?php echo $_helper->productAttribute($_product, $_product->getName(), 'name') ?></div>
                <div class="desc std">
                    <?php echo $_helper->productAttribute($_product, $_product->getShortDescription(), 'short_description') ?>
                    <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $_productNameStripped ?>" class="link-learn"><?php echo $this->__('Learn More') ?></a>
                </div>
                <ul class="add-to-links">
                    <?php if ($this->helper('wishlist')->isAllow()) : ?>
                        <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__('Add to Wishlist') ?></a></li>
                    <?php endif; ?>
                    <?php if($_compareUrl=$this->getAddToCompareUrl($_product)): ?>
                        <li><span class="separator">|</span> <a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__('Add to Compare') ?></a></li>
                    <?php endif; ?>
                </ul>
            </div>
            <div style="clear: both;"></div>
        </div>
        <div class="addtocont">
            <?php echo $this->getPriceHtml($_product, true) ?>
            <?php if($_product->isInStock()): ?>
                                    <?php if ( !($_product->getTypeInstance(true)->hasRequiredOptions($_product) || $_product->isGrouped()) ) { ?>
                            <p><button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocationAjax('<?php echo $this->getAddToCartUrl($_product) ?>','<?php echo $_product->getId()?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button></p>

                        <?php } else { ?>
                            <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="showOptions('<?php echo $_product->getId()?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
                            <a href='<?php echo $this->getUrl('ajax/index/options',array('product_id'=>$_product->getId()));?>' class='fancybox' id='fancybox<?php echo $_product->getId()?>' style="display: none;" ><?php echo $this->__('Add to Cart') ?></a>
                        <?php }  ?>
            <?php else: ?>
            <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
            <?php endif; ?>            
        </div>
    </li>
<?php endforeach; ?>
</ol>
<script type="text/javascript">decorateList('products-list', 'none-recursive')</script>

<?php else: ?>

<?php // Grid Mode ?>

<?php $_collectionSize = $_productCollection->count() ?>
<?php $_columnCount = $this->getColumnCount(); ?>
<?php $i=0; foreach ($_productCollection as $_product): ?>
    <?php if ($i++%$_columnCount==0): ?>
    <ul class="products-grid">
    <?php endif ?>
        <li class="item<?php if(($i-1)%$_columnCount==0): ?> first<?php elseif($i%$_columnCount==0): ?> last<?php endif; ?>">
            <?php if($_product->getRatingSummary()): ?>
                <?php echo $this->getReviewsSummaryHtml($_product, 'short') ?>
            <?php endif; ?>
            <?php $newFromDate = $_product->getNewsFromDate(); ?>
            <?php $newToDate = $_product->getNewsToDate(); ?>                                               
            <?php if($newFromDate < $now && $newToDate > $now): ?>
                    <div class="newproduct_grid"><?php echo $this->__('New Product') ?></div>
            <?php endif; ?>
            <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(220); ?>" width="220" height="220" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" /></a>
            <div id="productimgover<?php echo $_product->getId()?>" style="display: none;"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(64); ?>" width="64" height="64" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" /></div>
            <div class="moreinfo">
                <h2 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($_product->getName(), null, true) ?>"><?php echo $_helper->productAttribute($_product, $_product->getName(), 'name') ?></a></h2>
                <div id='productname<?php echo $_product->getId()?>' style='display:none'><?php echo $_helper->productAttribute($_product, $_product->getName(), 'name') ?></div>
                <?php echo $this->getPriceHtml($_product, true) ?>
                    <?php if($_product->isInStock()): ?>
                        <?php if ( !($_product->getTypeInstance(true)->hasRequiredOptions($_product) || $_product->isGrouped()) ) { ?>
                            <p><button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocationAjax('<?php echo $this->getAddToCartUrl($_product) ?>','<?php echo $_product->getId()?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button></p>

                        <?php } else { ?>
                            <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="showOptions('<?php echo $_product->getId()?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
                            <a href='<?php echo $this->getUrl('ajax/index/options',array('product_id'=>$_product->getId()));?>' class='fancybox' id='fancybox<?php echo $_product->getId()?>' style="display: none;" ><?php echo $this->__('Add to Cart') ?></a>
                        <?php }  ?>
                    <?php else: ?>
                        <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
                    <?php endif; ?>
                    <div class="clear"></div>
                    <ul class="add-to-links">
                        <?php if ($this->helper('wishlist')->isAllow()) : ?>
                            <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__('Add to Wishlist') ?></a></li>
                        <?php endif; ?>
                        <?php if($_compareUrl=$this->getAddToCompareUrl($_product)): ?>
                            <li><span class="separator">|</span> <a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__('Add to Compare') ?></a></li>
                        <?php endif; ?>
                    </ul>
                    <div class="clear"></div>
            </div>
        </li>
    <?php if ($i%$_columnCount==0 || $i==$_collectionSize): ?>
    </ul>
    <?php endif ?>
    <?php endforeach ?>
    <script type="text/javascript">decorateGeneric($$('ul.products-grid'), ['odd','even','first','last'])</script>

<?php endif; ?>
    <script type="text/javascript">
    jQuery.noConflict();
    jQuery('.fancybox').fancybox({
        hideOnContentClick : true,
        width: 582,
        autoDimensions: true,
        type : 'iframe',
        showTitle: false,
        scrolling: 'no',
        onComplete: function(){ //Resize the iframe to correct size
        jQuery('#fancybox-frame').load(function() { // wait for frame to load and then gets it's height
            jQuery('#fancybox-content').height(jQuery(this).contents().find('body').height()+30);
            jQuery.fancybox.resize();
         });

        }
    });        
    function showOptions(id){
        jQuery('#fancybox'+id).trigger('click');
    }
    function setAjaxData(data,iframe){
        if(data.status == 'ERROR'){
            alert(data.message);
        }else{
            if(jQuery('.block-cart')){
                jQuery('.block-cart').replaceWith(data.sidebar);
            }
            if(jQuery('.header .block-cart-header')){
                jQuery('.header .block-cart-header').replaceWith(data.topcart);
            } 
            jQuery.fancybox.close();
        }
    }
    function setLocationAjax(url,id){
        url += 'isAjax/1';
        url = url.replace("checkout/cart","ajax/index");
        var msgHtml;
        var productImg = jQuery('#productimgover' + id).html();
        var windowOver = jQuery('#addedoverlay');
        var windowBox = jQuery('#added');
        var titleForBox = jQuery('#productname' + id).text();
        windowOver.show();
        windowBox.show().css({
            backgroundImage: "url('<?php echo $this->getSkinUrl('images/loading.gif')?>')"
        });
        try {
            jQuery.ajax( {
                url : url,
                dataType : 'json',
                success : function(data) {
                    if(data.status == 'SUCCESS'){    
                        msgHtml = '<div style="float:left;">' + productImg + '</div><em>' + titleForBox + '</em> <?php echo $this->__('was successfully added to your shopping cart.') ?><div style="clear:both;"></div><a id="hidewindow" href="javascript:void(0);"><?php echo $this->__('Continue shopping') ?></a>&nbsp;<a href="<?php echo $this->getUrl('checkout/cart')?>"><?php echo $this->__('View cart & checkout') ?></a>';             
                    }else{
                        msgHtml = '<p class="error-msg" style="margin-bottom:15px;">' + data.message + '</p><a id="hidewindow" href="javascript:void(0);"><?php echo $this->__('Continue shopping') ?></a>&nbsp;<a href="<?php echo $this->getUrl('checkout/cart')?>"><?php echo $this->__('View cart & checkout') ?></a>';
                    }            
                    setAjaxData(data,false);

                    windowBox.css({
                          backgroundImage: 'none'
                    }).html(msgHtml);                      
                    windowOver.one('click',function(){
                        hidewindow(windowBox,windowOver);                    
                    });        

                    jQuery('#hidewindow').click(function(){
                        hidewindow(windowBox,windowOver);                    
                    });                        
                }
            });
        } catch (e) {
        }
    }
    function hidewindow(windowBox,windowOver){
        windowOver.fadeOut(400);
        windowBox.fadeOut(400).html('');    
    }        
    </script>
<div class="toolbar-bottom">
    <?php echo $this->getToolbarHtml() ?>
</div>

Ricardo Martins
  • 5,702
  • 3
  • 40
  • 59
user1527556
  • 65
  • 2
  • 6

3 Answers3

5

Based on the answer here but adding neq no_selection this should get you the products with images only.

//this builds a collection that's analagous to 
//select * from products where image != 'no_selection'
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('image', array('neq' => 'no_selection'));

foreach($products as $product)
{

}    

in product list page, you could do something like this:

//$_productCollection=$this->getLoadedProductCollection();
$_productCollection = clone $this->getLoadedProductCollection();
$_productCollection->clear()
                   ->addAttributeToFilter('image', array('neq' => 'no_selection'))
                   ->load();

EDIT

The getLoadedProductCollection collection already loaded, so it needs to be cloned, cleared then loaded. See here

Community
  • 1
  • 1
Dreaded semicolon
  • 2,274
  • 1
  • 28
  • 43
  • Anyone Please? I really need to get this done. Please help me. – user1527556 Jul 17 '12 at 15:18
  • I updated my answer. sorry the previous code wouldn't work because the collection already loaded. the new one should work for you, I tested it. – Dreaded semicolon Jul 18 '12 at 02:14
  • No problem. glad it worked for you. Please mark it as an answer if it worked for you. – Dreaded semicolon Jul 18 '12 at 16:42
  • @Dreadedsemicolon This worked for a while, but for some reason it stopped working and I am now seeing product with images on my list pages, any guess why this code might not work? – shnozolla Jan 08 '13 at 23:23
  • Not sure, especially with Magento lots of factors could be in play, have you upgraded? have you installed any new plugin? did you switch template? i think it would be better if it was in a separate question and then you could provide more details. – Dreaded semicolon Jan 09 '13 at 17:08
0

I tried the solution by Dreaded Semicolon and it worked nicely, they I noticed that it had stopped working. Moreover, I noticed it worked sometimes and then inexplicably stopped working at random.

My guess is this has something to do with the Model and perhaps only sometimes does it make the main image available for the product collection (that would explain why sometimes it works and sometimes not.)

At any rate, if you are having trouble with the solution, and notice that your products without images are still showing, simply try the following:

Replace:

'image'

With:

'small_image'

like so:

//$_productCollection=$this->getLoadedProductCollection();
$_productCollection = clone $this->getLoadedProductCollection();
$_productCollection->clear()
                   ->addAttributeToFilter('small_image', array('neq' => 'no_selection'))
                   ->load();

You can also try R.S's answer where he adds the image to the page via XML. You may have to also add all attributes to the collection using:

->addAttributeToSelect('*')
Community
  • 1
  • 1
shnozolla
  • 468
  • 10
  • 20
0

Mine is Magento 1.8.0.1 and I did these:

  1. Added:

$collection->addAttributeToFilter('small_image', array('neq' => "no_selection"));

to line # 157 in /app/code/core/Mage/Catalog/Block/Product/List.php(For paging to reflect the filtering) and copied it to Folder: /app/code/local/Mage/Catalog/Block/Product/(local changes)

  1. Then Admin > Configuration > Catalog > Frontend > Use Flat Catalog Product to "No"

Since this filtering is not compatible with the use of "Flat Catalog Product"

Binod Kalathil
  • 1,939
  • 1
  • 30
  • 43