教程栏目

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升级