4

私は drupal 6 とビュー 2 を使用しています -

このドキュメントを使用してビューのカスタム フィルターを作成しました

http://www.chadcf.com/blog/creating-custom-filters-drupal-and-views

すべてが正常に機能しているように見えますが、問題は 1 つだけです -

ページネーションが機能しない (一部のオペレーターで表示されない)

簡単に達成したいことを説明しましょう-

私のページ ビューには、演算子のドロップダウンを含む公開フィルターが既にいくつかあり、演算子のドロップダウンなしでカスタムの公開フィルターを 1 つ作成しました。

私の要件は、1 つの既存のフィルター機能をカスタム フィルターとマージすることです。目的の結果を得るために 2 つのフィルターが連携することを意味します。しかし、1 つのフィルターは既存のフィールドで構成されており、その演算子のいずれかをドロップダウンから選択すると、その値が 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']);
      } 

今私のサイト/all/modules/mymodule/inc/mymodule_filter.incにあります

function query() {
        $this->query->add_where($this->options['group'], "MY_QUERY");   
}

ビュークエリにwhere句を追加します。

上記の手順を使用して、デフォルトのビュー動作を正常に拡張し、目的の結果を取得しましたが、データベースにさらにレコードが存在することを知っていても、一部のオペレーターのページネーション リンクが表示されません。

なぜそれが起こっているのか知っています - 私のビューページネーションスクリプトは私が行った変更を認識していないからです.

私の質問は、ビュー ページャー クエリをオーバーライドするにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

ビュークエリから 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']);
    } 

ただし、ビュー クエリから削除する where 句を削除する適切な場所は、hook_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']);
        }
    }
于 2011-12-05T13:55:42.600 に答える