Drupal → Как создать свой составной элемент формы

20.04.2019

Пример создания элемента формы fullname с тремя полями - Фамилия, имя, отчество.

src/Element/FullnameElement.php

<?php

namespace Drupal\modulename\Element;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;

/**
 * @FormElement("fullname")
 */
class FullnameElement extends FormElement {

  /**
   * {@inheritDoc}
   */
  public function getInfo(): array {
    $class = get_class($this);

    return [
      '#input' => TRUE,
      '#process' => [
        [$class, 'processElement'],
      ],
      '#theme_wrappers' => ['form_element'],
    ];
  }

  /**
   * Element process callback.
   */
  public static function processElement(array &$element, FormStateInterface $form_state, array &$complete_form): array {
    $element['#tree'] = TRUE;

    $element['surname'] = [
      '#type' => 'textfield',
      '#title' => t('Surname'),
      '#default_value' => $element['#default_value']['surname'] ?? '',
    ];

    $element['firstname'] = [
      '#type' => 'textfield',
      '#title' => t('Firstname'),
      '#default_value' => $element['#default_value']['firstname'] ?? '',
    ];

    $element['middlename'] = [
      '#type' => 'textfield',
      '#title' => t('Middlename'),
      '#default_value' => $element['#default_value']['middlename'] ?? '',
    ];

    return $element;
  }

}

Пример использования в форме:

$form['contact_information'] = [
  '#type' => 'fullname',
  '#title' => t('Contact information'),
];
Написанное актуально для
Drupal 8
Похожие записи

Комментарии

Василий
21.10.2020, 23:30

А вне формы такой элемент можно использовать, например, в рендер массиве блока?

Можно, FormElement наследуется от RenderElement

Роман
29.09.2021, 18:00

А не подскажете, как сделать, чтобы составной элемент формы возвращал не массив значений в $form_state, а одно значение, например, фамилия + имя + отчество? Я пытался это сделать через метод valueCallback, но там нет доступа к дочерним элементам, там только свойства, начинающиеся с #.

см. \Drupal\Core\Render\Element\PasswordConfirm::valueCallback

Добавить комментарий