あべてっく

役に立ったり立たなかったりする内容を備忘録的にちょこちょこと。
 

Yii Framework : 入力フォームに入れられた値のajaxを使ったバリデートとページ遷移

投稿日 2012年4月19日  カテゴリ : PHP  タグ :

前回の続きです。
インプットフォームに入力があった際ajaxでリアルタイムバリデーションをかけます。
またsubmit時には処理の流れ上でかけます。

■ コントローラー編集
HogeController内actionIndexを前回から大幅編集

public function 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()に設定するそうです。
ルールは変数名(配列で複数指定可)、バリデーション型、バリデート内容、適用ページ、エラーメッセージ他もろもろが設定できます。
型とバリデート内容を自分で定義することもできるようです。詳細はこちらをご参照ください。

public 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()を作成し、その中で初期値を設定することもできます。

public function init(){
$this -> hoge_date = date(‘Y-m-d’);
}

■ビュー編集

<h1>ほげサイト</h1>

<!– 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
 
 

Yii Application Development Cookbook
Alexander Makarov
Packt Publishing
売り上げランキング: 430,494

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です