Добавить конфигурацию форму для блока
Теперь давайте скажем, что мы хотим добавить возможность для строителя сайта вводить часть конфигурации для каждого экземпляра нашего пользовательского блока. Всегда имейте в виду, что все конфигурации построения сайта в Drupal 8 можно экспортировать с сайта разработки и импортировать на рабочий сайт (известный как Управление конфигурацией). Вы, как сборщик модулей, можете также предоставить конфигурацию по умолчанию для автоматического заполнения формы, когда создатель сайта создает новый блок.
В существующий класс HelloBlock с предыдущей страницы добавьте эти операторы «use», следующие за уже существующими:
use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface;
Обновите объявление класса, чтобы включить этот новый оператор "реализаций BlockPluginInterface":
class HelloBlock extends BlockBase implements BlockPluginInterface {
Затем добавьте следующий метод в класс. Подобный, полный файл находится здесь, но обратите внимание, что имя формы и имена конфигурации не совпадают с этим руководством.
Этот код будет только добавлять форму, обработка формы и сохранение результатов будут следовать на следующих страницах.
/**
* {@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('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
return $form;
}
В этом примере форма сначала определяется ссылкой на ее родительский класс с помощью следующей инструкции кода $form = parent::blockForm($form, $form_state );. Далее мы добавляем новое поле в форму. Этот процесс называется полиморфизмом и является одним из важных преимуществ использования методов объектно-ориентированного программирования (ООП).
Далее мы должны указать Drupal сохранить значения из нашей формы в конфигурацию для этого блока. Вот пример:
/**
* {@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'];
}
Чтобы просмотреть форму, перейдите к ранее добавленному экземпляру в admin-> Structure-> Block Layout и нажмите Configure для (Hello World) блока.
Чтобы добавить несколько отправьте на ту же форму.
/**
* {@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('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
$form['actions']['custom_submit'] = [
'#type' => 'submit',
'#name' => 'custom_submit',
'#value' => $this->t('Custom Submit'),
'#submit' => [[$this, 'custom_submit_form']],
];
return $form;
}
Новое пользовательское действие отправки
/**
* Custom submit actions.
*/
public function custom_submit_form($form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// Perform the required actions.
}