Валидация формы Drupal не работает для меня
Я пытаюсь изменить некоторый код формы Drupal 6 и включить некоторую собственную проверку формы. Код выглядит так, но проверка не работает. Я даже не вхожу в функцию thisFormName_form_validate. У каких-нибудь друпалий есть хорошие идеи?
function thisFormName_form_alter(&$form, $form_state, $form_id) {
$form['email_address'] = array(
'#type' => 'textfield',
'#title' => t('Enter your email address (optional)'),
'#default_value' => $object['email_address'],
'#weight' => 4,
'#size' => 60,
'#maxlength' => 128,
'#description' => t('Enter email address.'),
);
function thisFormName_form_validate($node, &$form) {
if ($form_state['values']['email_address'] == '')
{
form_set_error('', t('Email must be valid format if entered.'));
}
}
Ответы
Ответ 1
Поскольку вы используете форму alter, поэтому вы не создаете форму самостоятельно, вы должны добавить обработчик проверки самостоятельно:
function myModule_form_alter(&$form, $form_state, $form_id) {
$form['email_address'] = array(
'#type' => 'textfield',
'#title' => t('Enter your email address (optional)'),
'#default_value' => $object['email_address'],
'#weight' => 4,
'#size' => 60,
'#maxlength' => 128,
'#description' => t('Enter email address.'),
);
$form['#validate'][] = 'my_validation_function';
}
function my_validation_function(&$form, &$form_state) {
if ($form_state['values']['email_address'] == '') {
form_set_error('', t('Email must be valid format if entered.'));
}
}
Drupal будет использовать по умолчанию только проверку, которая определяется как form_name
+ _validate
. Это не так, поскольку вы используете hook_form_alter
.
Ответ 2
EDIT: В основном тот же ответ, что и googletorps. Не заметил его во время публикации моего. Оставив его здесь для альтернативного объяснения, но он прав и был первым (+1).
Есть что-то подозрительное в названии вашей функции:
-
Как и во всех реализациях hook, ваша функция hook_form_alter
должна быть названа после вашего настраиваемого модуля, а не после формы (например, yourModule_form_alter
), и в этом случае он будет запускаться для всех форм. Если (как он выглядит) вы хотите только подключиться к определенной форме, используйте hook_form_FORM_ID_alter
, заменив "hook" на ваше имя модуля, и "FORM_ID" с идентификатором (именем) формы, которую вы хотите манипулировать.
-
Обратные вызовы функции проверки для формы перечислены в виде массива имен функций в $form['#validate']
. Это всего лишь удобный ярлык для созданных вами форм, которые вы явно не должны добавлять, но используйте функцию, названную после формы, добавив в конце "_validate". В вашем случае вы изменяете форму, исходящую из другого модуля, поэтому вам нужно явно добавить функцию проверки.
Итак, ваш код должен выглядеть примерно так:
function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) {
$form['email_address'] = array(
'#type' => 'textfield',
'#title' => t('Enter your email address (optional)'),
'#default_value' => $object['email_address'],
'#weight' => 4,
'#size' => 60,
'#maxlength' => 128,
'#description' => t('Enter email address.'),
);
// Add custom validation callback
$form['#validate'][] = 'yourModuleName_theFormID_validate';
function yourModuleName_theFormID_validate(&$form, &$form_state) {
if ($form_state['values']['email_address'] == '') {
form_set_error('', t('Email must be valid format if entered.'));
}
}