• урок
  • pantey

Drupal 8 – Выводим кастомную форму в кастомном блоке

22.06.2017

Мы с вами уже умеем создавать простейшие формы и создать программно блоки. Теперь пришло время соединить все наши знания воедино, а именно займемся выводом кастомной формы в кастомном блоке.

Останавливаться на подробном создании блока и формы я не буду, кто не в курсе – идем по ссылкам выше.

Наш модуль будет называться 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(), который принимает в качестве параметра класс формирования формы.

Активируем модуль, выводим в необходимом регионе и смотрим на результат.

custom_form_custom_form_drupal_8_1.png

На этом можно закончить.

Скачать модуль используемый в примере

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (4)

Profile picture for user Егор
Александр
25.07.2017

Спасибо, отличная статья, мне как новичку интересно читать. Было бы круто, если бы еще были добавлены комментарии некоторых строк кода, чтобы понимать, что происходит. Например для этой: 

$form['actions']['#type'] = 'actions'; 

Profile picture for user pantey
pantey
25.07.2017
<?php
$form['actions']['#type'] = 'actions'; 

Предоставляет враппер для объединения нескольких кнопок в форме. Здесь подробнее

Profile picture for user Егор
Дмитрий
23.10.2018

Приветствую. Подскажите пожалуйста как получить данные из зависимых элементов?

Если создаю конструкцию $form['actions']['submit'], то name элемента дается типа actions[submit]. 

Когда пытаюсь получить данные $form_state->getValue('actions[submit]'), то ничего не происходит.

Думал, что не работает из-за квадратных скобок, но когда задаю конкретное имя элементу без этих скобок, то все равно не могу получить данные из элемента. Если не оборачивать враппером, то все нормально.

 

Profile picture for user pantey
pantey
23.10.2018

Значения формы забираются через метод getValues()

<?php

$form_state->getValue();

что вы хотели получить, передав в getValue() submit формы, не очень понятно.