下拉框过滤器的后台实现思路和搜索功能的思路相差不大。重点是前台如何产生下拉框的代码。
在前面的章节中简单的介绍了一下搜索框的实现。现在我们来看看下拉框的实现。
下拉框前台的实现代码:
<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)