12.11.1. Обращение к полям в Entity.

Главные вкладки

levmyshkin 7 августа 2019 в 19:55

Получать значения полей в сущностях довольно просто, но есть несколько способов для этого. Давайте посмотрим как лучше всего работать со значениями полей в кастомном коде.

Вы всегда можете посмотреть актуальную информацию по работе с полями на официальном сайте:

https://www.drupal.org/docs/8/api/entity-api/working-with-the-entity-api

В этой статье мы рассмотрим примеры работы со значениями.

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

Работа с нодами

Загрузка ноды по ID:

<?php$nid = 234; 
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);?>

Получение ID ноды:

<?php$node->id();?>

Получение бандла (типа материала) ноды:

<?php$node->bundle();    // Работает для нод и многих типов сущностей, но не для всех
$entity->getType();    //  Работает для всех типов сущностей?>

Получение значений полей:

<?php$node->get('title')->value;           // Заголовок ноды
$node->get('created')->value;         // Timestamp создания ноды
$node->get('body')->value;            // Поле Содержимое
$node->get('body')->summary;          // Тизер поля Содержимое
$node->get('field_foo')->value;       // Обычные текстовые или числовые поля
$node->get('field_image')->target_id; // Reference поля на другие сущности, например файл, изображения, термины таксономии, поля entity reference.
?>

Также можно использовать короткую запись для получения значений:

<?php$node->title->value;
$node->created->value;
$node->body->value;
$node->body->summary;
$node->field_foo->value;
$node->field_image->target_id;
?>

Загрузка определенных нод по значению поля:

<?php$query = \Drupal::entityQuery('node')
  ->condition('type', 'article'),
  ->condition('field_terms', 42);
$nids = $query->execute();
$nodes = $node_storage->loadMultiple($nids);
  
foreach ($nodes as $node) {
  print $node->title->value;
  // Ваш кастомный код для изменения ноды
  $node->set('title', "Новый тайтл для ноды");
  $node->save();
}?>

Изменение значений в полях:

<?php$node->set('title', "Новый тайтл");
$node->set('body', array(
'summary' => "Короткий текст",
'value' => "Длинный текст",
'format' => 'basic_html',
));
$node->save();?>

Также для полей с одним значением можно использовать короткую запись:

<?php$node->title = 'New title';
$node->field_text = 'text';?>

Получение значений множественных полей:

<?php$nids = \Drupal::entityQuery('node')->condition('type', 'zbornik_a_foto')->execute();
$nodes = Node::loadMultiple($nids);
 
$data = array();
foreach($nodes as $node) {
  $photo = array();
  foreach($node->get('field_image')->getValue() as $file){
    $fid = $file['target_id']; // get file fid;
    $photo[] = \Drupal\file\Entity\File::load($fid)->getFileUri();
  }
 
  $data[] = array(
    'rocnik' => $node->get('field_rok')->getValue(),
    'miesto' => $node->get('field_miesto_konania')->getValue(),
    'fotografie' => $node->get('field_zbornik')->getValue(),
    'foto' => $photo,
  );
}?>

Работа с файловыми полями

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

Получение файла по ID:

<?php$fid = 42; 
$file_storage = \Drupal::entityTypeManager()->getStorage('file');
$file = $file_storage->load($fid);?>

Получение объекта файла из поля ноды:

<?php$file = $node->field_image->entity;?>

Получение некоторых полей объекта файла:

<?php$file->getFileUri();   // "public://file123.jpg"
// Вы можете перевести URL файла в обычный вид из URI:
file_url_transform_relative(file_create_url($file->getFileUri()));   // "/sites/default/files/public/file123.jpg"
$file->filename->value;   // "file123.jpg"
$file->filemime->value;   // "image/jpeg"
$file->filesize->value;   // 63518  (размер в байтах)
$file->created->value;    // 1511206249  (Unix timestamp)
$file->changed->value;    // 1511234256  (Unix timestamp)
$file->id();              // 432?>

Посмотреть значения свойств файла доступных из таблицы file_managed можно следующих образом:

<?phpecho $file->uid->target_id;               // 1
echo $file->uid->value;                   // Это не будет работать. Используйте target_id.
echo $file->uid->entity->name->value;    
echo $file->uid->entity->timezone->value; // "Asia/Omsk"?>

Работа с Entity Reference полями

Вы можете получать из reference полей множественные значения и обрабатывать их через foreach:

<?phpforeach ($node->field_my_entity_reference as $reference) {
  
  // Если вы выбрали "Entity ID" как display mode для entity reference поля,
  // Только target_id будет иметь значение к которому вы имеете доступ
  print $reference->target_id;    // 1 (nid ноды)
  
  // Если вы выбрали "Rendered Entity" как display mode,  ты вы будете 
  // доступ ко всему объекту ноды.
  print $reference->entity->title->value;  
  
}
?>

Изменение множественного поля entity reference:

<?php$nids = [3,4,5,6];  
$node->set('field_my_entity_reference', $nids);
$node->save();?>

Добавление новых значений к полю enitty reference к уже существующим значениям:

<?php$nids = [3,4,5,6];   // example value
foreach ($nids as $nid) {
  $node->field_my_entity_reference[] = [
    'target_id' => $nid
  ];
}
$node->save();?>

Работа с paragraphs

<?php$my_paragraph = null;
  
foreach ($node->get('field_paragraph_reference') as $paragraph) {
  if ($paragraph->entity->getType() == 'your_paragraph_type') {  
    $my_paragraph = $paragraph->entity;
  }
}
  
if (!empty($my_paragraph)) {
  // Параграфы это обычные Entity и к их полям можно обращаться как обычно:
  print $my_paragraph->field_somefield->value;
  
  // Параграфы не имеют Title как ноды
  print $my_paragraph->title->value;  // Это не будет работать

else {
  print "The node doesn't have this paragraph type.";
}?>

Получение типа параграфа:

<?php$my_paragraph->getType();?>

Мы будем использовать эти примеры в будущем для написания кастомных модулей работающих с хуками и объектами сущностей.

Атрибуция

Абраменко Иван

Автор