Como acesso um valor de campo para um objeto de entidade (por exemplo, nó)?

63

node_load((int) $nid)carrega uma entidade do nó totalmente preenchida. $node->title->valueobtém o título, mas como acesso valores de campo no Drupal 8?

24ma13wg
fonte

Respostas:

89

Eu acho que você não precisa converter $entityem uma matriz, isso simplesmente funcionaria.

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

FYI: O uso kint()do devel_kintmódulo permitirá que você saiba todos os métodos disponíveis que podem ser usados ​​para acessar os elementos do objeto; portanto, comparativamente, var_dump()é menos útil.

DropDragon
fonte
14
Na verdade, deve ser: $ entity-> get ('field_name') -> value;
Ed Hollinghurst
11
Você sabe por que isso é @EdHollinghurst? getValue realmente comete um erro para mim, mas (usando o dpm) é listado nos métodos disponíveis, enquanto 'value' não é.
Autopoiético #
2
getValue()funciona para mim (tanto em 8.1.xe 8.2.x) consulte a referência da API
leon.nk 19/16/16
16
->getValue()é genérico e funcionará independentemente do tipo de campo. Se você usar ->value, ele funcionará apenas se o valor do campo estiver armazenado em uma valuepropriedade. Não funcionará para tipos mais complexos (por exemplo, referência de data ou entidade).
Pierre Buyle
4
Somente esse código gerará um erro se a entidade não tiver um campo chamado "field_name". Verifique se esse código é executado apenas em entidades nas quais você sabe que o campo existe, você pode usar $ entity-> hasField ('field_name') para testar ou se (! Empty ($ entity-> field_name))
oknate
56

no drupal 8, sendo $ node do nó da classe

 $node->field_machine_name->getValue();

ou

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

retornará uma matriz de valores.

Se você espera apenas um, também pode restringir a matriz com

$node->field_machine_name->getString();

ou

 $node->get('field_machine_name')->getString();
Matoeil
fonte
Eu não "recebo" (string e valor) "isso". Você pode adicionar mais alguns detalhes para explicar esta resposta? FYI: não fazê-lo coloca a sua resposta em risco de ser excluído por meio de moderação (sorry ...)
Pierre.Vriens
34

Para campos você deve poder usar, $node->body->valuepor exemplo. Se você não souber quais são os nomes dos campos, recomendo instalar o módulo Devel para Drupal 8 e inspecionar o nó por meio de um exemplo dsm($node).

tenken
fonte
11
como você renderiza esse campo então?
Alex
11
este parece ser ultrapassada
Alex
11
@ Alex Eu sugiro que você faça uma nova pergunta com o problema que está tendo. No momento em que essa foi uma resposta correta, parece desaconselhável editar a resposta agora, que é uma resposta nesta página que tem mais pontos que este.
Tenken
5
Confira este artigo para uma boa explicação. Você pode usar $ node-> field_name-> value para obter um único valor (ou a primeira chave do campo com vários valores). Ou você pode usar $ node-> field_name-> getValue () para obter todos os valores de um campo como uma matriz.
Mirsoft
2
@tenken: Na verdade, é preferível atualizar uma resposta existente do que adicionar uma pergunta redundante com novas respostas.
Pierre Buyle
17

Você sempre pode fazer $entity->toArray()para ver o que há em uma entidade. Mesmo ao usar o xdebug (por exemplo, com o phpstorm), é muito difícil entender um objeto de entidade por si próprio. Duvido que dsm($node)no Drupal 8 faça algum sentido. Se você insiste na depuração no navegador (mas não deve, o Drupal 8 é muito complexo para depurar sem o xdebug) dsm($node->toArray())é o que você deseja.


fonte
$ Nó-> toArray () não trabalho para mim no Drupal 8.
Axel Briche
Adicione uma nova pergunta detalhando isso. Drupal\Core\Entity\EntityInterfacetem toArray.
11
Esta resposta não fornece a solução; voto negativo.
Colan
Embora essa resposta não seja necessariamente uma resposta direta a essa pergunta, é uma função muito boa. Obrigado.
Stef Van Looveren
14

Use o seguinte snippet de código para obter valores de campo do nó

Isso é usado para obter o ID do nó da URL

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

Para carregar dados do nó usando nid

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

Isso é usado para obter o valor do campo.

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

Isso é usado para obter o título do nó.

$product_name = $node->getTitle();
Swapnil Bijwe
fonte
2
Carregue o nó desta forma: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
Remy #
8

Para mim, ter um $entity(um nó) funcionou:

$entity->field_name->getValue();

usando 8.1.

Alex
fonte
2
Este coloca todos os valores de um campo com vários valores em uma matriz. Obviamente, também pode ser usado para obter o valor do campo de valor único; no entanto, a saída conterá uma matriz com um único valor. Para obter um único valor de um campo (ou primeiro valor de um campo multi-valor), use $ entity-> field_name-> valor
Mirsoft
7

Enquanto estiver usando (da maneira correta):

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

É simplesmente:

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

Se o campo for um campo de referência de entidade, existem algumas maneiras especiais de obter as entidades referenciadas.

Para obter o ID de destino (primeiro elemento):

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

Para obter a entidade carregada (primeiro elemento):

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

Ao usar ->entityno campo, ele carrega automaticamente a entidade.

Se o campo puder conter várias referências, você poderá buscá-las assim:

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

Isso lhe dará uma variedade de entidades.

Jdrupal
fonte