Versión "set" de field_get_items?

9

Uno puede recuperar elementos de campo de una entidad con

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

Pero, ¿hay una manera conveniente de hacer lo contrario, Core o de otra manera?

// 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);

Me gustaría evitar la molestia de asignar manualmente un término $, ir a ver cómo se ve la estructura de la matriz y luego construir la matriz a mano, ya que a veces no es trivial.

El único problema en la cola central que pude encontrar que parecía vagamente similar fue sobre el lenguaje de campo api DX .

Letharion
fuente

Respuestas:

6

No, no existe tal función.

Vea mi comentario en Soporte de idiomas para campos de entidad .

Berdir
fuente
1
Gracias Berdir Esperaba que aparecieras;) y también tenía miedo de que lo dijeras. El problema con el código en su comentario es que para muchos campos, 'valor' puede ser insuficiente o simplemente incorrecto.
Letharion
field_get_items () tampoco te ayuda con eso, devuelve una matriz de elementos que contienen valor. O lo que sea que el tipo de campo defina. No hay forma de abstraer eso.
Berdir
Por ejemplo, field_get_items () devuelve array (array ('tid' => 123)). Su código necesita saber que field_tags es una referencia de término de taxonomía y que tiene establecida la clave tid y que es una referencia a un término de taxonomía.
Berdir el
Los comentarios ya no son visibles en esa página según el enlace dado.
Junaid
Los comentarios están en la página de discusión ahora: drupal.org/node/1500308/discuss
Berdir
2

Para que tal función exista, field_set_items()debería ser capaz de identificar el stdClassobjeto como el de un término de taxonomía, y también asignarlo a una función que pueda decodificar el objeto y crear una matriz de campo a partir de él.

Como no hay una función central para hacer eso, no creo que esto sea fácil.

Clive
fuente
Es terriblemente irritante que no haya una propiedad $ entity-> entity_type (todavía) , pero independientemente, eso podría agregarse fácilmente a mi devolución de llamada de ejemplo. Actualicé la pregunta para reflejar esto.
Letharion
1
La falta de un entity_typeno es realmente el problema en mi humilde opinión ... el problema es exactamente lo que ha agregado a su pregunta: "a veces no es trivial". Debido a que los datos no son triviales, para field_set_itemsque funcione como lo desee, cada tipo de campo en el sistema necesitaría implementar algún tipo de interfaz que describa cómo realizar ingeniería inversa en la matriz de datos desde un objeto / variable arbitraria.
Clive
2

Aunque esto no ayuda a construir la estructura de matriz a veces complicada, veo que lo que estoy buscando se ha introducido hasta cierto punto en Drupal 8. Quizás se extenderá aún más en el futuro. :)

Nueva API más simple disponible para acceder a campos, propiedades e información de idioma .

Ejemplo de uso de la 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
fuente