Versão "set" de field_get_items?

9

Pode-se recuperar itens de campo de uma entidade com

// Find all terms on $node in field 'field_tags'.
$terms = field_get_items('node', $node, 'field_tags');

Mas existe uma maneira conveniente de fazer o inverso, Core ou não?

// Attach new term $term to $node in field 'field_tags'.
$term = taxonomy_term_load($tid);
$node = field_set_items('node', $node, 'field_tags', 'taxonomy_term', $term);
node_save($node);

Gostaria de evitar o incômodo de atribuir manualmente um termo $, analisar o aspecto da estrutura da matriz e depois construí-la manualmente, pois às vezes não é trivial.

O único problema na fila principal que pude encontrar que parecia vagamente semelhante foi sobre a linguagem de campo api DX .

Letharion
fonte

Respostas:

6

Não, não existe essa função.

Veja meu comentário em Suporte a idiomas para campos de entidade .

Berdir
fonte
11
Obrigado Berdir. Eu esperava que você aparecesse;) e também tinha medo de que você o dissesse. O problema com o código no seu comentário é que, para muitos campos, 'valor' pode ser insuficiente ou simplesmente errado.
Letharion
field_get_items () também não ajuda nisso, ele retorna uma matriz de itens que contêm valor. Ou qualquer que seja o tipo de campo definido. Não há como abstrair isso.
Berdir
Por exemplo, field_get_items () retorna array (array ('tid' => 123)). Seu código precisa saber que field_tags é uma referência de termo de taxonomia e que possui o conjunto de chaves tid e que é uma teferência a um termo de taxonomia.
Berdir
Os comentários não são mais visíveis nessa página, de acordo com o link fornecido.
Junaid
Os comentários são na página de discutir agora: drupal.org/node/1500308/discuss
Berdir
2

Para que tal função exista, field_set_items()será necessário identificar o stdClassobjeto como o de um termo de taxonomia e também mapeá-lo para uma função que possa decodificar o objeto e criar uma matriz de campos a partir dele.

Como não há função principal para fazer isso, não acho que isso seja fácil.

Clive
fonte
É terrivelmente irritante que ainda não haja propriedade $ entity-> entity_type (ainda) , mas, independentemente disso, isso poderia ser facilmente adicionado ao meu exemplo de retorno de chamada. Eu atualizei a pergunta para refletir isso.
Letharion
11
A falta de um entity_typenão é realmente o problema IMHO ... o problema é exatamente o que você adicionou à sua pergunta: "às vezes não é trivial". Como os dados não são triviais, para field_set_itemsfuncionar como você deseja, cada tipo de campo no sistema precisaria implementar algum tipo de interface descrevendo como fazer engenharia reversa da matriz de dados a partir de uma variável objeto / arbitrária.
Clive
2

Embora isso não ajude a construir a estrutura de matriz algumas vezes complicada, vejo que o que estou procurando foi introduzido em certa medida no Drupal 8. Talvez seja estendido ainda mais no futuro. :)

Nova API mais simples disponível para acessar campos, propriedades e informações de idioma .

Exemplo de uso da página vinculada:

<?php
// Change a field value.
$body = $comment->get('comment_body');
$body[0]['value'] = 'This is actually a perverted tango';
$comment->set('comment_body', $body);
Letharion
fonte