¿Cómo accedo a un valor de campo para un objeto de entidad (por ejemplo, nodo)?

63

node_load((int) $nid)carga una entidad de nodo completamente poblada. $node->title->valueobtiene el título, pero ¿cómo accedo a los valores de campo en Drupal 8?

24ma13wg
fuente

Respuestas:

89

Supongo que no necesita convertir $entityen una matriz, esto simplemente funcionaría.

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

FYI: Usar kint()desde el devel_kintmódulo le permitirá conocer todos los métodos disponibles que podrían usarse para acceder a los elementos del objeto, por lo que comparativamente var_dump()es menos útil.

DropDragon
fuente
14
En realidad, debería ser: $ entity-> get ('field_name') -> value;
Ed Hollinghurst
1
¿Sabes por qué este es @EdHollinghurst? getValue realmente me produce un error, pero (usando dpm) aparece en los métodos disponibles, mientras que 'valor' no lo está.
autopoiético
2
getValue()funciona para mí (tanto en 8.1.xy 8.2.x) vea la referencia de la API
leon.nk
16
->getValue()es genérico y funcionará independientemente del tipo de campo. Si lo usa ->value, solo funciona si el valor del campo se almacena en una valuepropiedad. No funcionará para tipos más complejos (por ejemplo, fecha o referencia de entidad).
Pierre Buyle
44
Este código solo arrojará un error si la entidad no tiene un campo llamado "field_name". Asegúrese de que este código solo se ejecute en entidades donde sabe que ese campo existe, puede usar $ entity-> hasField ('field_name') para probar, o si (! Empty ($ entity-> field_name))
oknate
56

en drupal 8, $ node es de clase nodo

 $node->field_machine_name->getValue();

o

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

devolverá una matriz de valores.

Si espera solo uno, también podría encadenar la matriz con

$node->field_machine_name->getString();

o

 $node->get('field_machine_name')->getString();
Matoeil
fuente
No "entiendo" (cadena y valor) "it". ¿Pueden agregar más detalles para explicar esta respuesta? FYI: no hacerlo pone su respuesta en riesgo de ser eliminada por moderación (lo siento ...)
Pierre.Vriens
34

Para campos que debería poder usar, $node->body->valuepor ejemplo. Si no sabe cuáles son los nombres de campo, recomiendo instalar el módulo Devel para Drupal 8 e inspeccionar el nodo a través de like dsm($node).

Tenken
fuente
1
¿Cómo se representa ese campo entonces?
Alex
1
esto parece estar desactualizado
Alex
1
@ Alex Le sugiero que haga una nueva pregunta con el problema que está teniendo. En el momento en que esta fue una respuesta correcta, parece poco lógico editar la respuesta ahora que es una respuesta en esta página que tiene más puntos que esta.
Tenken
55
Consulte este artículo para obtener una buena explicación. Puede usar $ node-> field_name-> value para obtener un valor único (o la primera clave del campo de valores múltiples). O puede usar $ node-> field_name-> getValue () para obtener todos los valores de un campo como una matriz.
Mirsoft
2
@tenken: En realidad, actualizar una respuesta existente es preferible a agregar una pregunta redundante con nuevas respuestas.
Pierre Buyle
17

Siempre puede hacer $entity->toArray()para ver qué hay en una entidad. Incluso cuando se usa xdebug (por ejemplo, con phpstorm) es muy difícil dar sentido a un objeto de entidad por sí solo. Dudo que dsm($node)en Drupal 8 tenga sentido. Si insiste en la depuración en el navegador (pero no debería, Drupal 8 es demasiado complejo para depurar sin xdebug) dsm($node->toArray())es lo que desea.


fuente
$ node-> toArray () no funciona para mí en Drupal 8.
Axel Briche
Agregue una nueva pregunta que detalle eso. Drupal\Core\Entity\EntityInterfacetiene toArray.
1
Esta respuesta no proporciona la solución; downvoting
colan
Si bien esta respuesta no es necesariamente una respuesta directa a esta pregunta, es una función muy buena. Gracias.
Stef Van Looveren
14

Use el siguiente fragmento de código para obtener valores de campo de nodo

Esto se utiliza para obtener la identificación del nodo de la url

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

Para cargar datos de nodo usando nid

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

Esto se usa para obtener el valor del campo.

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

Esto se usa para obtener el título del nodo.

$product_name = $node->getTitle();
Swapnil Bijwe
fuente
2
Cargue el nodo de esta manera: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ nodo = \ Drupal :: entityTypeManager () -> getStorage ('nodo') -> load ($ nid);
rémy
8

Para mí, tener un $entity(un nodo) esto funcionó:

$entity->field_name->getValue();

utilizando 8.1.

Alex
fuente
2
Este obtiene todos los valores de un campo de valores múltiples en una matriz. Por supuesto, también se puede usar para obtener el valor del campo de valor único, sin embargo, la salida contendrá una matriz con un solo valor. Para obtener un solo valor de un campo (o primer valor de un campo de valores múltiples), use $ entity-> field_name-> value
Mirsoft
7

Mientras usa (la forma correcta real):

$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
fuente
4

Es simplemente:

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

Si el campo es un campo de referencia de entidad, hay algunas formas especiales de obtener las entidades referenciadas.

Para obtener la identificación de destino (primer elemento):

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

Para obtener la entidad cargada (primer elemento):

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

Cuando se usa ->entityen el campo, carga automáticamente la entidad.

Si el campo puede contener múltiples referencias, puede buscarlas todas de esta manera:

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

Eso te dará una gran variedad de entidades.

Jdrupal
fuente