Comment créer une vue avec des filtres et une pagination

8

Je veux créer une vue avec des filtres et une pagination pour Joomla 3.x, mais je ne suis pas sûr de ce que je dois inclure et où.

Pour l'instant, mon modèle s'étend JModelListet j'ai commencé à utiliser la getListQuery()méthode pour récupérer les données:

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

}

Mon view.html.php ressemble à ceci:

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

Que dois-je ajouter à mon modèle et à ma vue? Qu'est-ce que je dois inclure dans mon default.php pour que les filtres et la pagination fonctionnent?

mattosmat
la source

Réponses:

8

Suivez les étapes ci-dessous:

Filtres:

1) Assurez-vous d'ajouter tous vos champs filtrables dans votre constructeur de modèle

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

    parent::__construct($config);
}

2) Remplissez vos valeurs de filtre dans votre modèle (products.php) pour une utilisation comme ci-dessous

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) Ajoutez votre fichier xml de filtre avec les champs de filtre requis définis dans models/forms/filter_products.xml

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

4) Obtenez et définissez des filtres dans votre view.html.php

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

5) Afficher les filtres en vue liste views/products/tmpl/default.php

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

Pagination:

1) Obtenez la pagination du modèle dans votre view.html.php

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

2) Affichez dans votre views/products/tmpl/default.php

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

Remarques:

  1. Je vous suggère de référencer le composant Joomla Articles (com_content) pour tout développement de composant Joomla MVC. Il s'agit de la meilleure ressource / documentation disponible à ce jour.

  2. Les codes ci-dessus sont destinés au composant admin. Pour le composant frontal, la plupart des étapes sont plus ou moins identiques, mais vous devez les modifier selon vos besoins.

Nagarjun
la source
Je ne sais pas comment créer le xml pour les filtres. Pourriez-vous s'il vous plaît m'orienter dans la bonne direction? J'ai pensé qu'il était possible de les ajouter directement dans le modèle.
mattosmat
Le code pour afficher les filtres et la pagination doit aller dans un formulaire, non?
mattosmat
a mis à jour ma réponse
Nagarjun
Pour la pagination, vous n'avez pas besoin de fichier xml. JModelList définit les fonctions requises (getPagination), il est donc facilement disponible dans votre modèle.
Nagarjun
Pourquoi ai-je besoin du XML? Je veux savoir pour savoir comment en faire un.
mattosmat