Получать значения полей в сущностях довольно просто, но есть несколько способов для этого. Давайте посмотрим как лучше всего работать со значениями полей в кастомном коде.
Вы всегда можете посмотреть актуальную информацию по работе с полями на официальном сайте:
https://www.drupal.org/docs/8/api/entity-api/working-with-the-entity-api
В этой статье мы рассмотрим примеры работы со значениями.
Вам не обязательно запоминать как работают те или иные поля, вы всегда можете вернуться на эту страницу и вспомнить. Со временем вы будете все реже и реже обращаться к документации и осознаете как легко работаь с полями в Drupal. А пока можете добавить эту страницу в закладки, чтобы всегда иметь под рукой шпаргалку.
Работа с нодами
Загрузка ноды по ID:
$nid = 234; $node_storage = \Drupal::entityTypeManager()->getStorage('node'); $node = $node_storage->load($nid);
Получение ID ноды:
$node->id();
Получение бандла (типа материала) ноды:
$node->bundle(); // Работает для нод и многих типов сущностей, но не для всех $entity->getType(); // Работает для всех типов сущностей
Получение значений полей:
$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.
Также можно использовать короткую запись для получения значений:
$node->title->value; $node->created->value; $node->body->value; $node->body->summary; $node->field_foo->value; $node->field_image->target_id;
Загрузка определенных нод по значению поля:
$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(); }
Изменение значений в полях:
$node->set('title', "Новый тайтл"); $node->set('body', array( 'summary' => "Короткий текст", 'value' => "Длинный текст", 'format' => 'basic_html', )); $node->save();
Также для полей с одним значением можно использовать короткую запись:
$node->title = 'New title'; $node->field_text = 'text';
Получение значений множественных полей:
$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:
$fid = 42; $file_storage = \Drupal::entityTypeManager()->getStorage('file'); $file = $file_storage->load($fid);
Получение объекта файла из поля ноды:
$file = $node->field_image->entity;
Получение некоторых полей объекта файла:
$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 можно следующих образом:
echo $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:
foreach ($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:
$nids = [3,4,5,6]; $node->set('field_my_entity_reference', $nids); $node->save();
Добавление новых значений к полю enitty reference к уже существующим значениям:
$nids = [3,4,5,6]; // example value foreach ($nids as $nid) { $node->field_my_entity_reference[] = [ 'target_id' => $nid ]; } $node->save();
Работа с paragraphs
$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."; }
Получение типа параграфа:
$my_paragraph->getType();
Мы будем использовать эти примеры в будущем для написания кастомных модулей работающих с хуками и объектами сущностей.
Добавить комментарий