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 .

Réponses:


6

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

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


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.


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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.