次のように、コンポーネントのバックエンド用のフィルターを作成しました。
<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つをクリックした場合は値がありません。
あなたのフィルター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()
はユーザー状態を取得してフィルターを設定していますか?
現在、ビューはフィールドを認識しているようですが、モデルはフィールドをどう処理するかを認識していません。
さて、私の試み。 )
ページネーションリンクをクリックした後、カテゴリフィルターが存在するかどうかを確認します。フィルターを状態値に格納しないことに対して99%を与えます。フォームを送信した後、このフィルタを$this->state
に保存する必要があります。次に、モデルのgetListQuery
メソッドでクエリを作成するときに、このフィルターが設定されているかどうかを確認します。
JModelListを拡張していると思いますか? parent::populateState('a.id', 'asc');
によってオーバーライドされた後、フィルターを賭けます。
populateState
メソッドの最後ではなく、最初にparent::populateState('a.id', 'asc');
を呼び出そうとしましたか?