Guía práctica para construir los módulos básicos de Drupal 8 (II)

Seguimos con la segunda parte del manual.

 

Definiendo block

 

¿Recuerdas que al principio de este tutorial, dije que definiríamos un block con un formulario? Bueno, ha llegado el momento de hacerlo correctamente.

/src/Form/LoremIpsumBlockForm.php

<?php
/**
* @file
* Contains \Drupal\loremipsum\Form\BlockFormController
*/
namespace Drupal\loremipsum\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Lorem Ipsum block form
*/
class LoremIpsumBlockForm extends FormBase {
 /**
  * {@inheritdoc}
  */
 public function getFormId() {
   return 'loremipsum_block_form';
 }
 

Este archivo es muy similar a uno de configuración, salvo que amplia la clase FormBase.

 

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

 
/**
  * {@inheritdoc}
  * Lorem ipsum generator block.
  */
 public function buildForm(array $form, FormStateInterface $form_state) {
   // How many paragraphs?
   // $options = new array();
   $options = array_combine(range(1,10),range(1,10));
   $form['paragraphs'] = array(
     '#type' => 'select',
     '#title' => $this->t('Paragraphs'),
     '#options' => $options,
     '#default_value' => 4,
     '#description' => $this->t('How many?'),
   );

   // How many phrases?
   $form['phrases'] = array(
     '#type' => 'textfield',
     '#title' => $this->t('Phrases'),
     '#default_value' => '20',
     '#description' => $this->t('Maximum per paragraph'),
   );

   // Submit
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => $this->t('Generate'),
   );

   return $form;
 }
 

Este método se utiliza para poner un formulario dentro de un block, a través del cual los usuarios personaliza la cuánto texto de relleno quieren generar.

 

Asimismo, no olvides los métodos de 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('Please use a number.'));
   if (floor($phrases) != $phrases) $form_state->setErrorByName('phrases', $this->t('No decimals, please.'));
   if ($phrases < 1) $form_state->setErrorByName('phrases', $this->t('Please use a number greater than zero.'));
 }

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

 

Y ahora para el propio bloque.

/src/Plugin/Block/LoremIpsumBlock.php

 
<?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;

/**
* Provides a Lorem ipsum block with which you can generate dummy text anywhere
*
* @Block(
*   id = "loremipsum_block",
*   admin_label = @Translation("Lorem ipsum block"),
* )
*/

class LoremIpsumBlock extends BlockBase {

 /**
  * {@inheritdoc}
  */
 public function build() {
   // Return the form @ 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 ser implementados: build(), blockAccess(), blockForm(), y blockSubmit(). El primero simplemente reproduce el formulario definido en nuestro paso anterior.

 

A continuación nos ocupamos de control de acceso:

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

 

Definimos nuestra forma de block para la pantalla de administración de block:

 

/**
  * {@inheritdoc}
  */
 public function blockForm($form, FormStateInterface $form_state) {
   $form = parent::blockForm($form, $form_state);
   $config = $this->getConfiguration();
   return $form;
 }
 

Un operario envía:

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

Y hemos terminado este pequeño manual de Drupal 8. Espero que os sirva, y seguimos!!!

 
Total de votos: 61

Entradas relacionadas

Comentarios (0)

Deja un comentario