3

Yii プロジェクトで AJAX 登録フォームを作成したいと考えています。したがって、すべてのページにログインボタンがあり、ユーザーが承認されていない場合にポップアップが表示されます。そのポップアップで、彼は電子メール フィールド、パスワード フィールド、および CAPTCHA (デフォルトの Yii キャプチャ) を含む登録フォームを見ることができます。

したがって、ユーザー登録のモデルは User です。検証規則があります。

array('code', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest),

すべてのユーザーのアクションがある私のコントローラーはユーザー (url: site.url/user/) であり、そこにキャプチャアクションを追加しました:

'captcha'=>array(
    'class'=>'CCaptchaAction',
    'backColor'=>0xFFFFFF,
    'foreColor'=>0x000000,
),

次のコードでは:

$this->widget('CCaptcha', array(
    'clickableImage'    => true,
    'showRefreshButton' => false,
))

そして、ここに問題があります:(すべてのページに表示できるポップアップ内にある (たとえば、メインコントローラーに属するインデックスページ) captcha は、そのコントローラーから (/user ではなく /main/captcha から) 画像をロードしたい/キャプチャ)。

すべてのコントローラーにキャプチャを追加するのは悪い考えなので、追加しました

'captchaAction' => '/user/captcha',

しかし、その後、キャプチャはURLからロードしたい

http://site.loc/user/captcha/v/4fe99aca1bbed

ユーザーフレンドリーな URL のキャプチャがクラッシュし、私はそれを避けることができません (私は、yii の専門家ではないと思いますが、これは共通のパス構成が原因です)。

これを解決する簡単な解決策はありますか?URL を修復するか、CAPTCHA を再構成する必要がありますか?

4

1 に答える 1

3

だから、助けを待っている間、私は自分で問題を解決しました:) 私のプロジェクトでは、コントローラーを次の階層に分けました:

/frontend
/backend

UserController と MainController を含む、一般ユーザー向けのすべてのコントローラーは (もちろん) フロントエンド セクションにあります。

はい、次のような URL で /frontend/ を非表示にする構成をいくつか書きました。

'<c:\w+>/<a:\w+>' => 'frontend/<c>/<a>',

そして、CAPTCHA 設定 ('captchaAction' => '/user/captcha') のその文字列は、どこに行くべきかを知っていると確信していました (ほとんどそうだったのです!) が、いいえ!

以下のように、コントローラーとアクションに FULL PATH を書き込む必要があります。

'captchaAction' => '/frontend/main/captcha',

質問で言ったように、CAPTCHA アクションを UserController に配置しましたが、MainController に配置されていることがわかります (UserController から削除しました)。

そして、エラーが発生しました:

CCaptchaValidator.action "captcha" is invalid. Unable to find such an action in the current controller. 

したがって、これを解決するには、 User MODELで CCaptchaValidator のプロパティcaptchaActionを使用する必要がありました! コード:

array('code', 'captcha', 'captchaAction'=>'/frontend/main/captcha', 'allowEmpty'=>!Yii::app()->user->isGuest)

これで、AJAX Captcha 検証が必要な場所で正しく機能するようになりました。

親愛なるコミュニティの皆さん、Yii のデフォルトの CAPTCHA で頑張ってください!

于 2012-06-27T13:30:22.803 に答える