Мы с вами уже умеем создавать простейшие формы и создать программно блоки. Теперь пришло время соединить все наши знания воедино, а именно займемся выводом кастомной формы в кастомном блоке.
Останавливаться на подробном создании блока и формы я не буду, кто не в курсе – идем по ссылкам выше.
Наш модуль будет называться custom_form_in_block.
Файл custom_form_in_block
name: Custom form in Block
description: Простой пример вывода кастомной формы,в кастомном блоке
core: 8.x
type: module
dependencies:
- block
Создаем форму - файл CustomFormInBlockForm.php
<?php
/**
* @file
* Contains \Drupal\custom_form_in_block\Form.
*/
namespace Drupal\custom_form_in_block\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class CustomFormInBlockForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'custom_form_in_block_form';
}
/**
* {@inheritdoc}
* Form
*/
public function buildForm(array $form, FormStateInterface $form_state) {
# Text field
$form['your_name'] = array(
'#type' => 'textfield',
'#title' => t('Your Name:'),
'#required' => TRUE,
'#attributes' => array(
'placeholder' => 'Ivan Ivanov',
),
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => 'This meeeee',
);
return $form;
}
/**
* {@inheritdoc}
* Submit
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$your_name = $form_state->getValue('your_name');
drupal_set_message($your_name);
}
}
Создаем блок - файл CustomFormInBlock.php
<?php
/**
* @file
* Contains \Drupal\custom_form_in_block\Plugin\Block
*/
namespace Drupal\custom_form_in_block\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormInterface;
/**
* Provides a 'custom_form_in_block' block.
*
* @Block(
* id = "custom_form_in_block",
* admin_label = @Translation("Custom form in block"),
* category = @Translation("Example custom form in block")
* )
*/
class CustomFormInBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
$form = \Drupal::formBuilder()->getForm('Drupal\custom_form_in_block\Form\CustomFormInBlockForm');
return $form;
}
}
Хочу заметить, что drupal_get_form() больше не существует в Drupal 8, ему на смену пришел formBuilder(), который принимает в качестве параметра класс формирования формы.
Активируем модуль, выводим в необходимом регионе и смотрим на результат.
На этом можно закончить.
Скачать модуль используемый в примере
Комментарии (4)
Спасибо, отличная статья, мне как новичку интересно читать. Было бы круто, если бы еще были добавлены комментарии некоторых строк кода, чтобы понимать, что происходит. Например для этой:
$form['actions']['#type'] = 'actions';
Предоставляет враппер для объединения нескольких кнопок в форме. Здесь подробнее
Приветствую. Подскажите пожалуйста как получить данные из зависимых элементов?
Если создаю конструкцию $form['actions']['submit'], то name элемента дается типа actions[submit].
Когда пытаюсь получить данные $form_state->getValue('actions[submit]'), то ничего не происходит.
Думал, что не работает из-за квадратных скобок, но когда задаю конкретное имя элементу без этих скобок, то все равно не могу получить данные из элемента. Если не оборачивать враппером, то все нормально.
Значения формы забираются через метод getValues()
что вы хотели получить, передав в getValue() submit формы, не очень понятно.