Quel est le but de la fonction entity_metadata_wrapper () et pourquoi devrais-je l'utiliser?

23

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 EntityDrupalWrapperclasse:

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?

Clive
la source
Cela peut ajouter une compréhension plus approfondie de l'api d'entité et des wrappers. C'est un discours de Fago, le type Entity. wolfgangziegler.net/drupalcon-denver
Ken
Merci, cela semble vraiment utile à partir du gambit d'ouverture. Je vais y jeter un œil quand j'aurai du temps
Clive
Cette "vidéo a été supprimée du blip", mais les diapositives sont toujours téléchargées.
artfulrobot

Réponses:

23

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

    $order_wrapper->commerce_line_items[] = $line_item;
  • 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

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

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.

Berdir
la source
Brillant, je savais que je venais de rater quelque chose avec ça. Je pense que c'est la description du EntityDrupalWrapperqui 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
Clive
@Berdir "Je n'aime pas nécessairement l'API réelle du wrapper ..." J'ai les mêmes sentiments que vous. Faites-vous quelque chose pour lutter contre cela? Utilisez-vous field_view_value () pour afficher les valeurs? Comment recommanderiez-vous de définir des valeurs dans les rappels personnalisés pour un flux de travail ou un tableau de bord personnalisé?
Charlie Schliesser