Вы создаете административный список в своем расширении для 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. Все готово! Давайте посмотрим на результат -

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