web-dev-qa-db-fra.com

Le filtre ne fonctionne pas après avoir cliqué sur grid.published-button

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:

enter image description here

2
MyFault

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.

1
Walt Sorensen

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.

1
Lanah

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?

1
David Hayes