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();
$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();
}
Remplacez simplement get()
par le nom du champ directement:
$node = \Drupal\node\Entity\Node::load(1);
$paras = $node->field_paragraph->referencedEntities();
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()
.