0

Site、Ads、Message という名前の 3 つのコントローラーがあります。すべてのコントローラーにはキャプチャ アクション クラス定義があり、各コントローラーのアクセス ルールで許可されます。

キャプチャはサイト コントローラーではうまく機能しますが、他のコントローラーでは検証が機能しません。キャプチャ画像とレキャプチャも機能することを示していますが、検証だけでは機能しません。デバッグするアイデアはありますか?

アップデート :

Yii を調べてみたところ、何かが見つかりました。CCaptcha ウィジェットは、コントローラー名をセッション キーの一部として使用して、キャプチャ検証コードを保存します。

CCaptchaAction.php

protected function getSessionKey(){
    return self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' .   $this->getController()->getUniqueId() . '.' . $this->getId();
}

ご覧のとおり、 $this->getController()->getUniqueId()session key の一部です

CCaptchaAction は、この関数を使用して検証コードを生成および検証します。

問題は、生成検証が異なるコントローラーで行われることです。

明確な例では、 Controller ABがあるとします。

コントローラAでキャプチャ生成が行われると、print_r($_SESSION) は次のようになります。

配列 ( [Yii.CCaptchaAction.12bd9136.A .captcha ] => eyntri [Yii.CCaptchaAction.12bd9136.A .captchacount ] => 1

コントローラBでキャプチャ検証が行われると、検証メソッドは以下をチェックします。

新規生成され、コントローラ B に表示されたコード=== $_SESSION[Yii.CCaptchaAction.12bd9136. .captcha ] が true かどうか。

そして、ジェネレーターとバリデーターのコントローラーが同じでない場合、それらは常に同じではありません!!

4

2 に答える 2

5
  1. モデル検証ルールcaptchaActionで、コントローラーのキャプチャ アクションを正確に指すように指定します。

    array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(), 'captcaAction' => 'サイト/キャプチャ'),

  2. capthca ウィジェットが再び使用されたときのビューで、次の方法でコントローラーのキャプチャ アクションを正確にポイントしますcaptchaAction

    <?php $this->widget('CCaptcha', array('captchaAction' => 'site/captcha')); ?>

于 2013-10-30T00:08:47.873 に答える