Определение блока в модуле Drupal
Часть V из Практического руководства по созданию базовых модулей Drupal 8
От .info к тестам, только основы
Помните, в начале этого урока я говорил, что мы определим блок с формой? Что ж, сейчас самое время разобраться с этим.
/src/Form/LoremIpsumBlockForm.php
<?php 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'; }
Этот файл очень похож на файл настроек, за исключением того, что он расширяет класс FormBase.
Он также имеет метод buildForm () примерно так:
/** * {@inheritdoc} */ 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'] = [ '#type' => 'select', '#title' => $this->t('Paragraphs'), '#options' => $options, '#default_value' => 4, '#description' => $this->t('How many?'), ]; // How many phrases? $form['phrases'] = [ '#type' => 'textfield', '#title' => $this->t('Phrases'), '#default_value' => '20', '#description' => $this->t('Maximum per paragraph'), ]; // Submit. $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Generate'), ]; return $form; }
Этот метод используется для помещения формы в блок, с помощью которого пользователи настраивают, сколько фиктивного текста они хотят генерировать.
Также не забудьте методы validateForm () и 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', [ 'paragraphs' => $form_state->getValue('paragraphs'), 'phrases' => $form_state->getValue('phrases'), ]); } }
А теперь для самого блока.
<?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'); }
Класс LoremIpsumBlock расширяет BlockBase и, как таковой, имеет четыре метода, которые должны быть реализованы: build (), blockAccess (), blockForm () и blockSubmit (). Первый просто отображает форму, определенную на нашем предыдущем шаге.
Далее мы имеем дело с контролем доступа:
/** * {@inheritdoc} */ protected function blockAccess(AccountInterface $account) { return AccessResult::allowedIfHasPermission($account, 'generate lorem ipsum'); }
Определите нашу блочную форму для экрана администрирования блока:
/** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); return $form; }
Обработчик отправки:
/ ** * {@inheritdoc} * / публичная функция blockSubmit ($ form, FormStateInterface $ form_state) { $ this-> setConfigurationValue ('loremipsum_block_settings', $ form_state-> getValue ('loremipsum_block_settings')); } }
Теперь наш блок должен быть рабочим.
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.