Сущность пользователя является одной из основных сущностей Drupal, которая программно добавляет элементы формы в свой класс формы сущности и по-прежнему использует ограничения проверки.
АккаунтФорма:: форма()
добавляет элементы формы и Пользователь::baseFieldDefinitions()
добавляет ограничения проверки в поля сущности.
(АккаунтФорма
это класс, расширенный Анкета
и Форма регистрации
классы, которые являются двумя из трех классов формы сущности, используемых для сущности пользователя.)
// Информация об учетной записи.
$ форма ['аккаунт'] = [
'#type' => 'контейнер',
'#вес' => -10,
];
// Поле почты НЕ требуется, если у учетной записи изначально не была установлена почта
// и пользователь, выполняющий редактирование, имеет разрешение «администрировать пользователей».
// Это позволяет редактировать и удалять пользователей без адреса электронной почты.
// См. также \Drupal\user\Plugin\Validation\Constraint\UserMailRequired.
$form['аккаунт']['почта'] = [
'#type' => 'электронная почта',
'#title' => $this->t('Адрес электронной почты'),
'#description' => $this->t('Действительный адрес электронной почты. Все электронные письма из системы будут отправляться на этот адрес. Адрес электронной почты не публикуется и будет использоваться только в том случае, если вы хотите получить новый пароль или желаете получать определенные новости или уведомления по электронной почте.'),
'#required' => !(!$account->getEmail() && $user->hasPermission('администрировать пользователей')),
'#default_value' => !$ зарегистрироваться ? $account->getEmail() : '',
];
// Показывать только поле имени в регистрационной форме, иначе пользователь может изменить собственное имя пользователя.
$form['аккаунт']['имя'] = [
'#тип' => 'текстовое поле',
'#title' => $this->t('Имя пользователя'),
'#maxlength' => UserInterface::USERNAME_MAX_LENGTH,
'#description' => $this->t("Допускается использование нескольких специальных символов, включая пробел, точку (.), дефис (-), апостроф ('), подчеркивание (_) и знак @."),
'#required' => ИСТИНА,
'#атрибуты' => [
'класс' => [
'имя пользователя',
],
'автозамена' => 'выкл',
'autocapitalize' => 'выкл',
'проверка орфографии' => 'ложь',
],
'#default_value' => !$ зарегистрироваться ? $account->getAccountName() : '',
'#access' => $account->name->access('edit'),
];
$fields['имя'] = BaseFieldDefinition::create('строка')
->setLabel(t('Имя'))
->setDescription(t('Имя этого пользователя.'))
-> setRequired (ИСТИНА)
-> установить ограничения ([
// Здесь нет ограничения длины, потому что ограничение UserName также охватывает
// что.
'ИмяПользователя' => [],
'UserNameUnique' => [],
]);
$поля['имя']
-> получить определение элемента ()
->setClass('\Drupal\user\UserNameItem');
$fields['pass'] = BaseFieldDefinition::create('пароль')
->setLabel(t('Пароль'))
->setDescription(t('Пароль этого пользователя (хешированный).'))
->addConstraint('ЗащищенноеПолеПользователя');
АккаунтФорма
, ПрофильФорма и
РегистрацияФорма классы, которые расширяют [
ContentEntityForm][6] класс, не расширять [
ContentEntityForm::validateForm()][7], однако. Они реализуют методы, необходимые Drupal, чтобы понять, какие поля сущностей редактируются и какие нарушения следует показывать: [
AccountForm::getEditedFieldNames()][8] и [
AccountForm::flagViolations()`]6.
защищенная функция getEditedFieldNames (FormStateInterface $ form_state) {
вернуть array_merge([
'имя',
'проходят',
'почта',
'часовой пояс',
'код языка',
'предпочтительный_langcode',
'предпочитаемый_admin_langcode',
], parent::getEditedFieldNames($form_state));
}
защищенная функция flagViolations(EntityConstraintViolationListInterface $violations, массив $form, FormStateInterface $form_state) {
// Вручную отмечаем нарушения полей, не обработанных отображением формы. Этот
// необходимо, так как форма сущности отображает только нарушения флагов для полей
// содержится в отображении.
$field_names = [
'имя',
'проходят',
'почта',
'часовой пояс',
'код языка',
'предпочтительный_langcode',
'предпочитаемый_admin_langcode',
];
foreach ($нарушения->getByFields($field_names) как $нарушение) {
список($field_name) = взорвать('.', $нарушение->getPropertyPath(), 2);
$form_state->setErrorByName($field_name, $violation->getMessage());
}
parent::flagViolations($violations, $form, $form_state);
}
ContentEntityForm::validateForm()
показывает только ошибки проверки для тех элементов формы, которые, как сообщается, редактируются. Это означает, что если имя элемента формы не возвращается из AccountForm::getEditedFieldNames()
или же ContentEntityForm::getEditedFieldNames()
, этот элемент формы и соответствующее поле сущности не считаются отредактированными.
Чтобы ответить на вопрос: Да, можно добавлять элементы формы в форма()
метод класса формы сущности и использовать ограничения проверки (и их «автоматическую» проверку), если класс формы сущности реализует получить отредактированные имена полей ()
и флагнарушения()
методы.