Il semble que je développe actuellement des modules complémentaires pour de nombreux modules qui utilisent l' API Entity , et la entity_metadata_wrapper()
fonction continue de s'afficher.
La page des documents le dit:
Renvoie un wrapper de propriété pour les données données.
Si une entité est encapsulée, l'encapsuleur peut être utilisé pour récupérer d'autres encapsuleurs pour les propriétés de droit.
Ignorant l'orthographe merveilleusement freudienne du mot «entité» là-dedans, je ne comprends pas vraiment quel est le but de ces emballages.
Je comprends que la fonction renvoie essentiellement une EntityDrupalWrapper
classe:
L'encapsuleur facilite l'application des rappels getter et setter des propriétés d'entité
Mais ce que je ne peux pas comprendre, c'est comment cela facilite les choses.
Par exemple, pour mettre à jour la propriété status d'un nœud, je pourrais utiliser ce code:
$node = node_load($nid);
$node->status = 1;
node_save($node);
C'est assez propre. Si je comprends bien (mais peut-être faux), le code équivalent à utiliser entity_metadata_wrapper()
serait plus détaillé que cela.
Je ne sais pas si c'est simplement l'utilisation du terme `` wrapper '' qui me fait trébucher ici, mais j'ai également parcouru le code dans le module Entity et je ne suis pas vraiment plus proche de le comprendre.
Quelqu'un peut-il expliquer les avantages de cette fonction et peut-être fournir un exemple de code simple pour un cas d'utilisation courant?
Réponses:
Oui, la modification de l'état d'un nœud est triviale, car il s'agit d'une propriété codée en dur.
Les champs en revanche sont beaucoup plus compliqués. Ils sont imbriqués à trois niveaux de profondeur, alors qu'il y a field_get_items () pour les obtenir dans la langue correcte, il n'y a pas une telle fonction pour définir les valeurs de champ. Ainsi, vous devez toujours vérifier si un champ est traduisible ou non et vous devez savoir quelle propriété contient exactement les valeurs que vous recherchez / souhaitez définir.
Deux exemples, qui montrent ce que le wrapper d'entité peut faire:
La ligne suivante ajoute l'élément de campagne commerciale à la commande, en prenant soin de la langue et de la propriété réelle qui contient l'ID de référence, tirée de la réponse suivante /drupal//a/23513/31
De manière similaire, pouvoir accéder directement à une valeur d'un champ, sans avoir à vérifier la langue, ni le delta, voire même accéder directement aux entités référencées, issues de /drupal//a/ 33010/31
Le wrapper d'entité est la force motrice derrière des modules flexibles et puissants comme l' API de recherche et les règles car il leur permet de se frayer un chemin à travers plusieurs niveaux de références, de sorte que vous pouvez par exemple accéder à un champ du produit qu'un utilisateur a acheté dans une commande avec quelque chose comme
[commerce-order:commerce-line-items:0:commerce-product:some-field]
(peut-être pas correct, mais quelque chose comme ça), ou ajoutez le résumé du corps d'un nœud référencé à votre index de recherche.Cela dit, je n'apprécie pas nécessairement l'API réelle de l'encapsuleur, ce sont d'énormes tableaux internes et que même les propriétés simples sont à nouveau des classes d'encapsuleur. J'espère que le système d'entité amélioré (et, espérons-le, sur le terrain) de Drupal 8 supprimera le besoin d'un tel wrapper grâce à la classification des entités.
la source
EntityDrupalWrapper
qui a causé la confusion; quand il mentionnait les «propriétés», je ne savais pas que les champs étaient impliqués du tout, je pensais juste que cela signifiait littéralement que la classe s'occupait des propriétés (nid, status, etc.). Merci d'avoir clarifié cela, sachant que le module Rules l'utilise pour le sélecteur de données rend cela beaucoup plus logique