0

我有一个简单的表单,在节点显示页面上有一个选择菜单。有没有一种简单的方法来验证我的回调函数中的表单?通过验证我并不是说任何高级的东西,只是为了检查表单数组中实际存在的值。例如,在没有 ajax 的情况下,如果我的选择菜单有 3 个项目,并且我添加了第 4 个项目并尝试提交表单,drupal 将给出类似于“做出了非法选择,请联系管理员”的错误。

使用 ajax,您创建的第 4 个项目将保存到数据库中。所以我必须像这样写验证吗

if ($select_item > 0 && $select_item <= 3) {
  //insert into db
}

还是有一种更简单的方法可以检查该项目是否确实存在于表单数组中?我希望有,因为没有 ajax,如果表单被操纵,drupal 将不会提交表单。谢谢。

编辑: 所以我的回调函数中基本上需要这个?

$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 的地方,看起来没有数据。现在有点迷路了。

4

2 回答 2

0

这不是特别“简单”,但标准的方法是使用 Drupals Forms API 进行回调提交 - 这样,您将获得与非 js 提交相同的验证。

看看使用 AHAH 添加动态表单元素。虽然它与您的场景不完全匹配(他们在回调中重建表单以添加新元素,而不是保存数据),但对处理工作流程的解释非常有帮助。

然后有几个模块试图以通用方式提供 AJAX 表单提交 - 你可以检查他们的代码以了解如何做到这一点(或者可能只是使用它们;)

最后,努力在 Drupal 7 的核心中更好地支持这个功能——相关的讨论也可能会有所帮助。

于 2010-01-29T08:37:19.447 回答
0

既然您已经在使用 AJAX,为什么不写一点 jQuery 来只在选择在合法选择列表中时才允许表单提交呢?这可以在您已经在处理的自定义模块中完成(使用 drupal_add_js())。

于 2010-01-26T13:44:34.860 回答