J'ai créé un filtre pour le backend de mon composant comme ceci:
<field name = "category_id"
type = "category"
label = "JOPTION_FILTER_CATEGORY"
extension = "com_bestia.items"
description = "JOPTION_FILTER_CATEGORY_DESC"
onchange = "this.form.submit();" >
<option value = "">JOPTION_SELECT_CATEGORY</option>
</field>
J'ai ajouté le filtre à ma vue en l'ajoutant à mon view.html.php
$this->filterForm = $this->get('FilterForm');
$this->activeFilters= $this->get('ActiveFilters');
et ceci à ma mise en page:
echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
Cela fonctionne très bien, mais si je change l’état de l’article en cliquant sur le petit bouton à côté de chaque entrée, défini comme suit:
<td class="small">
<?php echo JHtml::_('jgrid.published', $item->state, $i, 'items.', $canChange, 'cb'); ?>
</td>
le filtre ne fonctionne plus. Il est toujours vérifié, mais la vue affiche les résultats de tous les composants.
Des idées pour réparer celà?
Edit: Ceci est l'entrepreneur du modèle:
public function __construct($config = array())
{
if (empty($config['filter_fields'])) {
$config['filter_fields'] = array(
'id', 'a.id',
'title', 'a.title',
'catid', 'nc.catid', 'category_title',
'state', 'a.state',
'created_by', 'a.created_by'
);
}
parent::__construct($config);
}
C'est la méthode populateState du modèle:
/**
* populateState function.
*
* @access protected
* @param mixed $ordering (default: null)
* @param mixed $direction (default: null)
* @return void
*/
protected function populateState($ordering = null, $direction = null)
{
// Initialise variables.
$app = JFactory::getApplication('administrator');
// Load the filter state.
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
$published = $app->getUserStateFromRequest($this->context . '.filter.state', 'filter_published', '', 'string');
$this->setState('filter.state', $published);
$categoryId = $this->getUserStateFromRequest($this->context . '.filter.catid', 'filter_category_id', '');
$this->setState('filter.catid', $categoryId);
// Load the parameters.
$params = JComponentHelper::getParams('com_bestia');
$this->setState('params', $params);
// List state information.
parent::populateState('a.id', 'asc');
}
Un autre fait intéressant: dans getListQuery, je reçois le catid en utilisant
// Filter by category.
$categoryId = $this->getState('filter.catid');
cela a une valeur si je filtre par catégorie - mais n'a aucune valeur si je clique sur l'un des boutons de publication que vous pouvez voir sur la capture d'écran:
Votre filtre xml a l'air correct
Avez-vous ajouté le champ de filtre à votre modèle __construct()
?
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(...
'catid', 'a.catid', 'category_id', 'category_title',);
}
...
protected function populateState($ordering = null, $direction = null)
{
...
$this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'string'));
Est-ce que populateState()
de votre modèle obtient l'état d'utilisateur et définit le filtre?
À l'heure actuelle, il semble que votre vue soit consciente du domaine, mais votre modèle ne sait pas quoi en faire.
D'accord, mon essai; )
vérifiez si votre filtre de catégorie persiste après avoir cliqué sur le lien de pagination. Je donne 99% pour ne pas stocker votre filtre dans la valeur d'état. Vous devez stocker ce filtre dans $this->state
après l'envoi du formulaire. Vérifiez ensuite si ce filtre est défini lorsque vous créez une requête dans la méthode getListQuery
de votre modèle.
Je suppose que vous étendez JModelList? Je parie que vos filtres après avoir été écrasés par le parent::populateState('a.id', 'asc');
.
Avez-vous essayé d'appeler la parent::populateState('a.id', 'asc');
au début de votre méthode populateState
au lieu de la fin?