Как сделать фильтр записей в админке Joomla 1.7

Первым делом давайте в административной части компонента выведем выпадающий список, с категориями (в моем случае). Для этого получаем категории из базы данных и формируем из них элементы option, я все это делал в файле шаблона administrator/components/com_free/views/freelist/tmpl/default.php:

 $db =& JFactory::getDBO(); $q = "SELECT id,name FROM #__free_cat"; $db->setQuery($q); $c = $db->LoadAssocList(); $cat = array(); foreach($c as $key=>$val) { $cat[] = JHTML::_('select.option', $val['id'], $val['name']); } 

Дальше давайте создадим сам список в удобном месте:

 
<select name="cat_id" class="inputbox" onchange="this.form.submit()">

<option value="">Выберите категорию</option>

 <?php echo JHtml::_('select.options', $cat, 'value', 'text',$cat_id);?>

</select>
 
Дальше нам нужно внести изменения в метод конструктора нашей модели и дописать две строки в конструктор модели. Первая из них смотрит не т ли переменной cat_id в посте, если нет то идет в сессию и проверяет нет ли фильтра для этого пользователя в сессии. Если нет возвращает 0. А вторая строка устанавливает в сессию фильтр для этого пользователя.
$cat_id = $app->getUserStateFromRequest('free.cat_id', 'cat_id', 0, 'int');

$this->setState('cat_id', $cat_id);
Ну и теперь осталось изменить запрос к базе данных в зависимости от нашего фильтра у меня за формирование условия WHERE отвечает метод _buildQueryWhere() и выглядит он так:

private function _buildQueryWhere() {
	    $app =& JFactory::getApplication();
	
		$search = $app->getUserStateFromRequest('com_freesearch', 'search', '');
		$cat_id = $app->getUserStateFromRequest('free.cat_id', 'cat_id', 0, 'int' );
		
	    if ((!$search) && ($cat_id == 0)) return '';
		
		$where = ' WHERE ';
		
		if($cat_id != 0)
		{
			$where .= " t1.cat_id =".$cat_id;
		}
		
		if($search)
		{
		$allowedSearch = explode(',', 'name,img'); // array('id', 'ordering', 'published'); 
		$where .= " (0=1) "; 
		foreach($allowedSearch as $field){
			if (!$field) return '';
			$where .= " OR (t1.`$field` LIKE '%" . addSlashes($search) . "%') ";
		}
		}
		
		
		
	    return $where;
	}
	

Добавить комментарий


Защитный код
Обновить