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

12

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 fichier foreach. Mais rien n'apparaît. $parasest vide:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->get('field_paragraph')->referencedEntities();
Pankaj Yogi
la source
Vous avez dit $ paras montrant vide. mais vous n'avez pas montré comment vous avez imprimé sa valeur. Est-ce une NULLvaleur, une chaîne vide ou un tableau vide? Puisque vous avez commenté avec, je l'ai déjà fait, mais votre réponse est juste à la réponse, qui montre un code complètement différent, votre question devient un peu confuse, et ce que vous n'êtes pas en mesure de réaliser n'est pas clair.
kiamlaluno
Cette question m'a demandé quand je suis très nouveau dans Drupal 8 et que je fais une tâche d'apprentissage. Je pense que je fais une erreur dans le processus pour que le temps soit vide. Mais quand je fais la même chose maintenant, ça marche bien. vous vérifiez ici une démo exécutez le même code. Je viens de créer ceci pour vous, d2log.ply.st/devel/php username :: admin password :: admin
Pankaj Yogi

Réponses:

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();
}
Tim Ahmedov
la source
Je l'ai déjà fait, mais votre réponse est juste.
Pankaj Yogi
Attention: cette solution ne comprend pas de traductions.
ssibal
Au lieu de Paragraph :: load ($ tid), nous devons maintenant utiliser \ Drupal :: entityManager () -> getStorage ('paragraph') -> load ($ tid).
JF Kiwad
6

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

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->field_paragraph->referencedEntities();
Ken
la source
Wow, oui, mais pourquoi?
leymannx
0

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 @entity_type.managerargument et charger le stockage pour les nœuds et les paragraphes dans __construct().

arraksis
la source