¿Cuál es el propósito de la función entity_metadata_wrapper () y por qué debería usarla?


23

Parece que estoy desarrollando complementos para muchos módulos que usan Entity API en este momento, y la entity_metadata_wrapper()función sigue apareciendo.

La página de documentos dice esto al respecto:

Devuelve un contenedor de propiedades para los datos dados.

Si una entidad está envuelta, el contenedor puede usarse para recuperar más contenedores para las propiedades de titularidad.

Ignorando la maravillosa ortografía freudiana de la palabra 'entidad' allí, realmente no entiendo cuál es el propósito de estos envoltorios.

Entiendo que la función esencialmente devuelve una EntityDrupalWrapperclase:

El reiniciador facilita la aplicación de devoluciones de llamada getter y setter de propiedades de entidad

Pero lo que no puedo entender es cómo facilita las cosas.

Por ejemplo, para actualizar la propiedad de estado de un nodo, podría usar este código:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Eso está bastante limpio. Según tengo entendido (pero puede estar equivocado) el uso del código equivalente entity_metadata_wrapper()sería más detallado que eso.

No estoy seguro de si es simplemente el uso del término 'envoltorio' lo que me está haciendo tropezar aquí, pero también he revisado el código en el módulo Entidad y no estoy realmente más cerca de entenderlo.

¿Alguien puede explicar cuáles son los beneficios de usar esta función y tal vez proporcionar un ejemplo de código simple para un caso de uso común?


Esto puede agregar una comprensión más profunda de la API y los contenedores de la entidad. Es una charla de Fago, el chico de la entidad. wolfgangziegler.net/drupalcon-denver
Ken

Gracias, eso suena realmente útil desde el gambito de apertura. Lo echaré un vistazo cuando tenga algo de tiempo
Clive

Ese "video ha sido eliminado de blip" pero las diapositivas aún se descargan.
artfulrobot

Respuestas:


23

Sí, cambiar el estado de un nodo es trivial, ya que es una propiedad codificada.

Los campos, por otro lado, son mucho más complicados. Están anidados en tres niveles de profundidad, mientras que hay field_get_items () para obtenerlos en el idioma correcto, no existe tal función para establecer valores de campo. Por lo tanto, siempre debe verificar si un campo es traducible o no y debe saber qué propiedad contiene exactamente los valores que está buscando / desea establecer.

Dos ejemplos, que muestran lo que puede hacer el reiniciador de entidad:

  • La siguiente línea agrega la línea de pedido comercial al pedido, cuidando el idioma y la propiedad real que contiene la identificación de referencia, tomada de la siguiente respuesta /drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • De manera similar, poder acceder directamente a un valor de un campo, sin tener que verificar el idioma o el delta, incluso poder acceder directamente a entidades referenciadas, tomadas de /drupal//a/ 33010/31

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

El envoltorio de entidad es la fuerza impulsora detrás de módulos flexibles y potentes como Search API y Reglas, ya que les permite abrirse camino a través de múltiples niveles de referencias, por lo que puede, por ejemplo, acceder a un campo del producto que un usuario compró en un pedido con algo [commerce-order:commerce-line-items:0:commerce-product:some-field]Me gusta (puede que en realidad no sea correcto, pero algo así), o agregue el resumen del cuerpo de un nodo referenciado a su índice de búsqueda.

Dicho esto, no soy necesariamente aficionado a la API real del contenedor, son enormes matrices internas y que incluso las propiedades simples son nuevamente clases de contenedor. Espero que el sistema mejorado de entidades (y con suerte de campo) en Drupal 8 elimine la necesidad de tal envoltorio gracias a tener entidades clasificadas.


Brillante, sabía que me había perdido algo con esto. Creo que fue la descripción de lo EntityDrupalWrapperque causó la confusión; cuando mencionó 'propiedades' no me di cuenta de que los campos estaban involucrados en absoluto, solo pensé que literalmente significaba que la clase se ocupaba de las propiedades (nid, estado, etc.). Gracias por aclarar eso, saber que el módulo Reglas lo usa para el selector de datos tiene mucho más sentido
Clive

@ Berdir "No soy necesariamente aficionado a la API real de la envoltura ..." Tengo los mismos sentimientos que tú. ¿Haces algo para combatir esto? ¿Utiliza field_view_value () para ver los valores? ¿Cómo recomendaría establecer valores en devoluciones de llamada personalizadas para un flujo de trabajo o panel personalizado?
Charlie Schliesser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.