Drupal → Как добавить базовое поле сущности (сохраняем User Agent комментатора)

10.04.2021

Пример добавления для сущности комментария базового поля, содержащее юзерагент пользователя.

1. Добавляем сущности comment новое базовое поле useragent:

// MODULENAME.module

use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;

/**
 * Implements hook_entity_base_field_info().
 */
function MODULENAME_entity_base_field_info(EntityTypeInterface $entity_type): array {
  $fields = [];
  
  if ($entity_type->id() == 'comment') {
    $fields['useragent'] = BaseFieldDefinition::create('string')->setLabel(t('Useragent'));
  }

  return $fields;
}

2. Добавляем в MODULENAME.install следующий код и выполняем vendor/bin/drush updb либо переустанавливаем модуль MODULENAME:

// MODULENAME.install

/**
 * Implements hook_install().
 */
function MODULENAME_install(): void {
  $field = BaseFieldDefinition::create('string')->setLabel(t('Useragent'));
  \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('useragent', 'comment', 'MODULENAME', $field);
}

/**
 * Add comment useragent base field.
 */
function MODULENAME_update_8001(): void {
  $field = BaseFieldDefinition::create('string')->setLabel(t('Useragent'));
  \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('useragent', 'comment', 'MODULENAME', $field);
}

3. При добавлении сущности заполняем поле значением:

// MODULENAME.module

/**
 * Implements hook_ENTITY_TYPE_presave(): comment.
 */
function MODULENAME_comment_presave(CommentInterface $comment): void {
  if ($comment->isNew()) {
    $useragent = \Drupal::request()->server->get('HTTP_USER_AGENT');
    $comment->set('useragent', substr($useragent, 0, 255));
  }
}

Profit. Получить сохранённый user agent можно с помощью $comment->get('useragent')->value

Написанное актуально для
Drupal 8+
Похожие записи

Добавить комментарий