Custom Entities y cómo asignar un tipo de widget en setDisplayOptions

Cuando estamos definiendo una entidad personalizada nos encontramos con que, en el método baseFieldDefinitions, tenemos que definir el cuerpo (campos) que compone la entidad. He tratado de buscar en la documentación el listado de los tipos, que fácilmente podemos seleccionar desde la UI, pero a nivel de código, yo al menos, era incapaz de localizarlo entre las miles de páginas que componen la API de Drupal. Como siempre hago en mis posts, no cuento mis penas sino mis soluciones.

Este código ha sido probado y verificado para Drupal 9.1.0.

La solución no es trivial, pero sí sencilla. Debemos apoyarnos de los módulos devel y devel_php para obtener la información necesaria. Sí, así me quedé yo, la información no se extrae de manera trivial sino que hay que extraerla de la versión de Drupal que tengas instalada. Por un lado tiene sentido, porque nadie sabe qué módulos tienes instalado y qué hay metido detrás del todo, pero ni siquiera la documentación te proporciona unos mínimos…

Recapitulemos con el siguiente ejemplo, qué buscamos.

$fields['unit'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Unidad'))
      ->setDescription(t('Unidad de medida para el sensor.'))
      ->setSetting('target_type', 'user')
      ->setSetting('handler', 'default')
      ->setDisplayOptions('view', [
        'label' => 'above',
        'type' => 'entity_reference_label',
        'weight' => -3,
      ])
      ->setDisplayOptions('form', [
        'type' => 'entity_reference_autocomplete',
        'settings' => [
          'match_operator' => 'CONTAINS',
          'match_limit' => 10,
          'size' => 60,
          'placeholder' => '',
        ],
        'weight' => -3,
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

Del código anterior queremos saber qué posibles valores, resaltados en negrita, pueden ir en setDisplayOptions. Tanto para el view, modo de visualización de la entidad; como para el modo form, modo de visualización cuando se edita o agrega a través de un formulario la entidad.

Una vez que tengas los dos módulos instalados, vamos a la consola de PHP. Esta sería la URL por defecto: midominio.com/devel/php

Para la parte del formulario (FORM) obtendremos la lista de posibles tipos, a través del siguiente código:

$widget_types = \Drupal::service('plugin.manager.field.widget')->getDefinitions();
$plugin_ids = array_keys($widget_types);

print_r($plugin_ids);

Y por último, para la parte de la vista (VIEW) tendremos que ejecutar el siguiente código:

$widget_types = \Drupal::service('plugin.manager.field.formatter')->getDefinitions();
$plugin_ids = array_keys($widget_types);

print_r($plugin_ids);

Ahora la guinda para el pastel que debería ser para este post si lo has llegado hasta aquí. Una lista con los valores por defecto. Así no tienes que lanzar los códigos anteriores, ni instalar los dos módulos. Disfrútalos.

setDisplayOptions(‘view‘, [
        ‘type’ =>

Array
 (
     [0] => comment_username
     [1] => comment_default
     [2] => comment_permalink
     [3] => datetime_custom
     [4] => datetime_default
     [5] => datetime_plain
     [6] => datetime_time_ago
     [7] => file_link
     [8] => file_audio
     [9] => file_extension
     [10] => file_filemime
     [11] => file_size
     [12] => file_uri
     [13] => file_video
     [14] => file_default
     [15] => file_rss_enclosure
     [16] => file_table
     [17] => file_url_plain
     [18] => image
     [19] => image_url
     [20] => link
     [21] => link_separate
     [22] => list_default
     [23] => list_key
     [24] => entity_reference_rss_category
     [25] => text_default
     [26] => text_summary_or_trimmed
     [27] => text_trimmed
     [28] => author
     [29] => user_name
     [30] => basic_string
     [31] => boolean
     [32] => number_decimal
     [33] => entity_reference_entity_view
     [34] => entity_reference_entity_id
     [35] => entity_reference_label
     [36] => number_integer
     [37] => language
     [38] => email_mailto
     [39] => number_unformatted
     [40] => string
     [41] => timestamp_ago
     [42] => timestamp
     [43] => uri_link
 )

setDisplayOptions(‘form‘, [
        ‘type’ =>

Array
 (
     [0] => comment_default
     [1] => datetime_datelist
     [2] => datetime_default
     [3] => file_generic
     [4] => image_image
     [5] => link_default
     [6] => path
     [7] => text_textarea
     [8] => text_textarea_with_summary
     [9] => text_textfield
     [10] => datetime_timestamp
     [11] => boolean_checkbox
     [12] => email_default
     [13] => entity_reference_autocomplete_tags
     [14] => entity_reference_autocomplete
     [15] => language_select
     [16] => number
     [17] => options_buttons
     [18] => options_select
     [19] => string_textarea
     [20] => string_textfield
     [21] => uri
 )

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.