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?

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.


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();

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).


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.


$ 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();

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.


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();


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.