Jak uzyskać dostęp do wartości pola dla obiektu encji (np. Węzła)?

63

node_load((int) $nid)ładuje w pełni zapełnioną jednostkę węzła. $node->title->valueotrzymuje tytuł, ale jak uzyskać dostęp do wartości pól w Drupal 8?

24ma13wg
źródło

Odpowiedzi:

89

Myślę, że nie trzeba konwertować $entityna tablicę, to po prostu działałoby.

$entity->get('field_name')->getValue();

FYI: Korzystanie kint()z devel_kintmodułu da ci znać wszystkie dostępne metody, które mogą być użyte do uzyskania dostępu do elementów obiektu, więc względnie var_dump()jest mniej pomocny.

DropDragon
źródło
14
Właściwie powinno to być: $ entity-> get ('nazwa_pola') -> wartość;
Ed Hollinghurst,
1
Czy wiesz, dlaczego to jest @EdHollinghurst? getValue rzeczywiście dla mnie błąd, ale (używając dpm) jest wymieniony w dostępnych metodach, podczas gdy „wartość” nie.
autopoetyczny
2
getValue()działa dla mnie (zarówno w wersji 8.1.x, jak i 8.2.x) patrz odnośnik do interfejsu API
leon.nk
16
->getValue()jest ogólny i działa niezależnie od typu pola. Jeśli używasz ->value, działa to tylko wtedy, gdy wartość pola jest przechowywana we valuewłaściwości. Nie będzie działać w przypadku bardziej złożonych typów (np. Data lub odniesienie do encji).
Pierre Buyle
4
Sam kod wygeneruje błąd, jeśli jednostka nie ma pola o nazwie „nazwa_pola”. Upewnij się, że kod tylko pobiera uruchomić na podmiotach, w których wiesz, że istnieje pole, można użyć $ entity-> Hasfield ( „nazwa_pola”) aby sprawdzić, czy if (empty ($ entity-> nazwa_pola)!)
oknate
56

w drupal 8, $ node jest węzłem klasy

 $node->field_machine_name->getValue();

lub

$node->get('field_machine_name')->getValue();

zwróci tablicę wartości.

Jeśli oczekujesz tylko jednego, równie dobrze możesz skreślić tablicę za pomocą

$node->field_machine_name->getString();

lub

 $node->get('field_machine_name')->getString();
Matoeil
źródło
Nie „rozumiem” (ciąg i wartość) „to”. Czy możesz dodać więcej szczegółów w celu wyjaśnienia tej odpowiedzi? FYI:
niezrobienie tego narazi
34

W przypadku pól powinieneś być w stanie użyć $node->body->valuena przykład. Jeśli nie wiesz, jakie są nazwy pól, polecam zainstalowanie modułu Devel dla Drupala 8 i sprawdzenie węzła za pomocą like dsm($node).

tenken
źródło
1
jak w takim razie renderujesz to pole?
Alex
1
wydaje się to nieaktualne
Alex
1
@Alex Proponuję zadać nowe pytanie dotyczące problemu, który masz. W chwili, gdy była to odpowiednia odpowiedź, edytowanie odpowiedzi wydaje się teraz niepraktyczne, ponieważ jest to odpowiedź na tej stronie, która ma więcej punktów niż ta.
tenken
5
Sprawdź ten artykuł, aby uzyskać ładne wyjaśnienie. Możesz użyć $ node-> nazwa_pola-> wartość, aby uzyskać pojedynczą wartość (lub pierwszy klucz pola o wielu wartościach). Lub możesz użyć $ node-> field_name-> getValue (), aby uzyskać wszystkie wartości pola jako tablicę.
Mirsoft,
2
@tenken: W rzeczywistości aktualizacja istniejącej odpowiedzi jest lepsza niż dodawanie zbędnego pytania z nowymi odpowiedziami.
Pierre Buyle
17

Zawsze możesz zrobić, $entity->toArray()aby zobaczyć, co jest w bycie. Nawet przy użyciu xdebug (na przykład z phpstorm) samodzielne zrozumienie obiektu bytu jest bardzo trudne. Wątpię dsm($node)w Drupal 8, który ma jakiś sens. Jeśli nalegasz na debugowanie w przeglądarce (ale nie powinieneś, Drupal 8 jest zbyt skomplikowany, aby debugować bez xdebug), dsm($node->toArray())to jest to, czego chcesz.


źródło
$ node-> toArray () nie działa dla mnie na Drupal 8.
Axel
Dodaj nowe pytanie, które szczegółowo to opisuje. Drupal\Core\Entity\EntityInterfacema toArray.
1
Ta odpowiedź nie zapewnia rozwiązania; oddawanie głosu.
colan
Chociaż ta odpowiedź niekoniecznie jest bezpośrednią odpowiedzią na to pytanie, jest to cholernie wielka funkcja. Dzięki.
Stef Van Looveren,
14

Użyj następującego fragmentu kodu, aby uzyskać wartości pól węzła

Służy do uzyskania identyfikatora węzła z adresu URL

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Aby załadować dane węzła za pomocą nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Służy do uzyskania wartości pola.

$terms = $node->get('field_Name')->getValue();  

Służy do uzyskania tytułu węzła.

$product_name = $node->getTitle();
Swapnil Bijwe
źródło
2
Załaduj węzeł w następujący sposób: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
rem
8

Dla mnie posiadanie $entity(węzła) działało:

$entity->field_name->getValue();

za pomocą 8.1.

Alex
źródło
2
Ten pobiera wszystkie wartości pola wielowartościowego do tablicy. Można go oczywiście użyć do uzyskania wartości pola o pojedynczej wartości, jednak dane wyjściowe będą wówczas zawierać tablicę o pojedynczej wartości. Aby uzyskać pojedynczą wartość pola (lub pierwszą wartość pola o wielu wartościach), użyj $ entity-> nazwa_pola-> wartość
Mirsoft,
7

Podczas korzystania (właściwy właściwy sposób):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();
Francis
źródło
4

To po prostu:

$node->get('field_name')->getValue()

Jeśli pole jest polem referencyjnym encji, istnieją specjalne sposoby uzyskania encji referencyjnych.

Aby uzyskać identyfikator docelowy (pierwszy element):

$entity->get('field_entity_reference')->target_id

Aby uzyskać załadowany obiekt (pierwszy element):

$entity->get('field_entity_reference')->entity

Podczas używania ->entityna polu automatycznie ładuje byt.

Jeśli pole może zawierać wiele referencji, możesz pobrać je wszystkie w następujący sposób:

$entities = $entity->get('field_entity_reference')->referencedEntities();

To da ci szereg bytów.

Jdrupal
źródło