Definición de un bloque en un módulo de Drupal
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.
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.