下拉框过滤器的后台实现思路和搜索功能的思路相差不大。重点是前台如何产生下拉框的代码。
在前面的章节中简单的介绍了一下搜索框的实现。现在我们来看看下拉框的实现。
下拉框前台的实现代码:
<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>
有了上一节的基础,我们很容易的清楚系统提交表单的流程了。系统相应sleect框的onchange 消息,然后调用this.form.submit()方法来实现表单的提交。另外,保存上一次提交的值的操作也相对简 单。$this->state->get(filter.type)就是干这件事的。
看一下重点:
上面代码的重点就是如何产生下拉框的选项的。产生选项的代码如下:
<option value="">选择扩展类型</option> <?php echo JHtml::_('select.options',SuperHHHelper::typeOptions(),'value','text',$this->state->get('filter.type'),true);?>
利 用了JHtml::_()方法,产生了一个slect.options类型的html元素。第二个参数是 SuperHHHelper::typeOptions()。实际上这个他调用了组SuperHHHelper类的typeOptions()方法。这个 类的实现文件位于组件的helper目录下的superhh.php文件中。
关于这个文件的名称和位置,都不重要,因为我们在视图中使用下面的代码加载这个类的:
include_once(JPATH_COMPONENT.'/helpers/superhh.php');
看一下类的实现文件:
class SuperhhHelper { public static $extension = 'com_superhh'; /** * Configure the Linkbar. * * @param string The name of the active view. */ public static function addSubmenu($vName) { // No submenu for this component. } /** * Returns an array of standard published state filter options. * * @return string The HTML code for the select tag */ public static function stateOptions() { // Build the active state filter options. $options = array(); $options[] = JHtml::_('select.option', '1', 'JENABLED'); $options[] = JHtml::_('select.option', '0', 'JDISABLED'); return $options; } public static function typeOptions() { // Build the active state filter options. $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('DISTINCT(type) As value ,type AS text'); $query->from('#__extensions'); $query->order('type'); $db->setQuery($query); $options = $db->loadObjectList(); if($error = $db->getErrorMsg()) { JError::raiseWarning(500,$err); } return $options; } }
代码逻辑非常清楚,从数据库中读取所有的类型,然后返回一个对象数组,之后系统就会搞定剩下的工作。
理解了前台的原理,后台的原理就不啰嗦了,看代码:
protected function getListQuery() { // Create a new query object. $db = $this->getDbo(); $query = $db->getQuery(true); // Select the required fields from the table. $query->select("*"); $query->from($db->quoteName('#__extensions')); $filter_order = JRequest::getVar('filter_order',"extension_id"); $filter_order_Dir = JRequest::getVar('filter_order_Dir',"ASC"); $query->order($db->getEscaped($filter_order)." ".$db->getEsacped($filter_order_Dir)); //通过搜索过滤 $search = $this->getState('filter.search'); if(!empty($search)) { $query->where('LOWER(name) LIKE "%'.$search.'%"'); } //通过状态过滤 $published = $this->getState('filter.state'); if(is_numeric($published)) { $query->where('enabled = '.(int) $published); } //通过类型过滤 $type = $this->getState('filter.type'); if(!empty($type)) { $query->where($db->quoteName('type').' = "'.$type.'"'); } return $query; }
评论 (0)