我们以 catalog_category_layered 控制器为例说明
在catalog.xml 找到catalog_category_layered配置段
empty 6 one_column 5 two_columns_left 4 two_columns_right 4 three_columns 3 product_list_toolbar
其中catalog/product_list是产品显示的block,而catalog/product_list_toolbar是控制产品排序和分页功能的Block,而把这两个block联系起来的关键就是
product_list_toolbar
下面来看下实现排序、分页功能的步骤
1、根据配置文件实例化catalog/product_list Block并调用setToolbarBlockName方法设置ToolbarBlock的名字
2、在catalog/product_list block类(Mage_Catalog_Block_Product_List)的_beforeToHtml()方法中实例化ToolbarBlock,并对产品做排序和分页
protected function _beforeToHtml() { $toolbar = $this->getToolbarBlock();//实例化ToolbarBlock // called prepare sortable parameters $collection = $this->_getProductCollection();//获取产品集合 // use sortable parameters if ($orders = $this->getAvailableOrders()) { $toolbar->setAvailableOrders($orders); } if ($sort = $this->getSortBy()) { $toolbar->setDefaultOrder($sort); } if ($dir = $this->getDefaultDirection()) { $toolbar->setDefaultDirection($dir); } if ($modes = $this->getModes()) { $toolbar->setModes($modes); } // set collection to toolbar and apply sort $toolbar->setCollection($collection);//用ToolbarBlock实例对产品集合排序和分页 $this->setChild('toolbar', $toolbar);//设置ToolbarBlock实例为当前Block的Child,在显示的时候会有用 Mage::dispatchEvent('catalog_block_product_list_collection', array( 'collection' => $this->_getProductCollection() )); $this->_getProductCollection()->load(); return parent::_beforeToHtml(); }
$toolbar->setCollection($collection);
是如何实现排序和分页功能呢,来看这个方法就知道了,打开Mage_Catalog_Block_Product_List_Toolbar类
public function setCollection($collection) { $this->_collection = $collection;//对象引用 $this->_collection->setCurPage($this->getCurrentPage()); // we need to set pagination only if passed value integer and more that 0 $limit = (int)$this->getLimit(); if ($limit) { $this->_collection->setPageSize($limit); }//分页功能 if ($this->getCurrentOrder()) { $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection()); }//排序功能 return $this; }
3、显示
在product list 的phtml文件中调用Mage_Catalog_Block_Product_List类的getToolbarHtml()方法
getToolbarHtml() ?>
public function getToolbarHtml() { return $this->getChildHtml('toolbar');//显示它的Child Block 与_beforeToHtml()中的$this->setChild('toolbar', $toolbar);相对应 }