YiiのKCAPTCHA

Yiiでの作業中に最初に問題になったのは、通常のキャプチャがないことです。 デフォルトのキャプチャは、いくつかの理由で私に合わなかった:

グーグルで、このような問題に遭遇したのは私だけではないことに気付きました。 また、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);

Source: https://habr.com/ru/post/J141129/


All Articles