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


У меня есть представление, которое использует идентификатор текущего вошедшего в систему пользователя в качестве контекстного фильтра. Это было установлено с помощью пользовательского интерфейса Drupal и работает хорошо. Затем я написал пользовательский модуль, который добавляет еще один параметр (определенный идентификатор узла) ко всем представлениям на моем сайте. Все представления нуждаются в этом втором параметре (и его необходимо добавить программно). Этот подход хорошо работает для всех представлений, которые используют только программно добавленный параметр в качестве контекстного фильтра. Однако мнение, которое нуждается в 2 значения фильтра не работают, потому что я думаю, что неправильно обрабатываю порядок параметров в массиве args. Как мне настроить представления, которые уже используют значения фильтра, но мне нужно добавить больше программно (я установил $args[0], но я думаю, что это может быть проблемой)?

Я должен сказать, что я не хочу, чтобы эти фильтры отображались в URL-адресе.

Тестовый модуль.модуль:

function testmod_views_pre_view($view, $display_id, array &$args) {
  ...
  $args[0] = $value;
}

Я думал, что смогу просто прочитать массив $arg представления и добавить к нему свой специальный аргумент программно, но для представления, которое уже использует вошедшего в систему пользователя в качестве контекстного фильтра, когда я печатаю print_r ($args), это пустой массив, хотя представление работает правильно (и показывает результаты только для текущего пользователя). Хранятся ли контекстные фильтры, которые я настраиваю через пользовательский интерфейс, в другом месте, чем $args?

Что нужно сделать, чтобы указать представлению, как правильно использовать значения 1. и 2. фильтра?

Редактировать: Я читал, что hook_views_pre_view() слишком рано искать контекстуальный фильтры в массиве arg (в этот момент вы увидите только аргументы в этом массиве, переданные по URL-адресу). Какой крючок был бы лучшим для достижения того, что я хотел бы сделать?

 3
Author: theuni, 2017-09-25

1 answers

Теперь я лучше понимаю и нашел решение. hook_views_pre_view() действительно слишком рано видеть аргументы, которые НЕ передаются в представление по URL-адресу. Это объясняет, почему в моем случае $view->args был пуст. В hook_views_post_build() вы видите ВСЕ аргументы (URL+NONURL), переданные в представление. Однако способ, которым я решил свою проблему, по-прежнему использует $args[0] = $value; в hook_views_pre_view. Это означает, что первым аргументом, переданным всем представлениям, всегда будет $value. Для представлений, использующих дополнительные аргументы, Drupal добавит их в $args позже. В моем особом случае у меня есть представления, которые могут не обязательно нуждаться в первом аргументе, который я передаю, поэтому мне пришлось добавить контекстный фильтр Global: Null (в первой позиции), который позволяет игнорировать значение контекстного фильтра (и по умолчанию я установил 0). Таким образом, каждое представление имеет правильное количество контекстных фильтров и правильный порядок, независимо от того, нужно ли представлению использовать самый первый аргумент или нет. Может показаться неразумным передавать аргумент каждому представлению, хотя на самом деле не все представления это необходимо, но добавление фиктивного фильтра Global: Null проще, чем исключение представлений в операторе if() и всегда необходимость изменять код модуля, когда новое представление должно быть добавлено позже.

 2
Author: theuni, 2017-09-29 07:26:16