Agregar un formulario de configuración para el bloque
Ahora digamos que queremos permitir al constructor del sitio introducir parte de la configuración para cada instancia de nuestro bloque personalizado. Siempre tenga en cuenta que toda la configuración del constructor del sitio en Drupal 8 puede exportarse desde el sitio de desarrollo e importarse al sitio en producción (conocido como Gestión de configuración). Usted, como ensamblador de módulos, también puede proporcionar configuración por defecto para rellenar automáticamente el formulario cuando el creador del sitio crea un nuevo bloque.
En la clase HelloBlock existente de la página anterior, agregue estas declaraciones use después de las ya existentes:
use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface;
Actualice la declaración de la clase para incluir esta nueva interfaz "implements BlockPluginInterface":
class HelloBlock extends BlockBase implements BlockPluginInterface {
Luego agregue el siguiente método a la clase. Un archivo similar completo está disponible, pero tenga en cuenta que el nombre del formulario y los nombres de configuración no coinciden con esta guía.
Este código solo añadirá el formulario, el procesamiento y guardado de resultados seguirán en páginas posteriores.
/** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); $form['hello_block_name'] = [ '#type' => 'textfield', '#title' => $this->t('Quién'), '#description' => $this->t('¿A quién quieres saludar?'), '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '', ]; return $form; }
En este ejemplo, el formulario primero se define invocando a su clase padre con la instrucción $form = parent::blockForm($form, $form_state); Luego agregamos un nuevo campo al formulario. Este proceso se llama polimorfismo y es una de las grandes ventajas de usar métodos en programación orientada a objetos (POO).
Luego debemos indicarle a Drupal que guarde los valores del formulario en la configuración para esta instancia del bloque. Aquí hay un ejemplo:
/** * {@inheritdoc} */ public function blockSubmit($form, FormStateInterface $form_state) { parent::blockSubmit($form, $form_state); $values = $form_state->getValues(); $this->configuration['hello_block_name'] = $values['hello_block_name']; }
Para ver el formulario, vaya a la instancia añadida previamente en admin->Estructura->Disposición de bloques y haga clic en Configurar para el bloque (Hello World).
Para añadir más, puede enviar el mismo formulario así:
/** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); $form['hello_block_name'] = [ '#type' => 'textfield', '#title' => $this->t('Quién'), '#description' => $this->t('¿A quién quieres saludar?'), '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '', ]; $form['actions']['custom_submit'] = [ '#type' => 'submit', '#name' => 'custom_submit', '#value' => $this->t('Envío personalizado'), '#submit' => [[$this, 'custom_submit_form']], ]; return $form; }
Nueva acción de envío personalizada:
/** * Acciones de envío personalizadas. */ public function custom_submit_form($form, FormStateInterface $form_state) { $values = $form_state->getValues(); // Realice las acciones necesarias. }