Выполнить представление в коде и передать несколько аргументов в открытый фильтр?


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

В этом представлении Тип контента является открытым фильтром, установленным для разрешения нескольких. Вот код в крючок для препроцесс_параграфа:

$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);
  }

enter image description here

 2
Author: Kevin, 2019-05-24

1 answers

Похоже, что вы используете открытый фильтр и контекстный фильтр для этого типа. Поскольку setArguments предназначен для контекстных фильтров, а setExposedInput - для открытых фильтров. Если у вас есть только открытый фильтр для типа, вы должны иметь возможность удалить setArguments и 2-й аргумент в buildRenderable (который вам не нужен, если вы используете setArguments)

У меня есть что-то очень похожее с фильтром открытого типа, и я просто передаю ему массив для setExposedInput, и, похоже, работы

$view->setExposedInput(['type' => ['news','page']]);
 2
Author: Leigh, 2019-05-24 15:21:29