Yii Framework : 入力フォームに入れられた値のajaxを使ったバリデートとページ遷移
前回の続きです。
インプットフォームに入力があった際ajaxでリアルタイムバリデーションをかけます。
またsubmit時には処理の流れ上でかけます。
■ コントローラー編集
HogeController内actionIndexを前回から大幅編集
// モデルインスタンス作成
$model = new THoge;
// ajaxバリデーション(プロジェクト作成時にデフォルトで入ってる関数を呼び出します)
$this->performAjaxValidation($model);
// ユーザーからPOSTを受け取った場合
if(isset($_POST[‘THoge’])){
// POSTで受け取ったデータをオブジェクトに格納
$model->attributes=$_POST[‘THoge’];
// 受け取ったデータのバリデートが成功したら
if($model->validate()){
// 受け取ったデータをセッションに格納
Yii::app()->session[‘hoge_param’] = $model->attributes;
// 次のアクションへリダイレクト
$this->redirect(array(‘moge’));
}
}
// view表示
$this-> render(‘index’, array(‘model’=>$model, ));
}
あちこちのサイトを参考にさせてもらってつぎはぎで作ってます。
ajax処理と普通の処理を同じアクション内でやってるのが面白いですw
でもそのせいで、public function actionIndex(){ の真下にデバッグ用print_r($_POST)を書いたら
ajaxが動かなくなって、原因が分からず30分ぐらい右往左往してましたorz
アホです(; ;
また、ajaxでバリデートを行う場合、CFormではなくCActiveFormを使うのが一般的だそうでそっちを使うことにしました。
フォームビルダも今回は使いません。
■ モデル編集
バリデーションルールはモデル内function rules()に設定するそうです。
ルールは変数名(配列で複数指定可)、バリデーション型、バリデート内容、適用ページ、エラーメッセージ他もろもろが設定できます。
型とバリデート内容を自分で定義することもできるようです。詳細はこちらをご参照ください。
return array(
array(‘hoge_type’, ‘required’),
array(‘hoge_date’, ‘date’, ‘message’=>’日付をyyyy-mm-ddで入力して下さい’ , ‘allowEmpty’=>true, ‘on’=>’index’),
array(‘hoge_name’, ‘length’, ‘max’=>100),
array(‘hoge_text’, ‘length’, ‘message’=>’最大文字数は10字ほげ’, ‘max’=>10),
);
}
また、モデル内にfunction init()を作成し、その中で初期値を設定することもできます。
$this -> hoge_date = date(‘Y-m-d’);
}
■ビュー編集
<!– form –>
<div class=”form”>
<?php
// CActiveForm ウィジェット設定
$form = $this->beginWidget(
‘CActiveForm’, array(
‘id’ => ‘thoge-form’,
‘enableAjaxValidation’ => true,
‘enableClientValidation’=>true,
‘clientOptions’ => array(
‘validateOnSubmit’ => true,
‘validateOnChange’ => true,
‘validateOnType’ => false,
),
)
);
?>
<!– エラーサマリー表示 –>
<?php echo $form->errorSummary($model); ?>
<!– フォーム部分 –>
<div class=”row”>
<?php echo $form->labelEx($model, ‘hoge_type’); ?>
<?php echo $form->dropDownList($model, ‘hoge_type’, THoge::model()->getHogeListOptions()); ?>
<?php echo $form->error($model, ‘hoge_type’); ?>
</div>
<div class=”row”>
<?php echo $form->labelEx($model, ‘hoge_date’); ?>
<?php echo $form->textField($model, ‘hoge_date’); ?>
<?php echo $form->error($model, ‘hoge_date’); ?>
</div>
<div class=”row”>
<?php echo $form->labelEx($model, ‘hoge_name’); ?>
<?php echo $form->textField($model, ‘hoge_name’); ?>
<?php echo $form->error($model, ‘hoge_name’); ?>
</div>
<div class=”row”>
<?php echo $form->labelEx($model, ‘hoge_text’); ?>
<?php echo $form->textField($model, ‘hoge_text’); ?>
<?php echo $form->error($model, ‘hoge_text’); ?>
</div>
<div class=”row buttons”>
<?php echo CHtml::submitButton(‘登録’); ?>
</div>
<?php $this->endWidget(); ?>
</div>
<!– end form –>
beginWidgetとendWidgetで囲うと自動でformタグが生成されます。
beginWidgetにいくつかパラメータを設定しますが、詳細はまだよくわかってませんw
とりあえずこれで値をバリデート後sessionに入れて次のアクションに移動する仕組みができました。
あとはCSSを適宜変更してスタイルを変えて下さいw
Packt Publishing
売り上げランキング: 430,494