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.