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
20/06/2025, by Ivan

Menu

Parte V de la Guía práctica para crear módulos básicos en Drupal 8
De .info a tests, solo lo básico

Recuerden que al comienzo de esta lección mencioné que íbamos a definir un bloque con un formulario? Bueno, ahora es el momento de abordarlo.

/src/Form/LoremIpsumBlockForm.php

<?php

namespace Drupal\loremipsum\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;

/**
 * Formulario del bloque Lorem Ipsum
 */
class LoremIpsumBlockForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'loremipsum_block_form';
  }

Este archivo es muy similar a un archivo de configuración, excepto que extiende la clase FormBase.

También tiene un método buildForm() aproximadamente así:

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    // ¿Cuántos párrafos?
    $options = array_combine(range(1, 10), range(1, 10));
    $form['paragraphs'] = [
      '#type' => 'select',
      '#title' => $this->t('Párrafos'),
      '#options' => $options,
      '#default_value' => 4,
      '#description' => $this->t('¿Cuántos?'),
    ];

    // ¿Cuántas frases?
    $form['phrases'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Frases'),
      '#default_value' => '20',
      '#description' => $this->t('Máximo por párrafo'),
    ];

    // Enviar.
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Generar'),
    ];

    return $form;
  }

Este método se usa para colocar el formulario en el bloque, con el cual los usuarios pueden configurar cuántos textos ficticios desean generar.

No olvides también los métodos validateForm() y submitForm():

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $phrases = $form_state->getValue('phrases');
    if (!is_numeric($phrases)) {
      $form_state->setErrorByName('phrases', $this->t('Por favor, use un número.'));
    }

    if (floor($phrases) != $phrases) {
      $form_state->setErrorByName('phrases', $this->t('Por favor, sin decimales.'));
    }
    
    if ($phrases < 1) {
      $form_state->setErrorByName('phrases', $this->t('Por favor, use un número mayor que cero.'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_state->setRedirect('loremipsum.generate', [
      'paragraphs' => $form_state->getValue('paragraphs'),
      'phrases' => $form_state->getValue('phrases'),
    ]);
  }

}

Ahora, para el propio bloque.

<?php

namespace Drupal\loremipsum\Plugin\Block;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;

/**
 * Proporciona un bloque Lorem ipsum con el que puedes generar texto de relleno en cualquier lugar.
 *
 * @Block(
 *   id = "loremipsum_block",
 *   admin_label = @Translation("Bloque Lorem ipsum"),
 * )
 */
class LoremIpsumBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    // Devuelve el formulario definido en Form/LoremIpsumBlockForm.php.
    return \Drupal::formBuilder()->getForm('Drupal\loremipsum\Form\LoremIpsumBlockForm');
  }

La clase LoremIpsumBlock extiende BlockBase y, como tal, tiene cuatro métodos que deben implementarse: build(), blockAccess(), blockForm() y blockSubmit(). El primero simplemente muestra el formulario definido en el paso anterior.

Luego tratamos con el control de acceso:

  /**
   * {@inheritdoc}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'generate lorem ipsum');
  }

Definimos nuestro formulario de bloque para la pantalla de administración del bloque:

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {

    $form = parent::blockForm($form, $form_state);

    $config = $this->getConfiguration();

    return $form;
  }

Manejador de envío:

/**
 * {@inheritdoc}
 */
public function blockSubmit($form, FormStateInterface $form_state) {
  $this->setConfigurationValue('loremipsum_block_settings', $form_state->getValue('loremipsum_block_settings'));
}

}

Ahora nuestro bloque debería estar funcionando.

Source URL:

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.