0

On Product List page I added a filter Sort By:

  • Newest Products
  • Popularity
  • Name From A-Z
  • Name From Z-A
  • Price - Low to High
  • Price - High to Low

everything is functioning properly

but comes the problem when filter Results per Page (Show / limit how many products per page). I set 12, 24, 36, All.

Before I add Sort by Newest Products, all functioning normally include Show / product limit per page. Related to Sort by Newest Products, I added this new/custom code below <? Php echo $ this-> getToolbarHtml ()?> to the list of products in the Grid view:

<?php
    if($currentCategoryId){
        $order = Mage::getSingleton('catalog/session')->getSortOrder();
        $direction = Mage::getSingleton('catalog/session')->getSortDirection();
        $display = Mage::getSingleton('catalog/session')->getDisplayMode();
        $limit = Mage::getSingleton('catalog/session')->getLimitPage();

         if($order == 'name') {
            if($direction == '') {
                $direction = 'asc';
            }                
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)                                          
                 ->setOrder('name', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($limit);

            //echo $_productCollection->getSelect();
            //$_productCollection->printLogQuery(true);
         }

         if($order == 'price') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('price', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($limit);
         }

         if($order == 'position') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('position', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($limit);
         }

         if($order == '') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('news_from_date', 'desc')
                 ->setOrder('created_at', 'desc')//;
                 ->setPageSize($limit)
                 ->setCurPage($limit);
        }
    }

?>

The full code (andi\app\design\frontend\rwd\default\template\catalog\product\list.phtml) can be found at Pastebin : http://pastebin.com/U5UpgUmj

Page Limit does not function. When I click on page 1, it will look like in figure 1. By the time I click on page 2, it will look like Figure 2 (image Page 2 - Error), where the picture repeats a number of 12. It should be on page 2 (image Page 2 - Should), which appear only 7 product images in page 2 ( from total of 19 products).

Limit Product per Page

I had read this tutorial : https://www.creare.co.uk/blog/magento/limiting-collection-size-in-magento and try to use it.

How to limit per-page to function properly? Where is the error in my code?

2 Answers 2

1

Try this

setCurPage() should be current page value

 if($currentCategoryId){
        $order = Mage::getSingleton('catalog/session')->getSortOrder();
        $direction = Mage::getSingleton('catalog/session')->getSortDirection();
        $display = Mage::getSingleton('catalog/session')->getDisplayMode();
        $limit = Mage::getSingleton('catalog/session')->getLimitPage();
        // Default name for page number is p

$currentPage = (int) ($this->getRequest()->getParam('p')) ? $this->getRequest()->getParam('p') : 1;

         if($order == 'name') {
            if($direction == '') {
                $direction = 'asc';
            }                
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)                                          
                 ->setOrder('name', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($currentPage);

            //echo $_productCollection->getSelect();
            //$_productCollection->printLogQuery(true);
         }

         if($order == 'price') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('price', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($currentPage);
         }

         if($order == 'position') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('position', $direction)//;
                 ->setPageSize($limit)
                 ->setCurPage($currentPage);
         }

         if($order == '') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('news_from_date', 'desc')
                 ->setOrder('created_at', 'desc')//;
                 ->setPageSize($limit)
                 ->setCurPage($currentPage);
        }
    }
8
  • Hi @minesh-patel, thank you for your quick response.I've tried but still was not successful. even if you choose All choice, the products only show 1 product that appear. Dec 8, 2015 at 4:31
  • check parameter name for page number is p ? Dec 8, 2015 at 4:38
  • and where you have implemented this in toolbar block ? Dec 8, 2015 at 4:39
  • Yes, parameter name for page number is p. sd.local.web/football/footwear.html?p=2. I implemented this in list.phtml, below <? Php echo $ this-> getToolbarHtml ()?> code. Dec 8, 2015 at 7:16
  • Your way is completely wrong Dec 8, 2015 at 7:42
0

@minesh-patel, after trying several times I finally get a code like this:

(without override / rewrite)

//Category and Limit Page

<?php

$cat = Mage::app()->getRequest()->getParam('cat');

$_category = Mage::registry('current_category');

if($cat == '')

$currentCategoryId = $_category->getId();

else

$currentCategoryId = $cat;

$limit = Mage::getSingleton('catalog/session')->getLimitPage();
if($limit == ""){ $limit = Mage::getStoreConfig('catalog/frontend/grid_per_page'); }

