logo

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

Extensión del formulario de configuración de EPT

13/06/2025, by Ivan

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

He escuchado de muchos programadores preocupaciones sobre la cantidad de configuraciones para los módulos EPT: DOM Box, fondo, bordes, clases, etc. Estos programadores insinuaban que los editores de contenido se confundirán o de alguna manera se verán motivados a crear párrafos, márgenes y fondos drásticamente diferentes. Algunos proyectos necesitan flexibilidad y más configuraciones para los editores de contenido, pero otros proyectos tienen guías de estilo bastante estrictas con componentes. Para este caso, necesitamos cambiar nuestro widget de campo de Configuración de EPT.

Además, si creas un nuevo módulo EPT y le adjuntas un plugin de JavaScript con opciones, necesitarás usar tu propio widget de configuración EPT con campos de configuración para estas opciones.

El módulo Core de EPT tiene la clase EptSettingsDefaultWidget para el widget de campo de Configuración de EPT. Contiene DOM Box, fondo y todas las demás configuraciones. Vamos a empezar a crear una nueva clase EptSettingsSimpleWidget (la pondré en el módulo Core de EPT). Contendrá solo tres configuraciones: Ancho, Espaciado (para el margen inferior del párrafo).

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

<?php

namespace Drupal\ept_core\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\Color;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\ept_core\Plugin\Field\FieldWidget\EptSettingsDefaultWidget;

/**
 * Implementación del plugin para el widget 'ept_settings_simple'.
 *
 * @FieldWidget(
 *   id = "ept_settings_simple",
 *   label = @Translation("Configuraciones simples de párrafo EPT"),
 *   field_types = {
 *     "ept_settings"
 *   }
 * )
 */
class EptSettingsSimpleWidget extends EptSettingsDefaultWidget  {

  /**
   * {@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 += ['ept_settings' => []];
    }
    return $values;
  }

}

Vamos a extender nuestra clase básica de configuraciones EptSettingsDefaultWidget. En el comentario de anotación @FieldWidget nombraremos nuestro widget id = "ept_settings_simple" y label = @Translation("EPT Simple settings")

/**
 * Implementación del plugin para el widget 'ept_settings_simple'.
 *
 * @FieldWidget(
 *   id = "ept_settings_simple",
 *   label = @Translation("Configuraciones simples de párrafo EPT"),
 *   field_types = {
 *     "ept_settings"
 *   }
 * )
 */

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

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

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

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

    return $element;
  }

Si aplicas el nuevo widget de campo a uno de tus tipos de párrafo EPT:

Simple EPT widget
Widget EPT simple

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

EPT settings form
Formulario de configuración EPT

Ahora también eliminaremos las configuraciones de fondo. Si necesitas configuraciones de fondo y no necesitas todas las demás, puedes extender la clase EptSettingsDefaultWidget y crear tu propio widget de campo. Aquí tienes un ejemplo de cómo hacer que la Configuración EPT sea lo más simple posible.

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

Nuestro formulario ya tiene solo dos configuraciones:

Only two fields
Solo dos campos

Solo queda añadir el campo Espaciado para agregar un margen en la parte inferior. Usaremos clases adicionales y CSS para organizar los espaciados:

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

Quizá necesites una lista más grande de espacios, siéntete libre de extender la clase EptSettingsSimpleWidget y crear tu propia clase de widget de campo a partir de ella como hicimos con EptSettingsDefaultWidget.

$element['ept_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('Mediano'),
        'spacing-lg' => $this->t('Grande'),
        'spacing-xl' => $this->t('Extra grande'),
        'spacing-xxl' => $this->t('Doble extra grande'),
      ],
      '#default_value' => $items[$delta]->ept_settings['design_options']['other_settings']['spacing'] ?? 'spacing-none',
    ];

Ahora veo tres formas de agregar estilos a nuestro bloque:

1. Sobrescribir la plantilla del bloque y establecer el espaciado ahí como clase del bloque.

2. Generar estilos en tiempo real e incluirlos como estilos CSS personalizados para cada párrafo.

3. Añadir la clase con JavaScript generando un script personalizado para cada párrafo EPT.

4. Sobrescribir la lista de clases en la función template_preprocess_block().

Todos estos enfoques funcionarán, pero creo que será más sencillo usar la función template_process_paragraph(). Al menos, ya tenemos la función ept_core_preprocess_block() en el archivo ebt_core.module. Usemos eso:

...
  if (!empty($ept_settings[0]['ept_settings']['design_options']['other_settings']['spacing'])) {
    $variables['attributes']['class'][] = $ept_settings[0]['ept_settings']['design_options']['other_settings']['spacing'];
  }
...
Medium spacing
Espaciado mediano
Spacing class
Clase de espaciado

Ahora pasamos las claves del campo Espaciado como nombres de clase y usaremos CSS para definir el valor de los márgenes según estas clases:

/ebt_core/scss/ept_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 los valores en tu archivo CSS personalizado, por ejemplo usando cualquier clase desde el contenido o la etiqueta body:

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

Y puedes sobrescribir la lista de espacios en tu clase personalizada para el widget de campo de configuraciones EBT.

Eso es todo, ahora puedes elegir entre DOM Box y un simple select box para establecer 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 una incidencia en Drupal.org

Mantente en contacto en LinkedIn