web-dev-qa-db-ja.com

grid.published-buttonをクリックした後、フィルターが機能しない

次のように、コンポーネントのバックエンド用のフィルターを作成しました。

<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>

これを自分のview.html.phpに追加して、ビューにフィルターを追加しました

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

そしてこれを私のレイアウトに:

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

まあ、これはうまくいきますが、各エントリの横にある小さなボタンをクリックしてアイテムの状態を変更すると、次のように定義されます。

    <td class="small">
        <?php echo JHtml::_('jgrid.published', $item->state, $i, 'items.', $canChange, 'cb'); ?>
    </td>

フィルターはもう機能していません。まだチェックされていますが、ビューにはすべてのコンポーネントの結果が表示されます。

それを修正する方法はありますか?

編集:これはモデルの請負業者です:

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

これは、モデルのPopulateStateメソッドです。

/**
 * 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');
}

もう1つの興味深い事実:getListQueryでは、次を使用してcatidを取得しています

    // Filter by category.
    $categoryId     =       $this->getState('filter.catid');    

これは、カテゴリでフィルタリングした場合は値になりますが、スクリーンショットに表示されているパブリッシングボタンの1つをクリックした場合は値がありません。

enter image description here

2
MyFault

あなたのフィルターXMLは正しく見えます

フィルターフィールドをモデルに追加しましたか__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'));
_

モデルのpopulateState()はユーザー状態を取得してフィルターを設定していますか?

現在、ビューはフィールドを認識しているようですが、モデルはフィールドをどう処理するかを認識していません。

1
Walt Sorensen

さて、私の試み。 )

ページネーションリンクをクリックした後、カテゴリフィルターが存在するかどうかを確認します。フィルターを状態値に格納しないことに対して99%を与えます。フォームを送信した後、このフィルタを$this->stateに保存する必要があります。次に、モデルのgetListQueryメソッドでクエリを作成するときに、このフィルターが設定されているかどうかを確認します。

1
Lanah

JModelListを拡張していると思いますか? parent::populateState('a.id', 'asc');によってオーバーライドされた後、フィルターを賭けます。

populateStateメソッドの最後ではなく、最初にparent::populateState('a.id', 'asc');を呼び出そうとしましたか?

1
David Hayes