Как добавить собственный обработчик проверки в существующую форму (или поле формы) в Drupal 8?
У меня есть форма, которую я не создал. Я хочу добавить свои собственные правила проверки для некоторых полей при отправке формы.
Для Drupal 7, Пользовательская проверка формы? объясняет, как реализовать, hook_form_alter()
а затем добавить ваш обработчик проверки] [1] в $form['#validate']
массив, но в Drupal 8 формы являются классами. Проверка выполняется с помощью validateForm()
метода, и я не знаю, как подключить мой код к этому.
Ответы:
Это
#validate
свойство все еще используется в Drupal 8. (С помощью решения Adi вы переопределите существующий валидатор)Если вы хотите добавить свой пользовательский валидатор в дополнение к стандартному, вы должны добавить что-то вроде этого в hook_form_FORM_ID_alter (или аналогичный):
источник
#validate
(ваша ссылка), вы должны использовать$form_state
не массив (способ D7), а объект, реализующийFormStateInterface
(способ D8). Другими словами, код в вашем пользовательском валидаторе должен быть аналогом кода, который вы найдете в оригинальномvalidateForm()
методе.Бердир дал правильный ответ, что ограничение - это правильный путь добавления валидации к полю в Drupal 8. Вот пример.
В приведенном ниже примере я буду работать с узлом типа
podcast
, который имеет поле с одним значениемfield_podcast_duration
. Значение для этого поля должно быть отформатировано как ЧЧ: ММ: СС (часы, минуты и секунды).Чтобы создать ограничение, необходимо добавить два класса. Первый - это определение ограничения, а второй - это валидатор ограничения. Оба они являются плагинами в пространстве имен
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Во-первых, определение ограничения. Обратите внимание, что идентификатор плагина задан как «PodcastDuration» в аннотации (комментарии) класса. Это будет использовано ниже.
Далее нам нужно предоставить валидатор ограничения. Это имя этого класса будет именем класса сверху, с
Validator
добавлением к нему:Наконец, нам нужно указать Drupal использовать наше ограничение
field_podcast_duration
наpodcast
тип узла. Мы делаем это вhook_entity_bundle_field_info_alter()
:источник
$item = $items->first();
и вернули NULL, если ничего не существует, иначе вы получите фатальную ошибку при редактировании поля: TypeError: Аргумент 2, переданный в Drupal \ Component \ Utility \ NestedArray :: getValue (), должен иметь тип массива, дано ноль, вызывается в /data/app/core/lib/Drupal/Core/Field/WidgetBase.php в строке 407 в Drupal \ Component \ Utility \ NestedArray :: getValue () (строка 69 в core / lib / Drupal / Component /Utility/NestedArray.php).Правильный способ сделать это для объекта содержимого, такого как узел, - зарегистрировать его как ограничение.
Видишь
forum_entity_bundle_field_info_alter()
и соответствующий?ForumLeaf
ограничение проверки (обратите внимание, что нужны два класса).Сначала это немного сложнее, но преимущество заключается в том, что он интегрирован в API валидации, поэтому ваша валидация не ограничивается системой форм, но может, например, работать и с узлами, отправленными через REST API.
источник
hook_entity_bundle_field_info_alter()
(как описано здесь ), но она никогда не работала ... Кажется, есть задокументированная проблема с этим хуком: drupal.org/node/2346347 .Я хочу добавить немного света по этому вопросу. Добавление валидации точно такое же, как и раньше: в hook_form_alter:
Использование объекта values внутри $ form_state в функции validate немного отличается. например:
Так что не с прямым доступом к объекту приватных переменных, а скорее с функцией получения.
для получения дополнительной информации вы можете увидеть полный пример в моем github: https://github.com/flesheater/drupal8_modules_experiment/blob/master/webham_formvalidation/webham_formvalidation.module
ура!
источник
Это очень похоже на D7. Полный пример:
mymodule.module :
источник
hook_form_FORM_ID_alter
нужен идентификатор формы. Пользовательская функция проверки может быть любой, какой вы захотите. Кроме того, следуйте инструкциям API здесь для правильных параметров.В дополнение к этим хорошим ответам я бы добавил:
Это как вызвать метод удаленного класса для проверки формы. Я думаю, что лучше, чем вызывать вышеуказанную функцию в файле модуля, как в приведенном примере.
источник
Вы можете использовать модуль проверки клиента . Еще несколько подробностей об этом (со страницы проекта):
источник