Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

Extender el formulario de configuración de EBT

05/05/2025, by Ivan

Crear una nueva clase de formulario de configuración de EBT

He escuchado a muchos programadores expresar preocupación por la cantidad de configuraciones en los módulos EBT: DOM Box, fondo, bordes, clases, etc. Estos programadores opinan que los editores de contenido se confundirán o, en su defecto, se verán motivados a crear bloques con márgenes y fondos drásticamente diferentes. Algunos proyectos necesitan flexibilidad y más configuraciones para los editores, pero otros tienen guías estrictas con componentes predefinidos. En ese caso, necesitamos cambiar el widget de campo de configuración de EBT.

Además, si estás creando un nuevo módulo EBT con un plugin JavaScript y sus opciones, necesitarás usar tu propio widget de configuración de EBT con campos específicos para estas opciones.

El módulo EBT Core tiene la clase EbtSettingsDefaultWidget para el widget del campo de configuración de EBT. Contiene DOM Box, fondo y todas las demás opciones. Vamos a crear una nueva clase EbtSettingsSimpleWidget (la colocaremos en el módulo EBT Core). Solo incluirá tres opciones: ancho y espaciado (para el margen inferior del bloque).

Crea un nuevo archivo:
/src/Plugin/Field/FieldWidget/EbtSettingsSimpleWidget.php

<?php

namespace Drupal\ebt_core\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\ebt_core\Plugin\Field\FieldWidget\EbtSettingsDefaultWidget;

/**
 * Implementación del plugin para el widget 'ebt_settings_simple'.
 *
 * @FieldWidget(
 *   id = "ebt_settings_simple",
 *   label = @Translation("Configuraciones simples de EBT"),
 *   field_types = {
 *     "ebt_settings"
 *   }
 * )
 */
class EbtSettingsSimpleWidget extends EbtSettingsDefaultWidget {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    foreach ($values as &$value) {
      $value += ['ebt_settings' => []];
    }
    return $values;
  }
}

Extendemos la clase base EbtSettingsDefaultWidget. En el comentario de anotación @FieldWidget nombramos nuestro widget con id = "ebt_settings_simple" y label = @Translation("Configuraciones simples de EBT").

También tenemos dos métodos: formElement() y massageFormValues(). Puedes dejar massageFormValues() tal como está. Drupal serializa automáticamente todas las configuraciones en un solo campo field_ebt_settings. Así que no importa cuántas configuraciones haya, se almacenarán como un array serializado y solo necesitas definir los campos con Form API:

https://www.drupal.org/docs/drupal-apis/form-api

En formElement(), definiremos los campos de configuración. Ocultemos DOM Box y las configuraciones de borde:

  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    unset($element['ebt_settings']['design_options']['box1']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_color']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_style']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_radius']);
    return $element;
  }

Si aplicas el nuevo widget de campo para uno de tus tipos de bloque EBT:

Configuraciones de EBT

Verás un formulario de configuración más pequeño:

Sin campos de borde

Ahora eliminaremos también las configuraciones de fondo. Si necesitas las configuraciones de fondo pero no las demás, puedes extender la clase EbtSettingsDefaultWidget y crear tu propio widget. Aquí tienes un ejemplo de cómo hacer que las configuraciones de EBT sean lo más pequeñas posible.

...
    unset($element['ebt_settings']['design_options']['other_settings']['background_color']);
    unset($element['ebt_settings']['design_options']['other_settings']['background_media']);
    unset($element['ebt_settings']['design_options']['other_settings']['background_image_style']);
...

Nuestro formulario ya solo tiene dos configuraciones:

solo 2 campos

Solo falta añadir el campo de Espaciado para añadir margen inferior. Usaremos clases adicionales y CSS para organizar los espacios:

spacing-none,
spacing-sm,
spacing-md,
spacing-lg,
spacing-xl,
spacing-xxl

Si necesitas una lista más grande de opciones de espaciado, siéntete libre de extender la clase EbtSettingsSimpleWidget como hicimos con EbtSettingsDefaultWidget.

    $element['ebt_settings']['design_options']['other_settings']['spacing'] = [
      '#type' => 'select',
      '#title' => $this->t('Estilo de imagen de fondo'),
      '#options' => [
        'spacing-none' => $this->t('Ninguno'),
        'spacing-sm' => $this->t('Pequeño'),
        'spacing-md' => $this->t('Medio'),
        'spacing-lg' => $this->t('Grande'),
        'spacing-xl' => $this->t('Extra grande'),
        'spacing-xxl' => $this->t('Doble extra grande'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['design_options']['other_settings']['spacing'] ?? 'spacing-none',
    ];

Ahora veo tres formas de agregar estilos al bloque:

1. Sobrescribir la plantilla del bloque y establecer la clase de espaciado ahí.
2. Generar estilos dinámicamente e incluirlos como estilos CSS personalizados por bloque.
3. Añadir clases con JavaScript generando scripts personalizados para cada bloque EBT.
4. Sobrescribir la lista de clases en la función template_preprocess_block().

Todos estos métodos funcionarán, pero creo que lo más sencillo es usar template_process_block(). De hecho, ya tenemos la función ebt_core_preprocess_block() en el archivo ebt_core.module. Usemos eso:

...
  if (!empty($ebt_settings[0]['ebt_settings']['design_options']['other_settings']['spacing'])) {
    $variables['attributes']['class'][] = $ebt_settings[0]['ebt_settings']['design_options']['other_settings']['spacing'];
  }
...

Configuraciones mínimas de EBT

Espacio para bloques EBT

Ahora pasamos las claves del campo Spacing como nombres de clase y usaremos CSS para definir el valor de los márgenes con base en estas clases:

/ebt_core/scss/ebt_core.scss

.spacing-sm {
  margin-bottom: 10px;
}

.spacing-md {
  margin-bottom: 20px;
}

.spacing-lg {
  margin-bottom: 30px;
}

.spacing-xl {
  margin-bottom: 40px;
}

.spacing-xxl {
  margin-bottom: 50px;
}

Puedes sobrescribir estos valores en tu archivo CSS personalizado, por ejemplo, usando cualquier clase de contenido o del body:

body .spacing-sm {
  margin-bottom: 15px;
}

Y también puedes sobrescribir la lista de opciones de espaciado en tu clase personalizada de widget de campo de configuración EBT.

Eso es todo, ahora puedes elegir entre DOM Box o un simple menú desplegable para definir los márgenes de tus bloques EBT.

No dudes en preguntar sobre módulos EBT en Drupal.org o mediante el formulario de contacto:

Contacto

Crear un issue en Drupal.org

Mantente en contacto en LinkedIn