У меня простая форма с выбранным меню на странице отображения узла. Есть ли простой способ проверить форму в моей функции обратного вызова? При проверке я не имею в виду ничего продвинутого, просто чтобы проверить, действительно ли значения существовали в массиве форм. Например, без ajax, если в моем меню выбора есть 3 элемента, и я добавляю 4-й элемент и пытаюсь отправить форму, drupal выдает ошибку, говоря что-то похожее на «незаконный выбор, пожалуйста, свяжитесь с администратором».
С помощью ajax этот 4-й элемент, который вы создали, будет сохранен в базе данных. Так что я должен написать валидацию как
if ($select_item > 0 && $select_item <= 3) { //insert into db }
Или есть более простой способ проверить, что элемент действительно существовал в массиве форм? Я надеюсь, что с тех пор без ajax, drupal не представит форму, если бы ее манипулировали. Благодарю.
EDIT: Значит, мне это нужно в моей функции обратного вызова?
$form_state = array('storage' => NULL, 'submitted' => FALSE); $form_build_id = $_POST['form_build_id']; $form = form_get_cache($form_build_id, $form_state); $args = $form['#parameters']; $form_id = array_shift($args); $form_state['post'] = $form['#post'] = $_POST; $form['#programmed'] = $form['#redirect'] = FALSE; drupal_process_form($form_id, $form, $form_state);
Чтобы получить $ _POST ['form_build_id'], я отправил его как параметр данных, верно? Где я использую form_get_cache, похоже, что данных нет. Сейчас потеряно.
Поскольку вы уже используете AJAX, почему бы просто не написать немного jQuery, чтобы разрешить только отправку формы, если выбор входит в список юридических вариантов? Это можно сделать в пользовательском модуле, который уже выглядит так, как будто вы работаете (используя drupal_add_js ()).
Это не особенно «легко», но стандартный способ сделать это – это использовать API-интерфейсы Drupals Forms для отправки обратного вызова – таким образом, вы получите ту же проверку, что и в non js submit.
Взгляните на добавление элементов динамической формы, используя AHAH . Хотя это точно не соответствует вашему сценарию (они восстанавливают форму при обратном вызове для добавления новых элементов, а не для сохранения данных), объяснение рабочего процесса обработки очень полезно.
Затем есть несколько модулей, которые пытаются предоставить форму представления AJAX в общем виде – вы можете проверить свой код на том, как это сделать (или просто использовать их;)
Наконец, есть усилия, направленные на то, чтобы лучше поддерживать эту функциональность в ядре в Drupal 7 – соответствующие обсуждения также могут помочь.