我遇到了一个问题,用户可以多次提交由Form API构建的任何表单(快速单击会导致多个请求)。
我已经提供了禁用按钮的基本客户端(javascript)解决方案,但是我很好奇防止这种情况的最佳方法是在服务器端。
有没有推荐的方法来使用Drupal的表单令牌系统来处理此问题?特别是全局表单解决方案(即,使用hook_form_alter()向每个表单添加自定义验证器)。
到目前为止,我的方法一直是这样的:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'mymodule_form_validate';
}
function mymodule_form_validate(&$form, &$form_state){
//initialize form array
if (!isset($_SESSION['submitted_forms'])){
$_SESSION['submitted_forms'] = array();
}
$form_token = $form_state['values']['form_token'];
if ( isset($_SESSION['submitted_forms'][$form_token]) && $_SESSION['submitted_forms'][$form_token] = TRUE ){
form_set_error('name]', 'This form has already been submitted');
}
else{
$_SESSION['submitted_forms'][$form_token] = TRUE;
}
}
我在form_token不是表单唯一的地方遇到了麻烦-无论发生什么事情,它似乎都保持不变。我可能会误解api在api宏方案中的含义。
任何见解表示赞赏!
作为后续,我开始使用$ form_state ['form_build_id']代替令牌。如果我两次提交相同的表单构建ID,则无论如何都要重新构建和处理表单。
—
PrairieHippo 2012年