Jak załadować encję akapitu na obiekt węzła?

12

Używam akapitów w moim typie treści. Utworzyłem typ akapitu i dodałem treść. Teraz chcę załadować akapity w foreach. Ale nic się nie pojawia. $parasjest pusty:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->get('field_paragraph')->referencedEntities();
Pankaj Jogin
źródło
Powiedziałeś $ paras pokazując puste. ale nie pokazałeś, jak wydrukowałeś jego wartość. Czy jest to NULLwartość, pusty ciąg, czy pusta tablica? Ponieważ skomentowałeś już to zrobiłem, ale twoja odpowiedź jest właściwa do odpowiedzi, która pokazuje zupełnie inny kod, twoje pytanie jest trochę zagmatwane i nie jest jasne, czego nie jesteś w stanie osiągnąć.
kiamlaluno
To pytanie zadane, gdy jestem bardzo nowy w Drupal 8, wykonuję zadanie uczenia się. Myślę, że popełniam pewien błąd w procesie, więc czas pokazuje się pusty. Ale kiedy robię to samo, teraz działa dobrze. sprawdzasz tutaj wersję demonstracyjną uruchamiającą ten sam kod. Po prostu tworzę to dla ciebie, d2log.ply.st/devel/php nazwa użytkownika :: hasło administratora :: admin
Pankaj Yogi

Odpowiedzi:

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
źródło
Już to zrobiłem, ale twoja odpowiedź jest prawidłowa.
Pankaj Yogi
Uważaj: to rozwiązanie nie obejmuje tłumaczeń.
ssibal
Zamiast akapitu :: load ($ tid), powinniśmy teraz użyć \ Drupal :: entityManager () -> getStorage ('akapit') -> load ($ tid).
JF Kiwad
6

Wystarczy zastąpić get()bezpośrednio nazwą pola:

$node  = \Drupal\node\Entity\Node::load(1);
$paras = $node->field_paragraph->referencedEntities();
Rozpoznać
źródło
Wow, tak, ale dlaczego?
leymannx,
0

Ta metoda będzie działać nieco szybciej.

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

Możesz również łatwo zaimplementować ten kod w dowolnej metodzie w usłudze niestandardowej za pomocą @entity_type.managerargumentów i pamięci masowej dla węzłów i akapitów w __construct().

arraksis
źródło