Drupal 7 Drupal形式的随机隐藏值

Drupal 7 Drupal形式的随机隐藏值,drupal-7,Drupal 7,我正在为我的一位客户开发简单的留言簿模块,为了防止垃圾邮件,我决定使用一系列简单的问题。为此,我必须从数组中选择随机问题,并在表单中设置该问题的ID(数组元素ID),以便在提交处理程序中检查答案。问题在于,表单是在对提交处理程序求值之前重新生成的,因此随机值会发生变化 简而言之:我在提交处理程序函数中得到了另一个$form\u state['values']['queston\u id']值,它是在表单中。这是为什么?我该如何改变 非常感谢 这是我的模块: 功能gb\u菜单(){ $items=

我正在为我的一位客户开发简单的留言簿模块,为了防止垃圾邮件,我决定使用一系列简单的问题。为此,我必须从数组中选择随机问题,并在表单中设置该问题的ID(数组元素ID),以便在提交处理程序中检查答案。问题在于,表单是在对提交处理程序求值之前重新生成的,因此随机值会发生变化

简而言之:我在提交处理程序函数中得到了另一个
$form\u state['values']['queston\u id']
值,它是在表单中。这是为什么?我该如何改变

非常感谢

这是我的模块:

功能gb\u菜单(){
$items=array();
$items['gb']=数组(
'title'=>t('Guestbook'),
'description'=>t('Guestbook page'),
“页面回调”=>“gb_留言簿”,
//“页面参数”=>数组('gb_留言簿'),
“访问参数”=>数组(“查看留言簿”),
);
退回$items;
}
功能gb_留言簿(){
dpm(“生成页面”);
$page=NULL;
$page.=drupal_呈现(drupal_获取_形式(“gb_留言簿形式”);
$page.=“此处留言簿消息列表”;
返回$page;
}
功能gb_留言簿形式($form,&$form_状态){
$form['name']=数组(
“#键入”=>“文本字段”,
“#title”=>t('Name'),
“#description”=>t('请输入您的姓名'),
);
$form['message']=数组(
“#键入”=>“文本区域”,
#cols=>5,
“#title”=>t('Message'),
“#description”=>t('请输入您的消息'),
);
$questions=gb_get_question();
$question_id=rand(0,计数($questions)-1);
$question=$questions[$question_id];
$form['question_id']=数组(
“#类型”=>“隐藏”,
“#value”=>$question_id,
);
$form['spam']=数组(
“#title”=>$question['question'],
“#description”=>t('请回答这个简单的问题,这样我们就知道你是人类。'),
“#键入”=>“文本字段”,
);
$form['submit']=数组(
“#键入”=>“提交”,
“#value”=>t('Submit'),
);
返回$表格;
}
功能gb_留言簿_表单_提交($form,&$form_state){
//垃圾邮件检查
$values=$form_state['values'];
$questions=gb_get_question();
$answers=$questions[$values['question_id']]['answers'];
if(!in_数组(strtolower($values['spam']),$answers)){
drupal_set_消息(t(“您没有正确回复答案。您确定这不是打字错误吗?”),“error”);
}
否则{
drupal_set_消息(t(“感谢您的贡献!”),“状态”);
//处理输入
}
}
函数gb\u get\u question(){
返回数组(
排列(
“问题”=>t(‘斯洛伐克首都是什么?’),
'answers'=>数组('bratislava'),
),
排列(
'问题'=>t('这个乐队叫什么名字?'),
'answers'=>数组('divozel'),
),
排列(
“问题”=>t(‘斯洛伐克东部最大的城镇是什么?’),
'answers'=>数组('košice','kosice'),
),
);
}

您可能应该在gb\u留言簿\u表单\u验证中执行此检查。

我会在验证挂钩中执行此操作。功能gb_留言簿_表单_提交中的另一个问题


你得到的是问题,而不是答案数组,然后你试图比较它们。这也可能是问题的来源,您可以捕获问题而不是答案,然后与空答案数组进行比较。

将随机问题生成器包装在条件语句中,以检查您的问题是否已在表单中定义

$question_id = NULL;
$questions = gb_get_question();
if (!isset($form['question_id'])) {
  $question_id = rand(0, count($questions)-1);
}
else {
    $question_id = $form['question_id']['#value'];
}
$question = $questions[$question_id];

我不知道为什么我的另一个答案对你不起作用,但这里有另一种方法。想法是将问题id存储在$form_state['storage']中

首先,更正表单声明,使其以$form_状态作为引用传递

函数gb\u留言簿形式($form,&$form\u状态){

现在检查$form_state['storage']数组中的问题id,如果尚未设置,请在设置表单值question_id之前进行设置

$questions = gb_get_question();
if (!isset($form_state['storage']['question_id'])) {
  $form_state['storage']['question_id'] = array_rand($questions);
}

$form['question_id'] = array(
  '#type' => 'hidden',
  '#value' => $form_state['storage']['question_id'],
);
您(和我)的问题描述如下:

简而言之,在提交表单时,表单会在验证代码运行之前重新生成。对我来说,博客中的解决方案不适用于我的Drupal 7站点

我所做的是在论坛构建中添加以下内容:

$form_state['cache'] = true;

这将缓存表单,并且在提交时我将其设置为false。

非常好,谢谢,不幸的是,它没有帮助。我添加了一个验证函数,其行为仍然相同。我将调试输出放在了表单函数和验证函数的开头。表单是在调用验证函数之前生成的,因此TIONION_id再次被重新生成/随机化,因此进入_validate函数的问题_id可能与原始形式的问题_id不同。是的,如上所述,我同意应该在validation hook中完成,但结果是相同的。我还更改了代码,很抱歉我复制了错误的版本。问题是表单是错误的由于是在验证运行之前生成的,
question\u id
再次被随机分配。这也不好,因为
$form['question\u id']
从未设置过(在我放置它的地方,它意味着就在表单中创建
question\u id
元素之前),因此,
$question\u id
再次被随机分配。当然,您仍然需要设置$form['question\u id']。我注意到这只是问题生成器逻辑。添加您的$form['question\u id']因为它在这个问题生成器逻辑下面,你应该被设置。你试过这个代码吗?或者你只是在评论它吗?我还有一个方法可以放在另一个答案中。这个逻辑仍然在代码中的相同位置,我没有删除或注释掉
$form['question\u id']
位。但是因为逻辑在设置
$form['question\u id']
之前,所以
$form
变量中没有这样的数组键,只有
$form['name']
$form['message']
。我把
dpm()
消息放在那里,所以我看到了它。声明在我的代码中很好,