Выполнить представление в коде и передать несколько аргументов в открытый фильтр?
Я выполняю представление в коде предварительной обработки абзаца, чтобы разрешить динамические списки. Пользователь выбирает, какие типы контента они хотели бы показывать, и представление должно возвращать узлы этих типов с той же выбранной таксономией. Идея в том, что они могут добавлять несколько абзацев с разной конфигурацией, используя одно и то же представление только с разными аргументами.
В этом представлении Тип контента является открытым фильтром, установленным для разрешения нескольких. Вот код в крючок для препроцесс_параграфа:
$types = $paragraph->field_related_content_types->getValue();
$content_types = [];
foreach ($types as $type) {
$content_types[] = $type['target_id'];
}
$view = Views::getView('related_content');
$view->setDisplay('related_content_display');
$view->setArguments(['type' => $content_types]);
$view->setExposedInput(['type' => $content_types]);
$view->preExecute();
$view->execute();
if (count($view->result)) {
$variables['results'] = $view->buildRenderable('related_content_display', ['type' => $content_types]);
}
"тип" - это имя фильтра в представлении. Если я изменю его, чтобы разрешить только одно значение, и передам его в виде строки, это сработает. Так что это похоже на проблему синтаксиса, но я не могу в этом разобраться.
Метод, по-видимому, указывает на то, что это возможно:
/**
* Sets the arguments for the view.
*
* @param array $args
* The arguments passed to the view.
*/
public function setArguments(array $args) {
// The array keys of the arguments will be incorrect if set by
// views_embed_view() or \Drupal\views\ViewExecutable:preview().
$this->args = array_values($args);
}
1 answers
Похоже, что вы используете открытый фильтр и контекстный фильтр для этого типа. Поскольку setArguments предназначен для контекстных фильтров, а setExposedInput - для открытых фильтров. Если у вас есть только открытый фильтр для типа, вы должны иметь возможность удалить setArguments и 2-й аргумент в buildRenderable (который вам не нужен, если вы используете setArguments)
У меня есть что-то очень похожее с фильтром открытого типа, и я просто передаю ему массив для setExposedInput, и, похоже, работы
$view->setExposedInput(['type' => ['news','page']]);