Drupal View Pagerクエリをオーバーライドする方法は?
-
28-10-2019 - |
質問
Drupal 6とビュー2を使用しています -
このドキュメントを使用して、私のビュー用のカスタムフィルターを作成しました
http://www.chadcf.com/blog/creating-custom-filters-drupal-and-views.
すべてのものが正常に動作しているように見えます - 1つの問題 -
私のページネーションが機能していません(一部のオペレーターには表示されません)
簡単に達成したいことを説明させてください -
私のページビューでは、オペレーターのドロップダウンを備えた露出したフィルターがすでにいくつかあり、オペレータードロップダウンなしで1つのカスタム露出フィルターを作成しました。
私の要件は、既存のフィルター機能をカスタムフィルターとマージすることです。つまり、2つのフィルターが一緒に動作し、目的の結果を得ることができます。しかし、1つのフィルターは既存のフィールドで構成されており、ドロップダウンから演算子のいずれかを選択すると、値は句に含まれていますが、これは必要ありません。そのため、使用してビュークエリからクエリのチャンクを完全に削除しました
hook_views_pre_execute(&$view) {
$view->build_info['query'] = preg_replace('/AND \(node_data_field_stock.field_stock_value [<<=>>=!=\\s%d|IS NULL|IS NOT NULL]*\)/','',$view->build_info['query']);
}
私のサイト/すべて/モジュール/mymodule/inc/mymodule_filter.incで
function query() {
$this->query->add_where($this->options['group'], "MY_QUERY");
}
クエリを表示する場所を追加します。
上記の手順を使用して、デフォルトのビューの動作を正常に拡張し、目的の結果を取得しましたが、一部のオペレーターページネーションリンクでは、データベースにさらに多くのレコードが存在することを知っています。
なぜそれが起こっているのか知っています - 私の見解ページネーションスクリプトが私が行った変更を認識していないからです。
私の質問は、ページャークエリを表示するにはどうすればよいですか?
どんな助けも大歓迎です。
解決
句からWhere句を表示]を削除するために私がしていたことは、以下にあります。
hook_views_pre_execute(&$view) {
$view->build_info['query'] = preg_replace('/AND \(node_data_field_stock.field_stock_value [<<=>>=!=\\s%d|IS NULL|IS NOT NULL]*\)/','',$view->build_info['query']);
}
しかし、ビューから削除する句を削除する適切な場所は、fook_views_query_alter()です。このチュートリアルを使用します
http://www.drupaler.co.uk/blog/altering-views-query-tackling-node-type-filter-bug/451
function hook_views_query_alter(&$view, &$query) {
if($view->name == 'view_name'){
var_dump($query->where[0]['clauses']);
foreach ($query->where[0]['clauses'] as $key=>$value) {
if(preg_match('/node_data_field_stock.field_stock_value/',$value)){
unset($query->where[0]['clauses'][$key]);
// remove the where clause by it's key
}
}
var_dump($query->where[0]['clauses']);
}
}