Como criar uma exibição com filtros e paginação

8

Quero criar uma exibição com filtros e paginação para o Joomla 3.x, mas não tenho certeza sobre o que tenho que incluir e onde.

Por enquanto, meu modelo se estende JModelListe comecei a usar o getListQuery()método para buscar os dados:

<?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;
    }

}

Meu view.html.php fica assim:

<?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);      
    }
}

O que tenho que adicionar ao meu modelo e minha visão? O que devo incluir no meu default.php para que os filtros e a paginação funcionem?

mattosmat
fonte

Respostas:

8

Siga os passos abaixo:

Filtros:

1) Certifique-se de adicionar todos os seus campos filtráveis ​​no construtor de modelos

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

    parent::__construct($config);
}

2) Preencha os valores de filtro em seu modelo (products.php) para usar como abaixo

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) Adicione seu arquivo xml de filtro com os campos de filtro obrigatórios definidos em models/forms/filter_products.xml

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

4) Obtenha e defina filtros no seu view.html.php

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

5) Exibir filtros na exibição de lista views/products/tmpl/default.php

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

Paginação:

1) Obtenha paginação do modelo em seu view.html.php

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

2) Exibir na sua views/products/tmpl/default.php

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

Notas:

  1. Eu sugiro que você consulte o componente Artigos do Joomla (com_content) para qualquer desenvolvimento de componentes do Joomla MVC. É o melhor recurso / documentação disponível até o momento.

  2. Os códigos acima destinam-se ao componente admin. Para o componente front-end, a maioria das etapas é mais ou menos a mesma, mas você precisa ajustá-las conforme sua necessidade.

Nagarjun
fonte
Não sei como criar o xml para os filtros. Poderia, por favor, apontar-me na direção certa? Eu pensei que era possível adicioná-los diretamente no modelo.
mattosmat
O código para exibir os filtros e a paginação deve estar em um formulário, certo?
mattosmat
atualizei a minha resposta
Nagarjun
Para paginação, você não precisa de nenhum arquivo xml. O JModelList define as funções necessárias (getPagination), portanto está prontamente disponível no seu modelo.
precisa
Para que preciso do xml? Eu quero saber para que eu possa descobrir como fazer um.
mattosmat