Yiiでの作業中に最初に問題になったのは、通常のキャプチャがないことです。 デフォルトのキャプチャは、いくつかの理由で私に合わなかった:
- 常にバグがあります(F5を押すだけで、正常に表示されることもあれば、空の画像が表示されることもあります。
- アルゴリズム自体は単純すぎるように思えました(+ 1つのフォントのみが使用されています)。
- ページのリロード時に、画像のコードは更新されませんでした。
グーグルで、このような問題に遭遇したのは私だけではないことに気付きました。 また、recaptchaを使用したオプションも「オプションではありません」-必要な設計に合わせることができませんでした(または、よく理解できませんでした)。
なぜなら 私のプロジェクトでは、通常KCAPTCHA captcha(http://captcha.ru/kcaptcha/)を使用します。YiiとKCAPTCHAの既存のcaptchaを組み合わせることにしました。 そして、ここに私が得たものがあります
-glavweb.ru/public/download/kcaptcha.zipキャプチャを使用する
まず、
glavweb.ru/public/download/kcaptcha.zipから
キャプチャを自分にアップロードします。
次に、アーカイブをYiiアプリケーションの「protected / extensions」フォルダーに解凍する必要があります。 次のような構造になります。
protected/
extensions/
kcaptcha/
fonts/
KCaptchaAction.php
なぜなら 拡張機能にはアクションのみが含まれ、captchaウィジェットとバリデーターが標準で使用されます。captchaの接続については完全には説明しません。レシピ-http://www.yiiframework.ru/doc/cookbook/ru/form.captchaで非常によくできています。 変更はコントローラーのみに関係するため、次のように追加します。
public function actions()
{
return array(
'captcha'=>array(
'class' => 'application.extensions.kcaptcha.KCaptchaAction',
'maxLength' => 6,
'minLength' => 5,
'foreColor' => array(mt_rand(0, 100), mt_rand(0, 100),mt_rand(0, 100)),
'backColor' => array(mt_rand(200, 210), mt_rand(210, 220),mt_rand(220, 230))
)
);
}
可能なキャプチャオプション
alphabet-使用する
アルファベット 。 デフォルトは「0123456789abcdefghijklmnopqrstuvwxyz」です。 フォントファイルを変更せずに変更しないでください。
allowedSymbols -captchaの描画に使用される記号で、類似の記号はありません(o => 0、1 => l、i => j、t => f)。 デフォルトは23456789abcdeghkmnpqsuvxyzです。
width-キャプチャの幅。 デフォルト値は120です。これを不必要に変更しないでください。これらのパラメーターは最適です。
height-キャプチャの高さ。 デフォルト値は60です。これを不必要に変更しないでください。これらのパラメーターは最適です。
minLength-キャプチャ文字の最小数。 デフォルトは6です。
maxLength-キャプチャ文字の最大数。 デフォルトは7です。
variationAmplitude-シンボルの振動の垂直振幅を2で割った値。デフォルト値は5です。
noSpaces-文字間のスペースを防ぎます。 デフォルトはtrueです。
foreColor -RGB形式の
キャプチャテキストの色。 値を配列またはコンマで区切られた文字列として受け取ります。
backColor -RGB形式の
キャプチャの背景色。 値を配列またはコンマで区切られた文字列として受け取ります。
testLimit-同じキャプチャが表示される回数の値。 誤ったキャプチャ入力にのみ影響します(単純な更新には影響しません)。 デフォルトは3です。
fixedVerifyCode-確認コードを修正しました。 これは主に、テストを実行するたびに同じ検証コードを再現する自動テストで使用されます。 デフォルトはヌルです。
fontsDir-フォントディレクトリへの絶対パス。 デフォルト値はnullです。これは、拡張機能とともに配信されるフォントが使用されることを意味します。
ページのリロード後の画像コードの更新
しかし、ページをリロードした後に画像コードを更新すると、すべてが少し複雑になりました。 CCaptchaValidatorバリデーターのスナッグ、またはそのメソッドでクライアント部分を担当します。 captchaがダウンロードされるたびに検証コードを更新しても、js(バリデーターによって生成される)では、以前の画像からコードを取得します。 これは、画像のリクエストがページの読み込み後に行われるためです。 つまり 最初に、jsコードで、セッションに保存された画像コードを取得し、リクエストが<img>に送信され、セッションが更新されます。その結果、画像のコードはjsの対応するコードと一致しません(jsでは当然、画像コード自体ではなく、そのハッシュ)
ここでの解決策は、js($ captcha-> getVerifyCode(true))で表示されたときにバリデーターを書き換えてバリデーター内のバリデーターを更新するか、captchaフォームの表示を担当するアクション中のコードでセッションを削除することです:
// Refresh captcha
Yii::import('application.extensions.kcaptcha.KCaptchaAction');
Yii::app()->session->remove(KCaptchaAction::SESSION_KEY);