将随机数拉成 symfony 形式


pulling a random number into a symfony form

我正在拉两个随机数来创建符号形式的数学方程。问题是在提交表单时,随机数会更新,从而使表单提交无效。如何保持加载初始数字值,以便表单将进行处理,但在成功处理后,加载新集?

操作.class

 public function executeIndex(sfWebRequest $request)
  {
    $num1 = rand(0 , 20);
    $num2 = rand(0 , 20);
    $realAnswer = $num1 + $num2;
    $show = $num1 . " + " . $num2 . " = ";
    $this->getResponse()->setSlot("displayNum", $show);
    $this->form = new UserForm();
    echo $num1 . "<br>" . $num2 . "<br>" . $realAnswer;
    if ($request->isMethod('post') && ($request->getPostParameter('captcha[answer]') == $realAnswer))
    {
        $this->processForm($request, $this->form);  
    }
  }

我正在使用部分来呈现表单 -> _form.php

<tr height="40">
        <td width="100" valign="middle">
            <?php echo get_slot("displayNum", "default value if slot doesn't exist"); ?>
        </td>
        <td width="400" colspan="4" valign="middle">
        <input type="text" id="captcha" class="url" name="captcha[answer]" style="width:100px" />
        </td>
    </tr>

示例:当页面最初加载时,会生成两个随机数(例如 10 和 15)。这呈现10 + 15 =(输入字段)

用户插入 25 并单击保存。这是正确的,但由于表单再次执行索引操作,因此有一组新的随机数使"if"条件为假。

更新:

根据 j0k 的建议,我已经对操作进行了更改。

public function executeIndex(sfWebRequest $request)
    {
      $user = $this->getUser();
    if (!$request->isMethod('post'))
    {
      // first display of the form, generate nums
      $num1       = rand(0 , 20);
      $num2       = rand(0 , 20);
      $realAnswer = $num1 + $num2;
      // store them in session
      $user->setAttribute('realAnswer', $realAnswer);
      $user->setAttribute('num1', $num1);
      $user->setAttribute('num2', $num2);
    }
    else
    {
      // the form is submitted, retrieve nums from the session
      $num1       = $user->getAttribute('realAnswer', null);
      $num2       = $user->getAttribute('num1', null);
      $realAnswer = $user->getAttribute('num2', null);
    }
    //setup slot
     $show = $num1 . " + " . $num2 . " = ";
     echo $realAnswer . "-Actual<br>" . $request->getPostParameter('captcha[answer]') . "-User submitted";
    $this->form = new UserForm();
    if ($request->isMethod('post') && (($request->getPostParameter('captcha[answer]') == $realAnswer)))
    {
        $this->processForm($request, $this->form);  
    }
  }

这应该有效。查看变量,看起来页面正在拉动会话变量,而不是在第二篇帖子中添加新的随机数。 奇怪。

解决

这是一个代码错误。我把变量划掉了。

else
    {
    // the form is submitted, retrieve nums from the session
     $num1       = $user->getAttribute('num1', null);
     $num2       = $user->getAttribute('num2', null);
     $realAnswer = $user->getAttribute('realAnswer', null);
../
会话

是一个很好的观点。

如果未发布表单,请将结果存储在会话中,以便之后能够检查。

public function executeIndex(sfWebRequest $request)
{
  $user = $this->getUser();
  if (! $request->isMethod('post'))
  {
    // first display of the form, generate nums
    $num1       = rand(0 , 20);
    $num2       = rand(0 , 20);
    $realAnswer = $num1 + $num2;
    // store them in session
    $user->setAttribute('realAnswer', $realAnswer, 'captcha');
    $user->setAttribute('num1', $num1, 'captcha');
    $user->setAttribute('num2', $num2, 'captcha');
  }
  else
  {
    // the form is submitted, retrieve nums from the session
    $num1       = $user->getAttribute('num1', null, 'captcha');
    $num2       = $user->getAttribute('num2', null, 'captcha');
    $realAnswer = $user->getAttribute('realAnswer', null, 'captcha');
  }
  $show = $num1 . " + " . $num2 . " = ";
  $this->getResponse()->setSlot("displayNum", $show);
  $this->form = new UserForm();
  if ($request->isMethod('post') && ($request->getPostParameter('captcha[answer]') == $realAnswer))
  {
    $this->processForm($request, $this->form);
  }
}

并且不要忘记清空会话中的相关值,如果表单有效。

protected function processForm(sfWebRequest $request, $form)
{
  // bind form
  if ($form->isValid())
  {
    // clear the session
    $this->getUser()->getAttributeHolder()->removeNamespace('captcha');
  }
}

Ps:如果您正在寻找透明的验证码,我建议您使用此方法。我已经测试了它,取得了巨大的成功。

您可以将随机数存储为会话变量,这些变量将在重新加载后保留:

session_start();
$_SESSION["num1"] = rand(0 , 20);
$_SESSION["num2"] = rand(0 , 20);