?>
<!-- No Product -->
<?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();

$current_page = Mage::getBlockSingleton('page/html_pager')->getCurrentPage();

?>

//layered navigation handling by attribute

$price = Mage::app()->getRequest()->getParam('price');
        $class = Mage::app()->getRequest()->getParam('class');
        $silos = Mage::app()->getRequest()->getParam('silos');

        if($price != ''){
            $arr_price = explode('-',$price);

            if($arr_price[1] == '')
                $_productCollection->addAttributeToFilter('price',array('from'=> $arr_price[0]));
            else
                $_productCollection->addAttributeToFilter('price',array('from'=> $arr_price[0], 'to' => $arr_price[1]));
        }

        if($class != ''){
            //$_productCollection->addAttributeToSelect('class');
            $_productCollection->addAttributeToFilter('class', $class);
        }

        if($silos != ''){
            $_productCollection->addAttributeToFilter('silos', $silos);
        }
    }

    if($limit != 'all'){
        $_productCollection->setPageSize($limit)->setCurPage($current_page);
    }

here the full code :

<?php
/**
* Product list template
*
* @see Mage_Catalog_Block_Product_List
*/
/* @var $this Mage_Catalog_Block_Product_List */
?>
<?php

$cat = Mage::app()->getRequest()->getParam('cat');
$_productCollection=$this->getLoadedProductCollection();

$_category = Mage::registry('current_category');
if($cat == '')
    $currentCategoryId = $_category->getId();
else
    $currentCategoryId = $cat;

$limit = Mage::getSingleton('catalog/session')->getLimitPage();        

if($limit == ""){
    $limit = Mage::getStoreConfig('catalog/frontend/grid_per_page');
}

?>
<!-- No Product -->
<?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();
    $current_page = Mage::getBlockSingleton('page/html_pager')->getCurrentPage();        
?>

<?php
    if($currentCategoryId){
        $order = Mage::getSingleton('catalog/session')->getSortOrder();
        $direction = Mage::getSingleton('catalog/session')->getSortDirection();
        $display = Mage::getSingleton('catalog/session')->getDisplayMode();

         if($order == 'name') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('name', $direction);
         }

         if($order == 'price') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('price', $direction);
         }

         if($order == 'position') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('position', $direction);
         }

         if($order == '') {
            if($direction == '') {
                $direction = 'asc';
            }
            $_productCollection = Mage::getModel('catalog/category')->load($currentCategoryId)
                 ->getProductCollection()
                 ->addAttributeToSelect('*')
                 ->addAttributeToFilter('status', 1)
                 ->addAttributeToFilter('visibility', 4)
                 ->setOrder('news_from_date', 'desc')
                 ->setOrder('created_at', 'desc');
        }

        //layered navigation handling
        //price
        $price = Mage::app()->getRequest()->getParam('price');
        $class = Mage::app()->getRequest()->getParam('class');
        $silos = Mage::app()->getRequest()->getParam('silos');

        if($price != ''){
            $arr_price = explode('-',$price);

            if($arr_price[1] == '')
                $_productCollection->addAttributeToFilter('price',array('from'=> $arr_price[0]));
            else
                $_productCollection->addAttributeToFilter('price',array('from'=> $arr_price[0], 'to' => $arr_price[1]));
        }

        if($class != ''){
            $_productCollection->addAttributeToFilter('class', $class);
        }

        if($silos != ''){
            $_productCollection->addAttributeToFilter('silos', $silos);
        }
    }

    if($limit != 'all'){
        $_productCollection->setPageSize($limit)->setCurPage($current_page);
    }

