この記事では、ユーザーの承認を担当するすべてのクラスが既にあり、fancyboxを介して動作させるだけでよいと想定しています。
ファンシーボックスを接続します
fancybox拡張機能をダウンロードし、拡張機能フォルダーに入れます。
テンプレートで接続します:
<?php $this->widget('application.extensions.fancybox.EFancyBox', array()); ?>
テンプレートにリンクを作成して、fancyboxを呼び出します:
<?php echo CHtml::link('', array('/some_controller/fancy/'), array('class'=>'fancy_auth')); ?>
fancy_authリンククラスによると、イベントをアタッチしています:
$(document).ready(function(){ $(".fancy_auth").fancybox({ 'transitionIn' : 'elastic', 'transitionOut' : 'elastic', 'width' : 345, 'height' : 360, 'autoDimensions': false, 'autoSize': false, 'speedIn' : '500', 'speedOut' : '500', 'type' : 'ajax', 'closeBtn' : false });
基本的に、パラメーターは例として示されています。 注目に値する唯一のものは「タイプ」:「ajax」です。 「タイプ」:「iframe」を作成すると、以下で提供する成功したリクエストの処理コード、つまりページのリロードコードは機能しません。 許可後に再起動する必要がない場合は、選択したタイプを選択します。
コントローラー
リンクパラメーターからわかるように、承認フォームを含むビューはsome_controllerコントローラーのファンシーメソッドによって送信されます。 私の方法は次のようになります。
public function actionFancy() { $model=new UserLogin; $this->performAjaxValidation($model); echo $this->renderPartial('_login_utf',array('model'=>$model),true,true); }
デフォルトでは、renderPartialの最後のパラメーターの値はfalseです。 この場合、このメソッドをtrueに設定することが重要です。これは、デフォルトでrenderメソッドでも呼び出され、必要なすべてのスクリプトおよびその他の動的コンテンツを接続するprocessOutput()メソッドによる処理を担当するためです。 これがないと、登録中のエラー処理は機能しません。
テンプレートと小さなエンコード地獄
幸運でutf-8にプロジェクトがある場合は、目的のビューを作成するだけです。 たとえば、次のように:
<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'user-login', // , 'action' => Yii::app()->createUrl('/user/login'), // ajax- 'enableAjaxValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, // js , , . // 'afterValidate' => 'js:afterValidate', ), )); ? <?php echo $form->labelEx($model,'username'); ?> <?php echo $form->textField($model,'username'); ?> <?php echo $form->error($model,'username'); ?> <?php echo $form->labelEx($model,'password'); ?> <?php echo $form->passwordField($model,'password'); ?> <?php echo $form->error($model,'password'); ?> <?php echo CHtml::SubmitButton(' ', array( 'type' => 'POST', // , // CSS- #msg. 'update' => '#msg', 'class'=>'journalFancySubmit', )); ?> <?php $this->endWidget(); ?>
すべてが非常に悲しく、win-1251でのプロジェクトが私のもののようになっている場合、テンプレートは正方形に、つまり間違ったエンコードで表示されます。 ハリウッドの労働者は言う-緊急にutfでやり直し、彼らは正しいだろうが、残念なことに、現実はしばしば何らかの理由でプロジェクト全体を宗教的に正しいエンコーディングに転送することは不可能ですが、それを動作させることが必要です。 最も単純な松葉杖は、utf-8でエンコードされたテンプレートファイル自体を作成するように思えました。 その後、すべてが正しく与えられます。
コントローラーでのAjax検証の処理、再びエンコードの問題
コントローラがインストールされたajax検証で正しく動作するためには、コントローラにajaxリクエストの処理を追加する必要があります。通常、これは次のように行われます。
if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') { echo CActiveForm::validate($model); Yii::app()->end; }
しかし、win-1251の場合、検証結果を返すために最後に呼び出されるjson_encodeはこのエンコーディングを使用したくないため、エラーが発生します。 validateメソッドを書き換える必要があります。
protected function validate($models, $attributes=null, $loadInput=true) { $result=array(); if(!is_array($models)) $models=array($models); foreach($models as $model) { if($loadInput && isset($_POST[get_class($model)])) $model->attributes=$_POST[get_class($model)]; $model->validate($attributes); foreach($model->getErrors() as $attribute=>$errors) $result[CHtml::activeId($model,$attribute)]=$errors; } if (empty($result)) { $utf_result = array(); } foreach ($result as $key => $value) { if (is_array($value)) { foreach ($value as $inner_key => $inner_value) { $utf_result[$key][$inner_key] = iconv('windows-1251', 'UTF-8', $inner_value); } } else { $utf_result[$key] = iconv('windows-1251', 'UTF-8', $value); } } return function_exists('json_encode') ? json_encode($utf_result) : CJSON::encode($utf_result); }
CActiveForm :: validateメソッドがここにコピーされ、結果の変換が最後に追加されます。
したがって、呼び出しを変更します
echo CActiveForm::validate($model);
に
echo $this->validate($model);
これで、標準エラー処理が正常に機能します。
承認が成功した後
承認は成功しました。次に、承認フォームウィジェットを作成するときにclientOptionsに接続したafterValidate js関数について考えます。
'clientOptions'=>array( 'validateOnSubmit'=>true, 'afterValidate' => 'js:afterValidate',
afterValidateは、ajaxチェックを実行した後に呼び出される関数です。
入力パラメーターは(data、hasError)、form-フォームオブジェクトのJQuery表現、data-サーバーからのjson応答、HasError-検証中にエラーが発生したかどうかを示すブール値です。
afterValidateは、validateOnSubmitがtrueに設定されている場合にのみ使用できます。
この機能では、ユーザーが正常にログインした後、必要なすべてを実行できます。
たとえば、私にとっては次のようになります。
function afterValidate(form, data, hasError) { if (hasError == false) { window.location.reload(); parent.$.fancybox.close(); } }
ソース
すべての決定はyiiフォーラムおよびstackoverflow.comから行われ、記事に簡単に要約されています。
結論の代わりに
あなたとあなた自身がutf-8のプロジェクトでのみ働き、人生を楽しんでほしい。