Пример создания элемента формы 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
Комментарии
А вне формы такой элемент можно использовать, например, в рендер массиве блока?
Можно,
FormElement
наследуется отRenderElement
А не подскажете, как сделать, чтобы составной элемент формы возвращал не массив значений в $form_state, а одно значение, например, фамилия + имя + отчество? Я пытался это сделать через метод valueCallback, но там нет доступа к дочерним элементам, там только свойства, начинающиеся с #.
см.
\Drupal\Core\Render\Element\PasswordConfirm::valueCallback
Добавить комментарий