Je souhaite 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 étend JModelList
et j'ai commencé à utiliser la méthode getListQuery()
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 le fichier default.php pour que les filtres et la pagination fonctionnent?
Suivez les étapes ci-dessous:
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 les utiliser 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 obligatoires définis dans models/forms/filter_products.xml
See administrator/components/com_content/models/forms/filter_articles.xml
4) Obtenir et définir des filtres dans votre view.html.php
$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');
5) Afficher les filtres en mode liste views/products/tmpl/default.php
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));?>
1) Obtenez la pagination du modèle dans votre view.html.php
$this->pagination = $this->get('Pagination');
2) Afficher dans votre views/products/tmpl/default.php
<?php echo $this->pagination->getListFooter(); ?>
Je vous suggère de vous référer au composant Joomla Articles (com_content) pour tout développement de composant Joomla MVC. C'est la meilleure ressource/documentation disponible à ce jour.
Les codes ci-dessus sont destinés au composant admin. Pour les composants frontaux, la plupart des étapes sont plus ou moins identiques, mais vous devez les modifier selon vos besoins.