【发布时间】:2010-02-02 03:54:47
【问题描述】:
我有一个通过仅在视图模式下显示的 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']);
}
我的 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 似乎没有任何我正在尝试做的示例。我也有 $form['#cache'] = TRUE;在我的表单函数中。
drupal_process_form 如何将提交的值与原始表单进行比较以检查完整性?我是否应该将我的值添加到 form_state 中,因为使用 ajax 时表单状态将为空。卡在这个问题上几天了,希望有人对此有经验。
谢谢。
【问题讨论】:
标签: ajax drupal forms callback