web-dev-qa-db-ja.com

ノードオブジェクトに段落エンティティを読み込む方法は?

コンテンツタイプに段落を使用しています。段落タイプを作成し、コンテンツを追加しました。次に、foreachに段落をロードします。しかし、何も表示されていません。 $parasは空です:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->get('field_paragraph')->referencedEntities();
12
Pankaj Yogi
$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();
}
23
Tim Ahmedov

get()をフィールド名に直接置き換えるだけです:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->field_paragraph->referencedEntities();
6
Ken

この方法は少し速く動作します。

_// 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()のノードと段落のストレージをロードすることもできます。

0
arraksis