Определение блока в модуле 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'));
}
}
Теперь наш блок должен быть рабочим.