教程栏目

joomla中文网出品的官方教程

本节将会为我们的组件增加排序功能。

要实现排序功能,我们需要知道两个东西,一个是根据哪一个字段来排序,另一个是以什么顺序来排序。

首先解决第一个问题,根据哪一个字段来排序?

在joomla中,我们可以用JHtml::_('grid.sort','序号','message_id',$listDirn,$listorder)来标记需要排序的字段。

 第一个参数'grid.sort'是固定的。不能改变。

第二个参数是标题名。这个随便写。

第三个参数是数据库中对应的字段名.这个必须和数据库中的字段名相对于,否则出错。

第四个参数是以什么顺序。我们这里用一个$listDirn变量来表示。

第五个参数是要排序的栏。用$listorder表示(这里可能理解有误)

那么为了让我们的组件可以排序排序,首先来修改一下视图模板,标记可以排序的字段。

修改administrator\componets\com_guestbook\views\messagelist\tmpl\default.php文件


 

<?php
//后台留言板显示留言界面
defined('_JEXEC') or die('你不能直接访问这个文件!');

$listOrder = $this->sortColumn;
$listDirn = $this->sortDirection;


?>

<form action="index.php" method="post" name="adminForm">
<div id="editcell">
<table class="adminlist">
<thead>
<tr>
<th width="20px">
<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->messages);?>)" />
</th>
<?php 
$id = JHtml::_('grid.sort','序号','message_id',$listDirn,$listOrder);
$subject = JHtml::_('grid.sort','主题','message_subject',$listDirn,$listOrder);
$content = JHtml::_('grid.sort','正文','message_content',$listDirn,$listOrder);
$author = JHtml::_('grid.sort','作者','message_author',$listDirn,$listOrder);
$email = JHtml::_('grid.sort','Email','message_author_email',$listDirn,$listOrder);
$publish = JHtml::_('grid.sort','发布','message_publish',$listDirn,$listOrder);
$time = JHtml::_('grid.sort','时间','message_time',$listDirn,$listOrder);
?>
<th> <?php echo $id;?> </th>
<th> <?php echo $subject;?> </th>
<th> <?php echo $content;?> </th>
<th> <?php echo $author;?> </th>
<th> <?php echo $email;?> </th>
<th> <?php echo $publish;?></th>
<th> <?php echo $time;?></th>
</tr>
</thead>
<?php
$n = 0;
foreach ($this->messages as &$message):

$checked = JHTML::_('grid.id',$n,$message->message_id);
$subjectLink = JHTML::_('link','index.php?option=com_guestbook&task=edit&cid='.$message->message_id,$message->message_subject);
$contentLink = JHTML::_('link','index.php?option=com_guestbook&task=edit&cid='.$message->message_id,$message->message_content);
?>
<tr class="<?php echo "row".$n%2; ?>">
<td>
<?php echo $checked;?>
</td>
<td>
<?php echo $message->message_id;?>
</td>
<td>
<?php echo $subjectLink;?>
</td>
<td>
<?php echo $contentLink;?>
</td>
<td>
<?php echo $message->message_author;?>
</td>
<td>
<?php echo $message->message_author_email;?>
</td>
<td>
<?php $published = JHTML::_('grid.published',$message->message_publish,$n);?>
<?php echo $published;?>
</td>
<td>
<?php echo $message->message_time;?>
</td>
</tr>
<?php $n++;?>
<?php endforeach;?>
<tfoot>
<td colspan="8">
<?php echo $this->pagination->getListFooter();?>
</td>
</tfoot>

</table>

</div>

<input type="hidden" name="option" value="com_guestbook"/>
<input type="hidden" name="task" value=""/>
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="filter_order" value="<?php echo $listOrder;?>" />
<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn;?>" />

</form>


上面大代码和以前的代码只修改了三个地方:

1,在开始不为增加了两行代码:

   $listOrder = $this->sortColumn;
   $listDirn = $this->sortDirection;

   这两行代码的意思是从视图类得到要排序的栏 和要排序的方向。