?>
<!-- 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; ?>">
        <!-- Product Image -- >
        <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image">                
            <?php $_imgSize = 300; ?>
            <img id="product-collection-image-<?php echo $_product->getId(); ?>"
                 src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->keepFrame(false)->resize($_imgSize); ?>"
                 alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" />
        </a>
        <!-- Product description -->
        <div class="product-shop">
            <div class="f-fix">
                <div class="product-primary">
                    <?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; ?>
                    <?php
                    if ($this->getChild('name.after')) {
                        $_nameAfterChildren = $this->getChild('name.after')->getSortedChildren();
                        foreach ($_nameAfterChildren as $_nameAfterChildName) {
                            $_nameAfterChild = $this->getChild('name.after')->getChild($_nameAfterChildName);
                            $_nameAfterChild->setProduct($_product);
                            echo $_nameAfterChild->toHtml();
                        }
                    }
                    ?>
                </div>
                <div class="product-secondary">
                    <?php echo $this->getPriceHtml($_product, true) ?>
                </div>
                <div class="product-secondary">
                    <?php if(!$_product->canConfigure() && $_product->isSaleable()): ?>
                        <p class="action"><button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button></p>
                    <?php elseif($_product->getStockItem() && $_product->getStockItem()->getIsInStock()): ?>
                        <p class="action"><a title="<?php echo $this->__('View Details') ?>" class="button" href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->__('View Details') ?></a></p>
                    <?php else: ?>
                        <p class="action availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
                    <?php endif; ?>
                    <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 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>
            </div>
        </div>
    </li>
<?php endforeach; ?>
</ol>
<script type="text/javascript">decorateList('products-list', 'none-recursive')</script>

<?php else: ?>

<!-- Grid Mode -->

<?php $_collectionSize = $_productCollection->count() ?>
<?php
    //$_columnCount = $this->getColumnCount
    $_columnCount = 4;
?>
<ul class="products-grid ali-grid products-grid--max-<?php echo $_columnCount; ?>-col">
    <?php $i=0;
    foreach ($_productCollection as $_product): ?>            
        <li class="item<?php if(($i-1)%$_columnCount==0): ?> first<?php elseif($i%$_columnCount==0): ?> last<?php endif; ?>">

            <div class="img-prod">
                <?php                    
                if($_product->getSpecialPrice()):
                ?>
                <div class="embel-embel sale"><?php echo $this->__('Sale')?><span class="sale"></span></div>
                <?php endif;?>
                <?php                    
                    $date = date("Y-m-d 00:00:00");
                    $newtodate = $_product['news_to_date'];
                    $newfromdate = $_product['news_from_date'];

                    if (isset($newfromdate) and isset($newtodate) and $date >= $newfromdate and $date <= $newtodate) :
                ?>                                         
                <div class="embel-embel new"><?php echo $this->__('New')?><span class="new"></span></div>

                <?php
                    elseif(isset($newfromdate)):
                ?>
                <div class="embel-embel new"><?php echo $this->__('New')?><span class="new"></span></div>
                <?php endif;?>
                <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image">
                    <?php $_imgSize = 210; ?>
                    <img id="product-collection-image-<?php echo $_product->getId(); ?>"
                         src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(238,317); ?>"
                         alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" />
                </a>
            </div>
            <div class="product-info">
                <div class="prod-title"><?php echo $this->helper('catalog/output')->productAttribute($_product, $_product->getName() , 'name') ?></div>
                <h2 style="display:none" class="product-name"><a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($_product->getName(), null, true) ?>"><?php echo $this->helper('catalog/output')->productAttribute($_product, $_product->getName(), 'name') ?></a></h2>
                <?php

                ?>
                <?php echo $this->getPriceHtml($_product, true) ?>

                <div class="actions" style="display:none">
                    <?php if(!$_product->canConfigure() && $_product->isSaleable()): ?>
                        <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
                    <?php elseif($_product->getStockItem() && $_product->getStockItem()->getIsInStock()): ?>
                        <a title="<?php echo $this->__('View Details') ?>" class="button" href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->__('View Details') ?></a>
                    <?php else: ?>
                        <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
                    <?php endif; ?>
                    <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>
        </li>

    <?php endforeach ?>
</ul>
<script type="text/javascript">decorateGeneric($$('ul.products-grid'), ['odd','even','first','last'])</script>
<?php endif; ?>

<div class="toolbar-bottom">
    <?php echo $this->getToolbarHtml() ?>
</div>
</div>
<?php endif; ?>
<?php
// Provides a block where additional page components may be attached, primarily good for in-page JavaScript
if ($this->getChild('after')) {
$_afterChildren = $this->getChild('after')->getSortedChildren();
foreach ($_afterChildren as $_afterChildName) {
    $_afterChild = $this->getChild('after')->getChild($_afterChildName);
    //set product collection on after blocks
    $_afterChild->setProductCollection($_productCollection);
    echo $_afterChild->toHtml();
}
}
?>

or you can see it in here : http://pastebin.com/3bcAUSv2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.