0

symfony 形式で数式を作成するために 2 つの乱数を取得しています。問題は、フォームの送信時に乱数が更新され、フォームの送信が無効になることです。フォームが処理されるように、最初の数値をロードしたままにするにはどうすればよいですか?ただし、処理が成功した後、新しいセットをロードしますか?

アクション.クラス

 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>

例: ページが最初に読み込まれると、2 つの乱数が生成されます (例: 10 と 15)。これは 10 + 15 = (入力フィールド) をレンダリングします

ユーザーは 25 を挿入し、[保存] をクリックします。これは正しかったのですが、フォームが index アクションを再度実行するため、「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);  
    }
  }

これはうまくいくはずです。変数を見ると、ページがセッション変数をプルしており、2 番目の投稿に新しい乱数を追加していないように見えます。変。

解決済み

コードエラーでした。私は変数を交差させました。

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);
../
4

2 に答える 2

0

セッションは良い点です。

フォームが投稿されない場合は、結果をセッションに保存して、後で確認できるようにします。

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: 透明なキャプチャをお探しの場合は、この方法をお勧めします。私は本当に素晴らしい成功でそれをテストしました。

于 2012-06-25T16:48:40.923 に答える
0

リロード後も保持されるセッション変数として乱数を保存できます。

session_start();
$_SESSION["num1"] = rand(0 , 20);
$_SESSION["num2"] = rand(0 , 20);
于 2012-06-25T14:52:44.720 に答える