Рейтинг:1

Как я могу отключить проверку для определенного поля узла

флаг de

В настоящее время я использую hook_entity_extra_field_info() и hook_ENTITY_TYPE_view() для создания пользовательского поля, отображаемого в узлах, которые динамически генерируют контент через PHP.

Однако Drupal 9, кажется, отслеживает изменения в выводе этого поля каждый раз, когда я сохраняю версию узла, чего я не хочу, потому что содержимое этого поля генерируется динамически и уже находится под контролем версий в пользовательском модуле.

Есть ли способ указать Drupal в одном из этих хуков или где-либо еще в конфигурации, чтобы он не отслеживал ревизии для определенного поля узла?

sonfd avatar
флаг in
Как именно он отслеживает изменения? Это просто поле отображения? или он действительно хранит значение в базе данных?
leymannx avatar
флаг ne
Что именно означает «динамически генерирует контент»? Можете ли вы показать нам пример кода? Если вы создаете контент в смысле присоединения чего-то к тому же узлу, конечно, вступает в силу ревизия, если вы не храните материал где-то еще.Псевдополя обычно используются только для отображения вычисляемой разметки, а не для создания контента.
Рейтинг:0
флаг de

Поскольку содержимое вашего поля генерируется динамически, похоже, вам нужно вычисляемое поле. Что устранит проблему, с которой вы столкнулись. Вычисляемое поле создается динамически, а не посредством пользовательского ввода. Поскольку это поле, им можно управлять так же, как и любым другим полем в Drupal (хотя интеграция с представлениями требует некоторых дополнительных усилий). Поля также кэшируются с помощью различных API кэширования Drupal.

Чтобы создать вычисляемое поле, сначала расширьте Drupal\Core\Field\FieldItemList, использовать в Drupal\Core\TypedData\ComputedItemListTrait, и реализовать вычислить значение () метод:

пространство имен Drupal\[ПРИМЕР]\Plugin\Field;

используйте Drupal\Core\Field\FieldItemList;
используйте Drupal\Core\TypedData\ComputedItemListTrait;

класс SomeDynamicField расширяет FieldItemList {

  использовать ComputedItemListTrait;      

  /**
   * {@inheritdoc}
   */
  защищенная функция calculateValue() {
    $values ​​= some_function_to_get_an_array_of_values();
    foreach ($values ​​как $index => $value) {
      $this->list[$delta] = $this->createItem($delta, $value);
    }
  }
}

Затем это поле необходимо добавить к каждому типу сущности, который вам нужен, в hook_entity_base_field_info_alter():

используйте Drupal\Core\Entity\EntityTypeInterface;
используйте Drupal\Core\Field\BaseFieldDefinition;

/**
 * Реализует hook_entity_base_field_info_alter().
 */
function EXAMPLE_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  // При необходимости добавьте/измените типы сущностей.
  $applicable_entity_types = ['узел'];
  если (in_array($entity_type->id(), $applicable_entity_types)) {
    $fields['my_computed_field'] = BaseFieldDefinition::create('string')
      ->setName('example_field')
      ->setLabel(t('Пример вычисляемого поля'))
      ->setDescription(t('Пример вычисляемого поля'))
      // Установить поле как вычисляемое поле.
      ->setComputed(ИСТИНА)
      // Установить класс, который генерирует значение(я) поля.
      ->setClass('\Drupal\[EXAMPLE]\Plugin\Field\Computed\SomeDynamicField');
  }
}

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

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