Я создал модуль, который добавляет новый тип ноды (объявление, ad). В модуле генерирую форму. После отправки срабатывает моя функция ad_node_form_validate($form_id, $form_values). Но проблема в том, что срабатывают также стандартные обработчики, которые проверяют некоторые поля формы и они выводят сообщения, которые меня совсем не устраивают. Пример сообщений:
* Необходимо заполнить поле Подраздел.
* Необходимо заполнить поле Заголовок.
* Необходимо заполнить поле Текст объявления.
* Необходимо заполнить поле Подраздел.
* Необходимо заполнить поле Заголовок.
* Необходимо заполнить поле Текст объявления.
Причем как видно они повторяются. Как мне убрать вообще стандартную проверку и выводить только свои сообщения в случае ошибки? В случае удачного заполнения формы я так понял надо делать редирект...
Комментарии
Я покопался в исходниках и нашел проблему. Объясняю смысл. В файле includes/form.inc есть функция _form_validate($form, $form_id). Внутри нее проверяются только те элементы формы у которых не установлен ключ #validated. Поэтому чтобы предотвратить проверку стандартными валидаторами нам нужно его установить. Вот пример:
<?php
function ad_form() {
drupal_add_js('misc/select.js');
$form = array(
'ad_form' => array(
'#type' => 'fieldset',
'#title' => 'Форма объявления',
'#description' => 'Заполните необходимые поля формы объявления. Если стоит значок *, значит это поле обязательно для заполнения.',
'#weight' => -10,
)
);
$vid = _ad_get_vid();
$options = array(0 => '- Выберите раздел -');
foreach (taxonomy_get_tree($vid, 0, -1, 1) as $term) {
$options[$term->tid] = check_plain($term->name);
}
$form['ad_form']['terms'] = array(
'#type' => 'select',
'#title' => 'Раздел, где появится объявление',
'#description' => 'После выбора раздела вы сможете выбрать подраздел.',
'#options' => $options,
'#weight' => -10,
'#required' => true,
);
$form['ad_form']['subterms'] = array(
'#type' => 'select',
'#title' => 'Подраздел',
'#description' => 'Чтобы выбрать подраздел, вначале выберите раздел из списка выше.',
'#options' => array(0 => '- Выберите подраздел -'),
'#weight' => -9,
'#attributes' => array('disabled' => 'disabled'),
'#required' => true,
'#validated' => true, // Элемент subterms теперь не будет проверяться и мы должны его проверить сами.
);
?>
Главное, для чего это нужно, это установка своих сообщений об ошибках и отмена стандартной проверки.
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $node->title,
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
);
?>
Все внимание - на последнюю строку, на ту где написано required
а что делает select.js? jQuery?
Наверно все-таки проще не стаивть для поля #required - тогда стандартные проверки не понадобятся