Magento – Call to a member function getSize() on a non-object

magento-1.7product

I Use Mobile Shoppe Theme And i add

{{block type="catalog/product_list" name="home.catalog.product.list" alias="products_homepage" template="catalog/product/list.phtml"}}

to display all the products in the front page. But i get this error

Fatal error: Call to a member function getSize() on a non-object in
/home/sree16/public_html/magento/app/design/frontend/default/mobileshoppe/template/catalog/product/list/toolbar_top.phtml
on line 34

Any help would be appreciated.

toolbar_top.phtml

<?php 
/**  
 * Magento 
 * 
 * NOTICE OF LICENSE 
 * 
 * This source file is subject to the Academic Free License (AFL 3.0) 
 * that is bundled with this package in the file LICENSE_AFL.txt. 
 * It is also available through the world-wide-web at this URL: 
 * http://opensource.org/licenses/afl-3.0.php 
 * If you did not receive a copy of the license and are unable to 
 * obtain it through the world-wide-web, please send an email 
 * to license@magentocommerce.com so we can send you a copy immediately. 
 * 
 * DISCLAIMER  * 
 * Do not edit or add to this file if you wish to upgrade Magento to newer 
 * versions in the future. If you wish to customize Magento for your 
 * needs please refer to http://www.magentocommerce.com for more information. 
 * 
 * @category    design 
 * @package     base_default 
 * @copyright   Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com) 
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL3.0) 
 */ 
?> 
<?php 
/** 
 * Product list toolbar 
 * 
 * @see Mage_Catalog_Block_Product_List_Toolbar 
 */ 
?>
<?php
if($this->getCollection()->getSize()): ?> <div class="toolbar">
    <?php if( $this->isExpanded() ): ?>
    <div class="sorter">
        <?php if( $this->isEnabledViewSwitcher() ): ?>
        <p class="view-mode">
            <?php $_modes = $this->getModes(); ?>
            <?php if($_modes && count($_modes)>1): ?>
            <label><?php echo $this->__('View as') ?>:</label>
            <?php foreach ($this->getModes() as $_code=>$_label): ?>
                <?php if($this->isModeActive($_code)): ?>
                    <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
                <?php else: ?>
                    <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code);
?>"><?php echo $_label ?></a>&nbsp;
                <?php endif; ?>
            <?php endforeach; ?>
            <?php endif; ?>
        </p>
        <?php endif; ?>

                 <div class="limiter">
            <label><?php echo $this->__('Show') ?></label>
            <select onchange="setLocation(this.value)">
            <?php foreach ($this->getAvailableLimit() as  $_key=>$_limit): ?>
                <option value="<?php echo $this->getLimitUrl($_key) ?>"<?php if($this->isLimitCurrent($_key)): ?> selected="selected"<?php
endif ?>>
                    <?php echo $_limit ?>
                </option>
            <?php endforeach; ?>
            </select> <?php echo $this->__('per page') ?>
        </div>

        <div class="sort-by">
            <label><?php echo $this->__('Sort By') ?></label>
            <select onchange="setLocation(this.value)">
            <?php foreach($this->getAvailableOrders() as $_key=>$_order): ?>
                <option value="<?php echo $this->getOrderUrl($_key, 'asc') ?>"<?php if($this->isOrderCurrent($_key)): ?>
selected="selected"<?php endif; ?>>
                    <?php echo $this->__($_order) ?>
                </option>
            <?php endforeach; ?>
            </select>
            <?php if($this->getCurrentDirection() == 'desc'): ?>
                <a href="<?php echo $this->getOrderUrl(null, 'asc') ?>" title="<?php echo $this->__('Set Ascending Direction') ?>"><img
src="<?php echo $this->getSkinUrl('images/i_desc_arrow.gif') ?>"
alt="<?php echo $this->__('Set Ascending Direction') ?>"
class="v-middle" /></a>
            <?php else: ?>
                <a href="<?php echo $this->getOrderUrl(null, 'desc') ?>" title="<?php echo $this->__('Set Descending Direction') ?>"><img
src="<?php echo $this->getSkinUrl('images/i_asc_arrow.gif') ?>"
alt="<?php echo $this->__('Set Descending Direction') ?>"
class="v-middle" /></a>
            <?php endif; ?>
        </div>
    </div>
    <?php endif; ?> </div> <?php endif ?>

Best Answer

I believe the issue here is that the toolbar_top.phtml file expects to be instanced with a different block:

{{block type="catalog/product_list" name="home.catalog.product.list" alias="products_homepage" template="catalog/product/list.phtml"}}

Should be:

{{block type="catalog/product_list_toolbar" name="home.catalog.product.list.toolbar.top" alias="products_homepage" template="catalog/product/list.phtml"}}

The reason for this is that Mage_Catalog_Block_Product_List_Toolbar has a method called getCollection, where Mage_Catalog_Block_Product_List does not.

The fluent interface (chained method call) receives null from getCollection, and therefore getSize is being called on a non-object.