Использование инструментов поиска JLayout в административной панели Joomla 3.x для списков.
Вы создаете административный список в своем расширении для Joomla? Хотите добавить инструменты поиска в свое расширение для Joomla 3.x? Вот краткое пошаговое руководство, как это сделать.
Сначала мы проверим необходимую структуру папок, а затем рассмотрим пример кода.
А. Здесь мы увидим структуру папок и файлов в действии.
Структура папок -
/administrator/components/com_quick2cart/models/ /administrator/components/com_quick2cart/models/fields/ /administrator/components/com_quick2cart/models/forms/ /administrator/components/com_quick2cart/views/
Файлы, которые необходимо добавить/изменить -
/administrator/components/com_quick2cart/models/forms/filter_regions.xml /administrator/components/com_quick2cart/models/fields/countries.php /administrator/components/com_quick2cart/models/regions.php /administrator/components/com_quick2cart/views/regions/view.html.php /administrator/components/com_quick2cart/views/regions/tmpl/default.php
Б. Давайте начнём программировать!
1. Прежде всего, создайте файл filter_listview.xml и добавьте поля для всех необходимых фильтров. В этом примере мы рассматриваем список с именем regions. Поэтому я создал XML-файл для фильтров списка и назвал его filter_regions.xml . Он имеет структуру XML, аналогичную параметрам других модулей.
<?xml version="1.0" encoding="utf-8"?>fields/countries.php
<form>
<fields name="filter">
<field
name="search"
type="text"
label="COM_QUICK2CART_FILTER_SEARCH_DESC"
hint="JSEARCH_FILTER"
/>
<field
name="country"
type="countries"
label="COM_QUICK2CART_FILTER_SELECT_COUNTRY"
description="COM_QUICK2CART_FILTER_SELECT_COUNTRY_DESC"
onchange="this.form.submit();"
>
<option value="">COM_QUICK2CART_FILTER_SELECT_COUNTRY</option>
</field>
<field
name="state"
type="list"
label="COM_CONTENT_FILTER_PUBLISHED"
description="COM_CONTENT_FILTER_PUBLISHED_DESC"
onchange="this.form.submit();"
>
<option value="">JOPTION_SELECT_PUBLISHED</option>
<option value="1">COM_QUICK2CART_PUBLISH</option>
<option value="0">COM_QUICK2CART_UNPUBLISH</option>
</field>
</fields>
<fields name="list">
<field
name="limit"
type="limitbox"
class="input-mini"
default="25"
label="COM_CONTENT_LIST_LIMIT"
description="COM_CONTENT_LIST_LIMIT_DESC"
onchange="this.form.submit();"
/>
</fields>
</form>
Приведенный выше XML-файл фильтра содержит четыре поля -
- search - Текстовое поле для поиска
- countries - Настраиваемое поле списка (которое я создал и поместил в /administrator/components/com_quick2cart/models/fields/ )
- state - Поле списка
- limit - Поле ограничения разбивки на страницы Поле ограничения разбивки на страницы
2. Во-вторых, мы создаем пользовательское поле с именем country и помещаем его в поле местоположение - /administrator/components/com_quick2cart/models/fields/countries.php
<?php
/**
* @version SVN: <svn_id>
* @package Tjfields
* @copyright Copyright (c) 2009-2015 TechJoomla. All rights reserved.
* @license GNU General Public License version 2 or later.
*/
// Прямого доступа нет.
defined('_JEXEC') or die();
JFormHelper::loadFieldClass('list');
/**
* Поддерживает HTML-список категорий для выбора
*/
class JFormFieldCountries extends JFormFieldList
{
/**
* Тип поля формы.
*
* @var string
* @since 1.6
*/
protected $type = 'countries';
/**
* Поле для определения того, загружаются ли параметры извне или из xml
*
* @var integer
* @since 2.2
*/
protected $loadExternally = 0;
/**
* Method to get a list of options for a list input.
*
* @return array An array of JHtml options.
*
* @since 11.4
*/
protected function getOptions()
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$client = JFactory::getApplication()->input->get('client', '', 'STRING');
// Выбрать необходимые поля из таблицы.
$query->select('c.id, c.country, c.country_jtext');
$query->from('`#__tj_country` AS c');
if ($client)
{
$query->where('c.' . $client .' = 1');
}
$query->order($db->escape('c.ordering ASC'));
$db->setQuery($query);
// Получить доступ ко всем странам.
$countries = $db->loadObjectList();
$options = array();
// Загрузить файл lang для стран
$lang = JFactory::getLanguage();
$lang->load('tjgeo.countries', JPATH_SITE, null, false, true);
foreach ($countries as $c)
{
if ($lang->hasKey(strtoupper($c->country_jtext)))
{
$c->country = JText::_($c->country_jtext);
}
$options[] = JHtml::_('select.option', $c->id, $c->country);
}
if (!$this->loadExternally)
{
// Объединить все дополнительные параметры в определении XML.
$options = array_merge(parent::getOptions(), $options);
}
return $options;
}
/**
* Метод получения списка параметров для ввода списка извне, а не из xml.
*
* @return array Массив параметров JHtml.
*
* @since 2.2
*/
public function getOptionsExternally()
{
$this->loadExternally = 1;
return $this->getOptions();
}
}
Обратите внимание, что код шага 2. необязателен, если вы не используете какие-либо пользовательские элементы формы.
3. Затем нам нужно отредактировать - /administrator/components/com_quick2cart/views/regions/view.html.php
Нам нужно добавить следующий код в файл view.html.php
$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');
И это будет выглядеть так -
class Quick2cartViewRegions extends JViewLegacy
{
// Какой-то код здесь
public function display ($tpl = null)
{
$this->state = $this->get('State');
$this->items = $this->get('Items');
$this->pagination = $this->get('Pagination');
// Получить форму фильтра.
$this->filterForm = $this->get('FilterForm');
// Get active filters.
$this->activeFilters = $this->get('ActiveFilters');
// Какой-то код здесь
parent::display($tpl);
}
}
4. Затем нам нужно отредактировать - /administrator/components/com_quick2cart/views/regions/tmpl/default.php
Нам нужно добавить следующий код для отображения фильтров поиска в форме в виде списка - default.php
<?php
// Панель инструментов поиска
echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
?>
И это будет выглядеть следующим образом -
<form
action="<?php echo JRoute::_('index.php?option=com_quick2cart&view=regions'); ?>"
method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
<div id="j-sidebar-container" class="span2">
<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10">
<?php else : ?>
<div id="j-main-container">
<?php endif;?>
<?php
// Search tools bar
echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
?>
<!-- Другой код находится здесь -->
</div>
</form>
5. Наконец, нам нужно отредактировать - /administrator/components/com_quick2cart/models/regions.php
Ваш модуль должен расширить класс модуля JModelList для использования фильтров поиска.
Нам нужно изменить 3 функции в regions.php
public function __construct($config = array()) // Установить поля фильтрации в этой функции protected function populateState($ordering = null, $direction = null) // Получение и установка текущих значений фильтров protected function getListQuery() // Использовать текущие значения фильтра для изменения запроса и, следовательно, выходных данных
И это будет выглядеть следующим образом -
class Quick2cartModelRegions extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id',
'state', 'state',
'region', 'a.region',
'region_3_code', 'a.region_3_code',
'region_code', 'a.region_code',
'region_jtext', 'a.region_jtext',
'country', 'c.country',
'state', 'a.state'
);
}
parent::__construct($config);
}
protected function populateState($ordering = null, $direction = null)
{
// Инициализировать переменные.
$app = JFactory::getApplication('administrator');
// Другой код находится здесь
$country = $app->getUserStateFromRequest($this->context . 'filter.country', 'filter_country', '', 'string');
$this->setState('filter.country', $country);
// Другой код находится здесь
// Список стран.
parent::populateState('a.id', 'asc');
}
protected function getListQuery()
{
// Create a new query object.
$db = $this->getDbo();
$query = $db->getQuery(true);
// Другой код находится здесь
// Фильтровать по странам
$country = $this->getState('filter.country');
if (is_numeric($country))
{
$query->where('a.country_id = '.(int) $country);
}
// Другой код находится здесь
return $query;
}
}
6. Все готово! Давайте посмотрим на результат -

Я надеюсь, что это окажется полезным для всех вас.