Obter programaticamente todos os nomes de um campo de referência de entidade

10

Exemplo: desejo obter todos os nomes de tags que estejam dentro de field_tags do nó 5.

Eu posso obter o target_id com $ node-> field_tags-> getValue () ;

insira a descrição da imagem aqui

Mas o problema é que não sei a que entidade o valor target_id pertence. Pode ser um ID do nó, ID do termo, ID do usuário. Sem essas informações, não consigo usar o target_id para obter o nome da tag.

Como posso obter todos os nomes de um campo de referência de entidade?

Sem suor
fonte

Respostas:

20

A maneira mais fácil de conseguir o que você quer é algo como isto:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entityé uma propriedade chamada computada, ela não aparece getValues(). Todos os campos de referência possuem.

E sim, esqueça print_r()a entidade ou outros objetos complexos. Eles contêm objetos que se referem um ao outro e print_r()não podem lidar com isso. Se você tem uma entidade, sempre use print_r($entity->toArray()), então você obtém apenas os valores do campo. Você pode instalar o módulo devel ou usar um depurador, mas isso fornecerá a estrutura interna de uma entidade, que não é realmente o que você deseja ver.

Berdir
fonte
2
$node->toArray();se parece muito mais curto e mais limpo do que usando\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
Sem Sssweat
Onde você encontra documentação sobre isso?
AlxVallejo 19/02/19
Você pode encontrar algumas informações aqui, por exemplo: drupal.org/docs/8/api/entity-api
Berdir
@Berdir: print_r($entity->toArray())Resolve esse problema. Consigo obter todos os detalhes dos campos. Muito obrigado.
precisa saber é o seguinte
@Berdir, você pode ser mais específico sobre a documentação? Estive pesquisando essa página, mas não vejo exemplos específicos relacionados aos campos de referência de termos.
Keven
6

Um campo de referência de entidade, por definição, pode segmentar apenas um tipo de entidade, para que você possa saber qual é o seu tipo de destino acessando getSetting()a definição de campo.

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

Ou melhor ainda, use EntityReferenceFieldItemList::referencedEntities()para acessar as entidades referenciadas do nó e os dados associados necessários.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();
Shawn Conn
fonte
print_r($node->field_tag->referencedEntities());parece ser um recurso pesado, eu atualizei minha instância da AWS , apenas para poder fazer isso, pois continuava recebendo o WSOD.
precisa saber é o seguinte
Deixe-me saber se esta deve ser uma pergunta separada. Como posso acessar o valor do nome, quando na matriz diz valores: protected, o que significa que ele só pode ser acessado dentro da classe.
No Sssweat 28/08/16
Sinto-me mal por não aceitar sua resposta, mas a resposta do @Berdir não me deu outra opção a não ser. Eu nunca descobri como obter o valor usando seu Or better yetmétodo. O primeiro método é bom, mas exigirá que as instruções verifiquem o tipo de destino e depois obtenham o valor. A resposta de Berdir é mais eficiente, pois não há necessidade de verificações.
Não Sssweat
11
Não se preocupe (... trocadilhos). A primeira versão da sua pergunta não estava muito clara quanto ao seu objetivo. Você deve marcar a resposta que melhor se encaixa.
Shawn Conn
Eu realmente gostaria que esta resposta não estivesse enterrada nesta postagem do SO. Queria obter o target_typevalor de um entity_referencecampo e procurei alto e baixo por ele ... até você responder minha pergunta aqui.
Keven