Как загрузить сущность абзаца на объекте узла?

12

Я использую абзацы в моем типе контента. Я создал тип абзаца и добавил контент. Теперь я хочу загрузить абзацы в foreach. Но ничего не появляется. $parasпустой:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->get('field_paragraph')->referencedEntities();
Панкадж Йоги
источник
Вы сказали, что $ paras показывается пустым. но вы не показали, как вы напечатали его значение. Это NULLзначение, пустая строка или пустой массив? Поскольку вы прокомментировали это, я уже сделал это, но ваш ответ - правильный ответ, который показывает совершенно другой код, ваш вопрос немного запутан, и неясно, чего вы не можете достичь.
kiamlaluno
Этот вопрос задавался, когда я совсем недавно в Drupal 8 выполнял задание для обучения. Я думаю, что я делаю какую-то ошибку в процессе, чтобы время показывало пустым. Но когда я делаю то же самое, теперь оно работает нормально. Вы проверяете здесь демо запустить тот же код. Я просто создаю это для вас, d2log.ply.st/devel/php username :: admin пароль :: admin
Pankaj Yogi

Ответы:

23
$paragraph = $node->field_paragraph->getValue();
// Loop through the result set.
foreach ( $paragraph as $element ) {
  $p = \Drupal\paragraphs\Entity\Paragraph::load( $element['target_id'] );
  $text = $p->field_name->getValue();
}
Тим Ахмедов
источник
Я уже сделал это, но ваш ответ правильный.
Панкадж Йоги
Будьте осторожны: это решение не включает переводы.
Ссибал
Вместо Paragraph :: load ($ tid) теперь мы должны использовать \ Drupal :: entityManager () -> getStorage ('абзац') -> load ($ tid).
Дж. Ф. Кивад
6

Просто замените get()имя поля напрямую:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->field_paragraph->referencedEntities();
кругозор
источник
Вау, да, но почему?
leymannx
0

Этот метод будет работать немного быстрее.

// Get data from field.
if ($paragraph_field_items = $node->get('field_paragraph')->getValue()) {
  // Get storage. It very useful for loading a small number of objects.
  $paragraph_storage = \Drupal::entityTypeManager()->getStorage('paragraph');
  // Collect paragraph field's ids.
  $ids = array_column($paragraph_field_items, 'target_id');
  // Load all paragraph objects.
  $paragraphs_objects = $paragraph_storage->loadMultiple($ids);
  /** @var \Drupal\paragraphs\Entity\Paragraph $paragraph */
  foreach ($paragraphs_objects as $paragraph) {
    // Get field from the paragraph.
    $text = $paragraph->get('field_title')->value;
    // Do something with $text...
  }
}

Вы также можете легко реализовать этот код в каком-либо методе в вашей пользовательской службе с @entity_type.managerаргументами и загрузкой хранилища для узлов и абзацев в __construct().

arraksis
источник