Как создать вид с фильтрами и нумерацией страниц

8

Я хочу создать представление с фильтрами и разбивкой на страницы для Joomla 3.x, но я не уверен в том, что я должен включить и где.

На данный момент моя модель расширяется, JModelListи я начал использовать getListQuery()метод для извлечения данных:

<?php
defined('_JEXEC') or die;

class smartModelProducts extends JModelList{    

    protected function getListQuery(){
        // Initialize variables.
        $db    = JFactory::getDbo();
        $query = $db->getQuery(true);

        // Create the base select statement.
        $query->select('*')
        ->from($db->quoteName('#__smart_products'));

        return $query;
    }

}

Мой view.html.php выглядит так:

<?php
defined('_JEXEC') or die;

class smartViewProducts extends JViewLegacy{

    function display($tpl=null){
        $app=JFactory::getApplication();
        $jinput = $app->input;
        $option = $jinput->get('option', null, null);
        $user=JFactory::getUser();

        // Get data from the model
        $this->state = $this->get('State');
        $this->items = $this->get('Items');
        $this->pagination = $this->get('Pagination');

        parent::display($tpl);      
    }
}

Что мне нужно добавить к моей модели и моему виду? Что мне нужно включить в файл default.php, чтобы работали и фильтры, и нумерация страниц?

mattosmat
источник

Ответы:

8

Выполните следующие шаги:

Фильтры:

1) Убедитесь, что все ваши фильтруемые поля добавлены в конструктор модели

public function __construct ($config = array())
{
    if (empty($config['filter_fields']))
    {
        $config['filter_fields'] = array(
           'id', 'a.id',
           'catid', 'a.catid',
           ....
           ....
        );
    }

    parent::__construct($config);
}

2) Заполните значения фильтра в вашей модели (products.php) для использования, как показано ниже

protected function populateState ($ordering = null, $direction = null)
{
    $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
    $this->setState('filter.search', $search);

    $authorId = $app->getUserStateFromRequest($this->context . '.filter.author_id', 'filter_author_id');
    $this->setState('filter.author_id', $authorId);

    $published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
    $this->setState('filter.published', $published);

    $categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id');
    $this->setState('filter.category_id', $categoryId);

    // and so on .....
}

3) Добавьте свой XML-файл фильтра с необходимыми полями фильтра, определенными в models/forms/filter_products.xml

See administrator/components/com_content/models/forms/filter_articles.xml

4) Получить и установить фильтры в вашем view.html.php

$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');

5) Показать фильтры в виде списка views/products/tmpl/default.php

<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));?>

Разбивка:

1) Получить пагинацию от модели в вашем view.html.php

$this->pagination = $this->get('Pagination');

2) Показать в вашем views/products/tmpl/default.php

<?php echo $this->pagination->getListFooter(); ?>

Ноты:

  1. Я предлагаю вам обратиться к компоненту Joomla Articles (com_content) для разработки любого компонента Joomla MVC. Это лучший ресурс / документация, доступная на сегодняшний день.

  2. Приведенные выше коды предназначены для административного компонента. Для компонента переднего плана большинство шагов более или менее одинаковы, но вам необходимо настроить их в соответствии с вашими требованиями.

Nagarjun
источник
Я не знаю, как создать XML для фильтров. Не могли бы вы указать мне правильное направление? Я думал, что можно было добавить их в модель напрямую.
mattosmat
Код для отображения фильтров и нумерации страниц должен быть в форме, верно?
mattosmat
обновил мой ответ
Нагарджун
Для нумерации страниц вам не нужен XML-файл. JModelList определяет необходимые функции (getPagination), поэтому он легко доступен в вашей модели.
Нагарджун
Для чего мне нужен XML? Я хочу знать, чтобы я мог узнать, как сделать один.
mattosmat