web-dev-qa-db-fra.com

Comment charger une entité de paragraphe sur un objet nœud?

J'utilise des paragraphes dans mon type de contenu. J'ai créé un type de paragraphe et ajouté du contenu. Maintenant, je veux charger les paragraphes dans un foreach. Mais rien n'apparaît. $paras est vide:

$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

Remplacez simplement get() par le nom du champ directement:

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

Cette méthode fonctionnera un peu plus rapidement.

// 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...
  }
}

Vous pouvez également facilement implémenter ce code dans une méthode de votre service personnalisé avec l'argument @entity_type.manager Et charger le stockage des nœuds et des paragraphes dans __construct().

0
arraksis