Módulo Address - Segunda Parte

En un artículo anterior explique el uso del módulo Address en Drupal 8. En este artículo explicaré la forma en que los datos de un campo de tipo Address se guardan en la base de datos y como agregar este tipo de campo en la definición de un tipo de entidad. Como requisito previo para poder definir estos tipos de campo es que se tiene que tener el módulo Address instalado en el proyecto. Si estás creando un nuevo módulo que use este tipo de campo, es necesario que lo pongas como dependencia.

 

Este artículo es bastante técnico y está dirigido sobre todo a programadores que trabajen definiendo tipos de entidades. De momento no tenemos en nuestro blog artículos sobre este tema, pero puedes encontrar bastante información en la web.

 

Un campo de tipo Address es un campo con muchas propiedades, y cuando se agrega en un bundle (por ejemplo en un tipo de contenido) esto se representa en la base de datos con una tabla similar a la estructura de la figura más abajo. Una columna de base de datos por cada propiedad del campo, donde el nombre del campo aparece con el prefijo field_NOMBRE-CAMPO, seguido de un guión bajo y el nombre de la propiedad.

 

Address Field - en un bundle

Ahora imaginemos que hemos creado mediate código un tipo de Entidad, y deseamos agregar un campo de tipo "Address", en el método "baseFieldDefinitions" agregaremos una definición del campo (junto a los demás campos que pudiera tener este tipo de entidad). De forma similar a como se ve en el código a continuación:

 

    $fields['address'] = BaseFieldDefinition::create('address')
      ->setLabel(t('Address'))
      ->setDescription(t('Select the country in order to get the additional fields.'))
      ->setRevisionable(TRUE)
      ->setTranslatable(FALSE)
      ->setDefaultValue('')
      ->setSettings([
        'fields' => [
            'locality',
            'dependentLocality',
            'addressLine1',
            'addressLine2',
            'postalCode',
          ],        
      ])
      ->setDisplayOptions('view', [
        'label' => 'above',
        'type' => 'string',
        'weight' => 8,
      ])
      ->setDisplayOptions('form', [
        'type' => 'address_default',
        'weight' => 8,
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

 

Prestemos atención al método setSetting, que recibe un array fields, donde le decimos que campos (propiedades) se van a ver en el control cuando se llene la información.
 

Este campo se visualizará en la interfaz de usuario igual que si se hubiera agregado por el administrador de Drupal, con la diferencia que no se puede configurar a través del mismo CMS, sino solo mediate código. Si se requiere una configuración diferente del campo se podría agregar otro módulo que altere la difinición del mismo.

 

Al momento de guardarse en la base de datos, se almacena en de la siguiente manera (suponiendo que se halla configurado el tipo de entidad para que acepte revisiones y soporte multiidioma).

 

Campo Field en una tabla field_data de un tipo de entidad

 

Esta es la tabla que almacena todos los campos del tipo de entidad. En este caso para almacenar las propiedades de address también se necesitan varios "campos" de base de datos, solo que estos están en la misma tabla TIPO-ENTIDAD_field_data, donde están los demás campos y para diferenciarlos le antepone como prefijo el nombre del campo seguido de dos guiones bajos y luego el nombre de la propiedad.

Añadir nuevo comentario

Texto sin formato

  • No se permiten etiquetas HTML.
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.
CAPTCHA
Esta pregunta para comprobar que eres una persona real e impedir el envío de SPAM.