教程栏目

joomla中文网出品的官方教程

正与很多其他的joomla组件一样,我们的组件也需要对记录进行分页。在本节中,就要解决这个问题。

 joomla已经为我们实现了一个分页的类---JPagination.这个类的实现文件是/libraies/joomla/html/pagination.php。

这个类的构造函数需要3个参数,分别是:

$total            需要显示的记录的总数

$limitstart      从哪一页开始显示

$limit            每页显示的数量

 只要能够准确的提供这3个变量,那么就可以成功在我们的组件中实现分页功能。

修改模型文件messagelist.php

 

//后台的messagelist的模型类
defined('_JEXEC') or die('Restricted Access');

jimport('joomla.application.component.model');
//jimport('joomla.application.component.modellist');

class GuestbookModelMessageList extends JModel
{
	/**
	 *	Items total
	 *  @var int
	 */
	 var $_total = null;
	 
	 /**
	  *	pagination object
	  *	@var object
	  */
	  var $_pagination = null;
	  
	 //构造函数 设置了 开始页和每页显示的数目
	  function __construct()
	  {
		parent::__construct();
		$mainframe = JFactory::getApplication();
		
		// Get pagination request variables
		$limit = $mainframe->getUserStateFromRequest('global.list.limit','limit',$mainframe->getCfg('list_limit'),'int');
		$limitstart = JRequest::getInt('limitstart',0);
		
		// In case limit has been changed ,adjust it
		$limitstart = ($limit!=0?(floor($limitstart / $limit)*$limit):0);
		
		$this->setState('limit',$limit);
		$this->setState('limitstart',$limitstart);
	  }
	  
	/**
	 *	Get a Pagination Object
	 *
	 *  @access public
	 *  @return JPagination
	 */
	 function getPagination()
	 {
		// Load the content if it doesn't exist
		if(empty($this->_pagination))
		{
			jimport('joomla.html.pagination');
			$this->_pagination = new JPagination($this->getTotal(),$this->getState('limitstart'),$this->getState('limit'));
		}
		return $this->_pagination;
	 }
	 
	 /**
	  *	Get Number of items
	  *
	  * @access public
	  * @return interger
	  */
	  function getTotal()
	  {
		// load the content if it does't already exist
		if(empty($this->_total))
		{
			$query = $this->getListQuery();
			//JModel::_getListCount Return a record count for the query 
			$this->_total = $this->_getListCount($query);
		}
		return $this->_total;
	  }
		
	/**
	 * 从数据库中获取数据
	 *
	 * @access public
	 * @return messages
	 *
	 */
	 
	 function getMessages()
	 {
		$query = $this->getListQuery();
		
		$db = & JFactory::getDBO();
		$db->setQuery((string)$query);
		// JModel::_getList Get an array of objects from the result of database query
		//  _getList($query,$limitstart = 0, $limit = 0)
		$messages = $this->_getList($query,$this->getState('limitstart'),$this->getState('limit'));
		return $messages;
	 }

	 function getListQuery()
	 {
		$db = & JFactory::getDBO();
		
		$query = $db->getQuery(true);
		
		$query->select("*")->from( $db->nameQuote('#__guestbook'));
		
		return $query;
	 }
	
	 function publishMessage()
	 {

		$cids = JRequest::getVar('cid',array(0),'post','array');
		
		//将数组变为字符串的形式,以","分割
		$idstr = implode(",",$cids);
	
		$db = &JFactory::getDBO();
		$query = $db->getQuery(true);
		
		$query->update($db->nameQuote('#__guestbook'))->set($db->nameQuote('message_publish')." = 1 ")->where($db->nameQuote('message_id')."in (".$idstr.")");
	
		
		$db->setQuery((string)$query);
		//既然成功执行了 ,为什么还有一个警告
		
		//$db->query()方法成功返回 查询的结果 失败返回false
		if(!$db->query())
		{
			return false;
		}
		return true;
	 }
}

相比以前的代码,我们只做了少许改动。目的就是要成功的实例化一个JPagination对象。

首先,增加了两个变量,$_total,用来表示共有的记录数。$_pagination表示分页对象。并且我们也实现了构造函数。在构造函数中:

$limit = $mainframe->getUserStateFromRequest('global.list.limit','limit',$mainframe->getCfg('list_limit'),'int'); 这段代码得到每页显示的多少,首先在URL中检查,如果找不到,就用系统默认配置的值。

得到每页的显示的数目,和开始显示的页数后,我们将这个两个值放到了seesion中,储存起来。

$this->setState('limit',$limit);

$this->setState('limitstart',$limitstart);

 这个两行代码正是完成这个功能。

由于在多个地方使用到了查询语句,因此单独写一个getListQuery()函数,将它封装起来。

最后,在getPagination中new 一个JPagination对象并返回该对象。

修改了模型,也要对视图类做一点修改:

 
 function display($tpl = null)	 
	 {
		// add required JS
		JHtml::_('behavior.framework');
		$this->pagination = $this->get('Pagination');
		$messages = & $this->get('Messages');
		
		$this->assignRef('messages',$messages);
		
		// add toolbar
		$this->addToolBar();
		//display the template
		parent::display($tpl);
	 }

在视图类中,我们首先加载必要的js文件。JHtml::_('behavior.framework');就是完成这项工作。然后调用get方法得到JPagination对象。

完成这些之后,最后需要做的就是修改视图模板。在模板中显示分页,需要修改的地方也很少,我们只需要在table中再加一行,就行了。

 <tfoot>
            <td colspan="8">
                <?php echo $this->pagination->getListFooter();?>
            </td>
    </tfoot>

这样就完成了。getListFooter方法是Jpagination提供的一个方法,她将产生出我们需要的分页效果。

看一下实现后的效果:

 

至此分页功能已成功实现。当然在J25中实现分页功能其实不用这么麻烦的。我们只需要要让我们的类直接派生自JModelList就自动实现了Jpagination类了。

以后再做介绍。

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器