Блог лаборанта

Инструменты поиска в Joomla 3.x для вида списка в админке

Инструменты поиска для представления списка в админке в Joomla 3.x

  • Вам необходимо создаеть представление списка в админке компонента Joomla?
  • Вы хотите подключить инструменты поиска в расширение Joomla 3.x?

Это краткое руководство, в нескольких простых шагах поможет это сделать.

Сначала мы создадим необходимую структуру каталогов, а затем рассмотрим примеры кода.

A. Структура каталогов и файлов, которые будем использовать

Структура каталогов:

/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

B. Пишем код

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          - Поле Limit Box пагинации (ограничение количества материалов на странице)

2. Во-вторых, мы создаем настраиваемое поле с именем country и помещаем его в - /administrator/components/com_quick2cart/models/fields/country.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');
 
/**
 * Поддержка выбора списка категорий
 */
class JFormFieldCountries extends JFormFieldList
{
    /**
     * Тип поля формы.
     *
     * @var     string
     * @since   1.6
     */
    protected $type = 'countries';
 
    /**
     * Поле для определения, загружаются ли параметры извне и из xml
     *
     * @var     integer
     * @since   2.2
     */
    protected $loadExternally = 0;
 
    /**
     * Метод получения списка опций для ввода списка.
     *
     * @return  array      Массив опций JHtml.
     *
     * @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');
 
        // Получить активные фильтры.
        $this->activeFilters = $this->get('ActiveFilters');
 
        // Здесь какой-то код
         
        parent::display($tpl);
    }
}

Использование JLayout

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
            // Панель инструментов поиска
            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()
    {
        // Создание нового объекта запроса
        $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. Все сделано! Теперь можно посмотреть что получилось

 

Это все. Удачи!

Вольный перевод by HFLab, Источник

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

×Войдите на сайт используя аккаунты в социальных сетях или форму авторизации.
Добавлять комментарии могут только авторизованные пользователи сайта.
Войти через:
           
© 2016-2019 HFLab. All Rights Reserved.

Авторизация на сайте

Войти через:

Навигация