Version "set" de field_get_items?

9

On peut récupérer des éléments de champ d'une entité avec

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

Mais existe-t-il un moyen pratique de faire l'inverse, Core ou autre?

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

Je voudrais éviter les tracas de l'attribution manuelle d'un $ term, allez voir à quoi ressemble la structure du tableau, puis construisez le tableau à la main, car il est parfois non trivial.

Le seul problème dans la file d'attente principale que j'ai pu trouver qui semblait vaguement similaire concernait l' api DX en langage de terrain .

Létharion
la source

Réponses:

6

Non, il n'y a pas une telle fonction.

Voir mon commentaire sur Support linguistique pour les champs d'entité .

Berdir
la source
1
Merci Berdir. J'espérais que tu te présenterais;) et j'avais aussi peur que tu le dises. Le problème avec le code dans votre commentaire est que pour de nombreux champs, la «valeur» peut être insuffisante ou tout simplement erronée.
Letharion
field_get_items () ne vous aide pas non plus, il retourne un tableau d'éléments qui contiennent de la valeur. Ou quel que soit le type de champ défini. Il n'y a aucun moyen d'abstraire cela.
Berdir
Par exemple, field_get_items () renvoie array (array ('tid' => 123)). Votre code doit savoir que field_tags est une référence de terme de taxonomie et qu'il a le jeu de clés tid et qu'il est une référence à un terme de taxonomie.
Berdir
Les commentaires ne sont plus visibles sur cette page selon le lien donné.
Junaid
Les commentaires sont maintenant sur la page de discussion: drupal.org/node/1500308/discuss
Berdir
2

Pour qu'une telle fonction existe, field_set_items()il faudrait pouvoir identifier l' stdClassobjet comme celui d'un terme de taxonomie, et également le mapper à une fonction qui peut décoder l'objet et en créer un tableau de champs.

Puisqu'il n'y a pas de fonction de base pour le faire, je ne pense pas que ce sera facile.

Clive
la source
C'est terriblement irritant qu'il n'y ait pas (encore) de propriété $ entity-> entity_type , mais quoi qu'il en soit, cela pourrait facilement être ajouté à mon exemple de rappel. J'ai mis à jour la question pour refléter cela.
Letharion
1
L'absence d'un entity_typen'est pas vraiment le problème à mon humble avis ... le problème est exactement ce que vous avez ajouté à votre question: "il est parfois non trivial". Parce que les données ne sont pas triviales, pour field_set_itemsfonctionner comme vous le souhaitez, chaque type de champ dans le système devrait implémenter une sorte d'interface décrivant comment procéder à une rétro-ingénierie du tableau de données à partir d'un objet / d'une variable arbitraire.
Clive
2

Bien que cela n'aide pas à construire la structure de tableau parfois compliquée, je vois que ce que je recherche a été dans une certaine mesure introduit dans Drupal 8. Peut-être qu'il sera étendu à l'avenir. :)

Nouvelle API plus simple disponible pour accéder aux champs, aux propriétés et aux informations sur la langue .

Exemple d'utilisation de la page liée:

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