Первым делом давайте в административной части компонента выведем выпадающий список, с категориями (в моем случае). Для этого получаем категории из базы данных и формируем из них элементы 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']); }
Дальше давайте создадим сам список в удобном месте:
Дальше нам нужно внести изменения в метод конструктора нашей модели и дописать две строки в конструктор модели. Первая из них смотрит не т ли переменной 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;
}