Рейтинг:0

Создайте фильтр просмотра, чтобы найти узел, который не имеет значения в определенном поле.

флаг ru

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

Это невозможно с видом. Когда я выбираю выставить оператор «IS NULL», фильтр, возвращаемый представлением, не имеет смысла, как вы можете видеть на следующих изображениях.

введите описание изображения здесь

Фильтр после выбора этой опции:

введите описание изображения здесь

В другом выпуске на stackexchange кто-то предлагает использовать более открытый фильтр, и некоторые люди одобряют. Но, возможно, из-за того, что проблема была для Drupal 7 или для другого типа поля, эта опция недоступна с модулем для моего поля.

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

Я знаю, что с EntityQuery можно сделать запрос, который возвращает сущности с пустым полем, с функцией notExist в поле.

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

Рейтинг:0
флаг ru

Итак, я наконец узнал, как это сделать с помощью левого соединения и проверить, является ли оно нулевым или нет, в зависимости от значения флажка (если оно отмечено, должно быть заполнено; если нет, должно быть пустым). Вот мой фильтр:

<?php

пространство имен Drupal\my_module\Plugin\views\filter;

используйте Drupal\Core\Database\Query\Condition;
используйте Drupal\views\Plugin\views\filter\BooleanOperator;
используйте Drupal\views\Views;

/**
 * Фильтры для определения наличия в контенте термина таксономии, указанного в field_tags.
 *
 * @ingroup views_filter_handlers
 *
 * @ViewsFilter("has_tags_filter")
 */
класс HasTagFilter расширяет BooleanOperator {

  /**
   * Вспомогательная функция, которая строит запрос.
   */
  запрос публичной функции () {
    $ конфигурация = [
      'table' => 'node__field_tags',
      'поле' => 'entity_id',
      'left_table' => 'node_field_data',
      'left_field' => 'нид',
      'оператор' => '=',
    ];
    $join = Views::pluginManager('join')->createInstance('standard', $configuration);
    $this->query->addRelationship('node__field_tags', $join, 'node_field_data');

    если ($это->значение == 1) {
      $this->query->addWhere('И', 'node__field_tags.field_tags_target_id', '', 'IS NOT NULL');
    } еще {
      $this->query->addWhere('И', 'node__field_tags.field_tags_target_id', '', 'IS NULL');
    }
  }
}
Рейтинг:0
флаг fr
  1. Перейти к просмотру
  2. Добавить фильтр для «Теги (field_tags)»
  3. Выберите оператор "Пустой (NULL)"

Теперь будут отображаться только узлы без тегов

флаг ru
В моем первоначальном посте было неясно, но мой фильтр на самом деле выставлен, так что, к сожалению, это не так просто
hoanns avatar
флаг fr
Итак, вы не можете просто указать оператор «Пусто (NULL)»? и позволить пользователю выбрать его? Или я чего-то не понимаю
флаг ru
Нет, это текстовое поле или список терминов, которые не имеют смысла для UX.

Ответить или комментировать

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