Рейтинг:1

Проверка пользовательской формы редактирования сущности

флаг lc

У меня есть пользовательский объект, в котором вместо обычного способа указания параметров формы редактирования с помощью setDisplayOptions('форма' и опираясь на ContentEntityForm чтобы создать мою форму редактирования для меня, я должен сделать свою собственную форму в построитьформу() (У меня есть Ajax-взаимодействия между полями, которые не может обеспечить запас). Все работает нормально, просто я не могу запустить проверку, как в стандартной форме. Ограничения есть, и если я переопределю:

общедоступная функция validateForm (массив и $ форма, FormStateInterface $ form_state) {
  $entity = parent::validateForm($form, $form_state);
  $нарушения = $entity->validate();
  foreach ($нарушения как $v) {
    дпм($v->getMessage());
  }
  вернуть $сущность;
}

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

Рейтинг:0
флаг us

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

Чтобы ответить на вопрос: Да, можно добавлять элементы формы в форма() метод класса формы сущности и использовать ограничения проверки (и их «автоматическую» проверку), если класс формы сущности реализует получить отредактированные имена полей () и флагнарушения() методы.

флаг lc
Очень красиво, спасибо, пойду по этому пути.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.