在组件中使用过滤器是一件很常见的功能。比喻我们在文件中按照条件过滤来找到我们需要的文章。在本节中,我们将介绍如何在joomla中使用过滤器。
下面是一个ZMAX超级汉化组件的截图,这个截图就用到了两个过滤器,一个状态过滤器,一个是类型过滤器。另外还用到了搜索功能。
下面我们就分别看看这两个功能是如何实现的。
搜索
我们需要解决的第一个问题是在界面上产生这些元素。非常的简单,直接修改项目的视图页面。直接在该视图中加上相应的代码就行了
<fieldset id="filter-bar"> <!-- 搜索 过滤--> <div class="filter-search fltlft"> <label class="filter-search-lbl" for="filter_search">搜索</label> <input type="text" name="filter_search" id="filter_search" value="<?php echo $searchVal;?>" title="搜索" /> <button type="submit"><?php echo JText::_("JSEARCH_FILTER_SUBMIT");?></button> <button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR');?></button> </div> <!-- 搜索结束--> <div class="filter-select fltrt"> <select name="filter_state" class="inputbox" onchange="this.form.submit()"> <option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option> <?php echo JHtml::_('select.options',SuperHHHelper::stateOptions(),'value','text',$this->state->get('filter.state'),true);?> </select> <select name="filter_type" class="inputbox" onchange="this.form.submit()"> <option value="">选择扩展类型</option> <?php echo JHtml::_('select.options',SuperHHHelper::typeOptions(),'value','text',$this->state->get('filter.type'),true);?> </select> </div> </fieldset>
上面的代码理解起来并不困难。重点有两个地方。
第一是清除功能的实现。系统响应了onClick消息。使用document.id('filter_search').value=""来清空搜索框中的值,然后使用this.form.submit()方法提交表单。
第 二是搜索框中的值的保存。当点击搜索,系统会依据搜索的条件来刷新页面。为了更好的用户体验,我们需要在搜索框中保存上次用户搜索的值。在上面的代码 中,value="<?php echo $searchVal;?>;"就实现了这个功能。很明显这需要在页面间传递参数。如果继续深究,$searchVal =$this->escape($this->state->get('filter.search')); 实际上他是从sesion中读取的值。有关session的详细使用,可以参考本站的相应文章。
在上面的代码中,我们可以总结出两点。1,我们可以用this.form.submit()方法来提交表单 2,我们可以用session来实现在不同页面间传递参数。
完成了上面的部分,我们只完成了一半,还需要继续处理后台。
剩下的部分就是在后台获得需要搜索的值,然后在后台获取结果集的SQL中加入刚才的过滤器进行模糊匹配。这就是大体的思路。
思路清楚了,那么我们首先需要修改的地方就是模型了。代码相对简单:
//通过搜索过滤 $search = $this->getState('filter.search'); if(!empty($search)) { $query->where('LOWER(name) LIKE "%'.$search.'%"'); }
无需多说,代码已经表名意图了。
理论上做完这些就可以实现我们想要的搜索功能了。但实际上却并不是这样的。我们还需要做一些其他的事情,就是更新状态变量。至于说为什么要这么做,现在还不清楚。
我们需要在模型中实现一个方法,这个方法的名称为:populateState.这个方法的被系统自动调用。
protected function populateState($ordering = null ,$direction = null) { //初始化变量 $app = JFactory::getApplication("administrator"); //加载过滤状态变量 搜索 $search = $this->getUserStateFromRequest($this->context.'.filter.search','filter_search'); $this->setState('filter.search' ,$search); //加载过滤状态变量 发布 $published = $this->getUserStateFromRequest($this->context.'.filter.state','filter_state','','string'); $this->setState('filter.state',$published); $type = $this->getUserStateFromRequest($this->context.'.filter.type','filter_type'); $this->setState('filter.type',$type); parent::populateState('extension_id' ,'asc'); }
如果你看过本网站介绍的session相关的章节。那么你大体可以猜想出这代代码在干什么了。这段代码主要是用Request中的参数来更新Session中用户状态的一些值。
到此。搜索功能就可以使用了。
我们在下一节中将会继续介绍过滤器。
评论 (0)