Cómo crear una vista con filtros y paginación

8

Quiero crear una vista con filtros y paginación para Joomla 3.x, pero no estoy seguro de qué tengo que incluir y dónde.

Por ahora, mi modelo se extiende JModelListy comencé a usar el getListQuery()método para obtener los datos:

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

}

Mi view.html.php se ve así:

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

¿Qué debo agregar a mi modelo y mi vista? ¿Qué es lo que tengo que incluir en mi default.php para que funcionen tanto los filtros como la paginación?

mattosmat
fuente

Respuestas:

8

Siga los pasos a continuación:

Filtros:

1) Asegúrese de agregar todos sus campos filtrables en su constructor 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) Rellene los valores de filtro en su modelo (productos.php) para usarlos como se muestra a continuación

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) Agregue su archivo xml de filtro con los campos de filtro obligatorios definidos en models/forms/filter_products.xml

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

4) Obtenga y configure filtros en su view.html.php

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

5) Mostrar filtros en la vista de lista views/products/tmpl/default.php

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

Paginación:

1) Obtenga paginación del modelo en su view.html.php

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

2) Mostrar en su views/products/tmpl/default.php

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

Notas:

  1. Le sugiero que consulte el componente Joomla Articles (com_content) para cualquier desarrollo de componentes Joomla MVC. Es el mejor recurso / documentación disponible hasta la fecha.

  2. Los códigos anteriores están destinados al componente de administrador. Para el componente front-end, la mayoría de los pasos son más o menos iguales, pero debe ajustarlos según sus requisitos.

Nagarjun
fuente
No sé cómo crear el xml para los filtros. ¿Podría por favor señalarme en la dirección correcta? Pensé que era posible agregarlos directamente en el modelo.
mattosmat
El código para mostrar los filtros y la paginación debe ir dentro de un formulario, ¿verdad?
mattosmat
actualicé mi respuesta
Nagarjun
Para la paginación no necesita ningún archivo xml. JModelList define las funciones requeridas (getPagination), por lo que está fácilmente disponible en su modelo.
Nagarjun
¿Para qué necesito el xml? Quiero saber para poder descubrir cómo hacer uno.
mattosmat