Как переопределить запрос пейджера просмотра drupal? - PullRequest
4 голосов
/ 05 декабря 2011

Я использую drupal 6 и просмотр 2 -

Я создал собственный фильтр для моего просмотра, используя эту документацию

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

Кажется, все работает нормально, только одна проблема -

Моя нумерация страниц не работает (не отображается с каким-либо оператором)

Позвольте мне кратко объяснить, чего я хочу достичь -

В моем просмотре страницы у меня уже есть какой-то открытый фильтр с раскрывающимся списком их операторов, и я создал один настраиваемый открытый фильтр без раскрывающегося списка операторов.

Мое требование - объединить одну существующую функциональность фильтра с моим настраиваемым фильтром. Значит два фильтра будут работать вместе, чтобы достичь желаемого результата. Но один фильтр состоит из существующего поля, и если я выберу любой из его операторов из выпадающего списка, то это значение будет включено в предложение 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']);
      } 

Теперь в моем сайты / все / модули / MyModule / вкл / mymodule_filter.inc

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

, которые добавляют предложение where для просмотра запроса.

Используя вышеописанную процедуру, я успешно расширил поведение представления по умолчанию, а также получил желаемый результат, но для некоторой ссылки пагинации оператора не появляется, даже если я знаю, что в базе данных существует больше записей.

Я знаю, почему это происходит - потому что мой скрипт разбивки на страницы не знает об изменениях, которые я сделал.

Мой вопрос: КАК МОЖНО ПЕРЕГРУЗИТЬ ЗАПРОС ПРОСМОТРА СТРАНИЦЫ?

Любая помощь будет принята с благодарностью.

1 Ответ

4 голосов
/ 05 декабря 2011

То, что я делал для удаления предложения 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']);
        }
    }
...