2,将原先直接输出 标题 改为 输出 由JHtml::_()产生的元素。如:$id = JHtml::_('grid.sort','序号','message_id',$listDirn,$listOrder);

这样就可以让标题支持排序了。

3,在最后还增加了两个隐藏的字段 $listOrder ,$listDirn.

这样就能够让系统每次都能过获得当前的排序的字段和方法。

 

修改了视图模版之后我们还需要修改模型。因为我们需要对数据库获取的记录进行排序。

修改administrator\componets\com_guestbook\models\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();
		// 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'));
		
		//增加排序
		if($this->getState('filter_order'))
		{
		//	$query->order($db->getEscaped($this->getState('filter_order','message_id')).' '.$db->getEscaped($this->getState('filter_order_Dir'),'ASC'));
			$query->order($db->getEscaped($this->getState('filter_order', 'message_id')) . ' ' . $db->getEscaped($this->getState('filter_order_Dir', 'ASC')));
		}
		
		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);
		if(!$db->query())
		{
			return false;
		}
		return true;
	 }
	 
	 /**
	  *	Add sorttable columns to a table
	  **/

	  public function populateState()
	  {
		$filter_order = JRequest::getVar('filter_order');
		$filter_order_Dir = JRequest::getVar('filter_order_Dir');
		
		$this->setState('filter_order',$filter_order);
		$this->setState('filter_order_Dir',$filter_order_Dir);
	  }

	
}

我们对模型类的修改也不是很多。只修改了两个地方:

1,修改了getListQuery()方法。

增加了代码:

if($this->getState('filter_order'))
{
$query->order($db->getEscaped($this->getState('filter_order', 'message_id')) . ' ' . $db->getEscaped($this->getState('filter_order_Dir', 'ASC')));
}

这段代码所做的工作就是依据我们传递进去的filter_order和filter_order_Dir来获取数据。默认是按照message_id来进行从小大到排列。

代码写到这个地方,就会对joomla中实现排序的思路非常清新了,我们要做的就是保证传递正确的filter_order(需要排序的字段)和filter_order_Dir(需要排序的顺序)

2,增加了一个方法

 
 public function populateState()
	  {
		$filter_order = JRequest::getVar('filter_order');
		$filter_order_Dir = JRequest::getVar('filter_order_Dir');
		
		$this->setState('filter_order',$filter_order);
		$this->setState('filter_order_Dir',$filter_order_Dir);
	  }

populate state中文的意思是填充状态。它的工作就是保证我们传递正确的filter_order和filter_order_Dir变量。 poplulateState是JModel类的一个方法,是一个空的方法。我们现在对他进行重载。他所做的事情很简单,获得我们表单提交的 filter_order和filter_order_Dir变量的值,然后后传递给JModel类的。

 这样模型类就修改好了。

最后修改一下视图类:

修改administrator\componets\com_guestbook\views\messagelist\view.html.php文件

 defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class GuestBookViewMessageList extends JView
{
     // messagelist view display method
     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();
		
		$state = $this->get('State');
		$this->sortDirection = $state->get('filter_order_Dir');
		$this->sortColumn = $state->get('filter_order');
		//display the template
		parent::display($tpl);
	 }
	 
	 /**
	  * 设置工具栏
	  * 
	  * @access protected
	  */
	  protected function addToolBar()
	  {
		
		JToolBarHelper::title('ZMAX留言板');
		
		//JToolBarHelper::addNew该函数接受两个参数,一个是重载的任务 一个是文本
		JToolBarHelper::addNew();
		JToolBarHelper::editList(); 
		JToolBarHelper::publish();
		JToolBarHelper::unpublish();
		JToolBarHelper::deleteList("确认删除这条信息?");
	  }
}
 

改动非常少,增加了3行代码:

$state = $this->get('State');
$this->sortDirection = $state->get('filter_order_Dir');
$this->sortColumn = $state->get('filter_order');

 首先得到状态,让后将这些状态赋值。

到此,大功告成!看一下执行的效果:

 

 

 

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

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

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划