1. Форма без #validate и #submit
Если в buildForm()
у формы и кнопок не указать свойств #validate
и #submit
, то при отправке формы поочерёдно выполнятся методы validateForm()
и submitForm()
:
class CustomForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state): void {
// 1
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
// 2
}
}
Это происходит потому, что друпал добавляет эти свойства всем формам автоматически:
// \Drupal\Core\Form\FormBuilder::prepareForm()
$form['#validate'][] = '::validateForm';
$form['#submit'][] = '::submitForm';
2. Форма с #validate и #submit
Если добавить форме свойства #validate
и #submit
, то поочерёдно выполнятся методы customValidate()
, validateForm()
, customSubmit()
, submitForm()
:
class CustomForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
$form['#validate'][] = '::customValidate';
$form['#submit'][] = '::customSubmit';
return $form;
}
public function customValidate(array &$form, FormStateInterface $form_state): void {
// 1
}
public function validateForm(array &$form, FormStateInterface $form_state): void {
// 2
}
public function customSubmit(array &$form, FormStateInterface $form_state): void {
// 3
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
// 4
}
}
3. Кнопка с #validate и #submit
Если прописать кнопке #validate
и #submit
, то выполнятся только они, тогда как колбаки формы будут проигнорированы:
class CustomForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#validate' => ['::buttonValidate'],
'#submit' => ['::buttonSubmit'],
];
$form['#validate'][] = '::customValidate';
$form['#submit'][] = '::customSubmit';
return $form;
}
public function buttonValidate(array &$form, FormStateInterface $form_state): void {
// 1
}
public function customValidate(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function validateForm(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function buttonSubmit(array &$form, FormStateInterface $form_state): void {
// 2
}
public function customSubmit(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
}
4. Кнопка с #type=>button
Кнопки с '#type' => 'button'
ведут себя чуть иначе, #validate
колбаки работают как прежде, а вот любые #submit
не выполняются, даже если навесить их на саму кнопку:
class CustomForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['submit'] = [
'#type' => 'button',
'#value' => $this->t('Submit'),
'#validate' => ['::buttonValidate'],
'#submit' => ['::buttonSubmit'],
];
$form['#validate'][] = '::customValidate';
$form['#submit'][] = '::customSubmit';
return $form;
}
public function buttonValidate(array &$form, FormStateInterface $form_state): void {
// 1
}
public function customValidate(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function validateForm(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function buttonSubmit(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function customSubmit(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
// не выполнится
}
}
5. #submit в hook_form_alter()
Работает как прежде, но меняется порядок выполнения, потому что hook_form_alter()
запускается после buildForm()
и \Drupal\Core\Form\FormBuilder::prepareForm()
:
class CustomForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state): void {
// 1
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
// 3
}
}
function modulename_form_custom_form_alter(array &$form, FormStateInterface $form_state): void {
$form['#validate'][] = 'modulename_form_custom_form_validate';
$form['#submit'][] = 'modulename_form_custom_form_submit';
}
function modulename_form_custom_form_validate(array &$form, FormStateInterface $form_state): void {
// 2
}
function modulename_form_custom_form_submit(array &$form, FormStateInterface $form_state): void {
// 4
}
Если нужно выполнить свой колбак раньше основного, то просто делаем array_unshift()
:
function modulename_form_custom_form_alter(array &$form, FormStateInterface $form_state): void {
array_unshift($form['#validate'], 'modulename_form_custom_form_validate');
array_unshift($form['#submit'], 'modulename_form_custom_form_submit');
}
Добавить комментарий