我有一个通过仅在视图模式下显示的 nodeapi 添加的表单。用户可以从选择菜单中选择一个项目,他们的选择将通过发生更改时的 hook_menu 回调自动保存到数据库中。如果用户禁用了 javascript,它将使用表单 api 正常提交。这一切都工作正常,但现在出于安全原因我想通过表单 api 提交 ajax 版本。我的 form_name_submit 很简单:
function mymodule_test_form_submit($form, &$form_state) {
global $user;
db_query("INSERT INTO {mymodule} (nid, uid, status, created) VALUES (%d, %d, %d, " . time() . ")", $form['#parameters'][2], $user->uid, $form_state['values']['mymodule_status']);
}
My ajax:
$('.mysubmit').css('display', 'none');
$('.myclass').change(function() {
$.ajax({
type: 'POST',
url: Drupal.settings.basePath + 'mymodule/set/' + $nid + '/' + $('.myclass').val(),
dataType: 'json',
data: { 'ajax' : true, 'form_build_id' : $('#mymodule-form input[name=form_build_id]').val() }
});
});
还有我的回调函数:
function mymodule_set($nid, $status) {
$form_build_id = $_POST['form_build_id'];
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$form_state['post'] = $_POST;
drupal_process_form($form_id, $form, $form_state);
}
最初我的回调函数与我的提交函数大致相同,但现在我也尝试将提交函数与ajax一起使用。这是使用 drupal_process_form 的正确方法吗?从缓存中获取表单,如果没有错误,则对其进行验证并提交?我正在使用本教程中的一些代码来应用我的情况:http://drupal.org/node/331941 http://drupal.org/node/331941似乎没有任何我想要做的事情的例子。我还有 $form['#cache'] = TRUE;在我的表单函数中。
drupal_process_form如何将提交的值与原始表单进行比较以检查完整性?我是否应该将我的值添加到 form_state 中,因为使用 ajax 时表单状态将为空。纠结了好几天了,希望有人有这方面的经验。
Thanks.