Formの基本構成とひな形
シンプルなFormまわり
<?php echo $this->Form->create('DataSet', array('url' => 'reg'));?>
<?php
echo $this->Form->input("full_name", array(
'type' => 'text',
'value' => 'イリオモテ ヤマネコ',
'label' => false,
'div' => false,
'placeholder' => '-- 氏名 --',
));
?>
<?php echo $this->Form->submit('登録'); ?>
<?php echo $this->Form->end(); ?>
Formまわりの雛型
<?php echo $this->Form->create('DataSet', array('url' => 'reg', 'enctype' => 'multipart/form-data' ));?>
//テキストボックス
<?php echo $this->Form->input("full_name", array(
'type' => 'text',
'value' => 'イリオモテ ヤマネコ',
'label' => false,
'div' => false,
'placeholder' => '-- 氏名 --',
));
?>
//セレクトボックス
<?php echo $this->Form->input("age",array(
'type'=>'select',
'value' => 3,
'class'=>'age',
'label'=>false,
'div'=>false,
'options'=>array(1,2,3,4)));
?>
//ラジオボタン
<?php echo $this->Form->input("seibetu", array(
'type' => 'radio',
'value' => $seibetu,
'legend' => false,
'label' => false,
'div' => false,
'options' => array('1'=>'男','0'=>'女'),
'separator' => ' '//←ラジオボタンの間文字
));
?>
//チェックボックス
<?php echo $this->Form->input("{$i}.Rental.{$cr_id}.count",array(
'type'=>'checkbox',
'value' => 5,//←チェックが入っている場合に送信する値
'checked'=>true,//←チェックはここで設定
'label'=>false,
'div'=>false,
'class'=>'rental',
));?>
//hidden
<?php echo $this->Form->input("test", array(
'type' => 'hidden',
'value' => $sample_id,
));
?>
//サブミットボタン
<?php echo $this->Form->submit('登録', array('div' => false, 'class' => 'btn btn-primary')); ?>
<?php echo $this->Form->end(); ?>
HTMLヘルパーでバリデーションを組み込む | pattern
pattern属性に正規表現を指定することによって、バリデーションを組み込むことができる。
//半角数字のバリデーション
echo $this->Form->input('test_tel',
array(
'type' => 'tel',
'pattern' => "^[0-9]+$",
'title' => 'ハイフン「-」なし、半角数字で入力せよ',
'placeholder' => '例)09011112222',
'required',
'maxlength' => 11,
)
);
//カタカナのバリデーション
echo $this->Form->input('katakana_name',
array(
'type' => 'text',
'pattern' => "^[ァ-ンー]+$",
'title' => '全角カタカナで入力しなさい',
'placeholder' => 'カタカナデス',
'required',
'maxlength' => 20,
)
);
HTMLヘルパー | hidden
簡略的な書き方
hiddenフォームの簡略な書き方
<?php echo $this->Form->hidden('xxx_id');?>
HTMLソース
<input type="hidden" name="data[Neko][xxx_id]" id="NekoXxxId">
通常の書き方
HTMLヘルパー:hiddenの使用例【ctpファイル】
<?php
echo $this->Form->input("test", array(
'type' => 'hidden',
'value' => $sample_id,
));
?>
//コントローラでの取得例
//$sample_id=$this->request->data[フォーム名]['test'];
少し複雑なデータ構造の使用例
<?php
echo $this->Form->input("{$i}.xxx.test", array(
'type' => 'hidden',
'value' => $sample_id,
));
?>
//コントローラでの取得例
//$sample_id=$this->request->data[フォーム名][$i]['xxx']['test'];
ログインユーザー情報を取得
Authで認証している場合、「$this->Auth->user();」でログインユーザー情報を取得できる。ただしモデルでは使用できないのでコントローラー内で使用すること。
Auth情報は未確認であるが$_SESSIONに格納されているようである。
$this->Auth->user();以下のサンプルでは多数のユーザーに関する情報が表示されます
Debugger::dump($this->Auth->user());ログインユーザーIDだけ取得する場合
Debugger::dump($this->Auth->user('id'));
ログインユーザー名取得(未ログインである場合はnone)
// 更新ユーザーを取得(ログインユーザー名)
$update_user = 'none';
if(!empty($this->Auth->user())){
$userData = $this->Auth->user();
$update_user = $userData['username'];
}
モデル生成 | ClassRegistry
モデルを直接生成
$ModelA = ClassRegistry::init('ModelA');
DBと直接結びつけない、且つコントローラ内でバリデーションを実装
private function valid_ent($ent){
// ▽入力チェック対象のデータの例
// $ent=array(
// 'id' => '10002',
// 'last_name_kana' => 'モトブあああああ',
// 'first_name_kana' => 'タロウ',
// 'age' => '40',);
//バリデーション情報
$valids = array(
'last_name_kana'=> array(
'maxLength'=>array(
'rule' => array('maxLength', 4),
'message' => '4文字以内で入力してください',
'allowEmpty' => true
),
),
'first_name_kana'=> array(
'maxLength'=>array(
'rule' => array('maxLength', 4),
'message' => '4文字以内で入力してください',
'allowEmpty' => true
),
),
);
//モデルを生成
if(empty($this->ModelA)){
App::uses('ModelA','Model');
$this->ModelA=new ModelA();
}
//モデルへバリデーション情報をセット
$this->ModelA->validate=$valids;
//入力エラー情報
$err=null;
//入力チェックするエンティティをセット
$this->ModelA->set($ent);
//入力チェック
if ($this->ModelA->validates($ent)){//正常である場合
Debugger::dump('入力エラーなし');
}
else{//入力エラーがある場合。
//入力チェックエラー情報を取得
$errors=$this->ModelA->validationErrors;
//入力エラーメッセージを組み立て
$errMsg="";
foreach ($errors as $err){
foreach($err as $val){
$errMsg.= $val.' : ';
}
}
$err['errors']=$errors;
$err['err_msg']=$errMsg;
Debugger::dump($err);
// $errの内容
// array(
// (int) 0 => '4文字以内で入力してください',
// 'err_msg' => '4文字以内で入力してください : '
// )
}
return $err;
}
コントローラでバリデーション(2次元データ版)
private function valid_sanka_edit($data){
// ▽入力チェック対象のデータの例
// array(
// (int) 0 => array(
// 'id' => '10005',
// 'last_name_kana' => 'リュウキュウ',
// 'first_name_kana' => 'ヤマガメ',
// 'age' => '81',
// ),
// (int) 1 => array(
// 'id' => '10006',
// 'last_name_kana' => 'オキナワ',
// 'first_name_kana' => 'ハブタロウ',
// 'age' => '10',
// )
// )
Debugger::dump($data);
//バリデーション情報
$valids = array(
'last_name_kana'=> array(
'maxLength'=>array(
'rule' => array('maxLength', 4),
'message' => '名は4文字以内で入力してください',
'allowEmpty' => true
),
),
'first_name_kana'=> array(
'maxLength'=>array(
'rule' => array('maxLength', 4),
'message' => '氏は4文字以内で入力してください',
'allowEmpty' => true
),
),
);
//モデルを生成
if(empty($this->ModelA)){
App::uses('ModelA','Model');
$this->ModelA=new ModelA();
}
//モデルへバリデーション情報をセット
$this->ModelA->validate=$valids;
//入力エラー情報
$errs=null;
$row_no=1;
$errsMsg="";
$err_flg=false;
foreach ($data as $ent) {
//入力チェックするエンティティをセット
$this->ModelA->set($ent);
//入力チェック
if ($this->ModelA->validates($ent)){//正常である場合
$errs[]=null;
}
else{//入力エラーがある場合。
//入力チェックエラー情報を取得
$errors=$this->ModelA->validationErrors;
//入力エラーメッセージを組み立て
$errMsg="";
foreach ($errors as $err){
foreach($err as $val){
$errMsg.= $row_no.'行目:'.$val.' : ';
}
}
$errsMsg.=$errMsg.'<br>';
$err['errors']=$errors;
$err['err_msg']=$errMsg;
$errs[]=$err;
}
$row_no++;
}
$ret=null;
if($err_flg==true){
$ret['errs']=$errs;
$ret['errs_msg']=$errsMsg;
}
Debugger::dump($ret);
return $ret;
現在のURLを取得する
「Router::url()」で現在のURLを取得できる。引数を指定することによりいくつかのパターンでURLを取得できる。
「Router::url()」のいくつかのパターンサンプル
$x=Router::url(); → /test/xxx/
$x2=Router::url('/'); → /
$x3=h(Router::url(null, true)); → http://localhost/test/xxx/
$x4=h(Router::url('/', true)); → http://localhost/
SQLを直接実行する
いたってシンプル。以下のようにするだけ。$data=$this->query(SQLクエリー);
サンプル
$data = $this->query( "SELECT TestA.id ,TestA.stock_flg ,TestB.stock_date ,TestB.stock_count as zan FROM test_as AS TestA LEFT JOIN test_bs AS TestB ON TestA.id = TestB.stock_group_id WHERE TestA.stock_flg=2 AND TestA.delete_flg=0 AND TestB.stock_date='2012-12-12' AND TestB.delete_flg=0" ,false); return $data;
SQLを直接実行する | テーブルを紐づけない汎用型のモデルクラスにおいて
class Okinawa extends AppModel {
public $useTable = false;
public function test(){
$data = $this->query(
"SELECT * FROM animals WHERE id = 99"
,false);
var_dump($data);
}
}
いろんなバリデーション
public $validate = array(
//必須バリデーション
'neko' => array(
'notEmpty'=>array(
'rule' => 'notEmpty',
'message' => 'メールアドレスは必須入力です。'
),
),
//最大文字数バリデーション
'kj_title' => array(
'maxLength'=>array(
'rule' => array('maxLength', 50),
'message' => 'タイトルは50文字以内で入力してください。',
'allowEmpty' => true//空を許可
)
),
//自然数のバリデーション
//※注意:電話番号で使ってはいけない。0から始まる値は自然数と見なされない。
'kani' => array(
'naturalNumber'=>array(
'rule' => array('naturalNumber', true), // 0以上の整数
'message' => 'kaniは0以上の自然数を入力してください。',
),
//数値範囲
'range'=>array(
'rule' => array('range', -1, 10),
'message' => 'kaniは0~9の自然数を入力してください。'
),
),
//数値範囲のバリデーション。小数もOK。
'tanuki'=> array(
'range'=>array(
'rule' => array('range', 0,99999),
'message' => 'タヌキ数値は0を超える数値を入力してください。(小数可、最大99999)',
'allowEmpty' => false
),
),
//整数(負数を含む)のバリデーション
'int_x' => array(
'custom'=>array(
'rule' => array( 'custom', '/^[-]?[0-9]+?$/' ),
'message' => 'int_xは整数を入力してください。',
'allowEmpty' => true
),
),
//半角英数字といくつかの記号のバリデーション
'yagi' => array(
'notEmpty'=>array(
'rule' => 'notEmpty',
'message' => 'yagiは空白禁止です'
),
'custom'=>array(
'rule' => array( 'custom', '/^[a-zA-Z0-9_\-.!~|]*$/' ),
'message' => 'yagiは半角英数と特定の記号( -_.!~ )以外は入力できません。'
),
'maxLength'=>array(
'rule' => array('maxLength', 5),
'message' => 'yagiは5文字以内です。'
)
),
//日付形式のバリデーション
'buta'=> array(
'rule' => array( 'date', 'ymd'),
'message' => '日付は日付形式【yyyy-mm-dd】で入力してください。',
'allowEmpty' => true
),
//時刻のバリデーション。先頭に「8:00」だとはじかれる。「8:00」としなければならない模様
'tori'=> array(
'time'=>array(
'rule' => array('time', 'his'),
'message' => '時間はh:i:s形式で入力してください。(例 12:12:12)',
'allowEmpty' => false
),
),
//メールアドレスのバリデーション
'kirin' => array(
'email'=>array(
'rule' => array('email'),
'message' => 'メールアドレスは書式に従って入力してください。(全角になっていないか注意)',
),
),
//電話番号のバリデーション
'tel'=> array(
'maxLength'=>array(
'rule' => array('maxLength', 36),
'message' => '電話番号は36文字以内で入力してください',
'allowEmpty' => false
),
'tel'=>array(
'rule' => array( 'custom', '/^[0-9+#*-]*$/' ),
'message' => '電話番号は半角数字と特定の記号( - # + *)以外は入力できません。'
),
),
//カタカナのバリデーション
'end_name_kana'=> array(
'katakana'=>array(
'rule' => array( 'custom', "/^[ァ-ヶー゛゜ \s]*$/u" ),
'message' => '氏のフリガナはカタカナで入力してください。(全角カタカナ)'
),
),
//カタカナのバリデーション(オリジナル関数呼び出し型)
'first_name_kana'=> array(
'katakana' => array(
'rule' => array('katakana_only'),
'message' => '名は全角カタカナで記入してください(半角カタカナは不可)',
),
),
//日時のバリデーション
'datetime_a'=> array(
'rule' => array( 'datetime', 'ymd'),
'message' => '日時形式【yyyy-mm-dd h:i:s】で入力してください。',
'allowEmpty' => true
),
//時分のカスタムバリデーション
'test_hi'=> array(
'is_time_hi' => array(
'rule' => array('is_time_hi'),
'message' => '集合時間はh:i形式で入力してください。(例 12:00)',
),
),
);
//カタカナチェック。全角スペースと半角スペースも許可。カスタムバリデーション。
function katakana_only( $wordvalue){
$value = array_shift($wordvalue);
return preg_match("/^[ァ-ヶー゛゜ \s]*$/u", $value); // スペースも含むカタカナ
}
/**
* カスタムバリデーション
* h:i型の時刻チェック(時分のみ)
* @param $v 時刻文字列
* @return true:false
*/
//時分チェック(h:i形式)
function is_time_hi($v){
if(empty($v)){
return true;
}
//値が配列で入って来るケースがあるので対策
if(is_array($v)){
$v=reset($v);
}
$v=trim($v);
$ary=explode(':',$v);
if(count($ary) != 2){
return null;
}
$h=trim($ary[0]);
$m=trim($ary[1]);
if(!preg_match('/^[0-9]+$/', $h)){
return false;
}
if(!preg_match('/^[0-9]+$/', $m)){
return false;
}
if($h < 0 || $h > 23){
return false;
}
if($m < 0 || $m > 59){
return false;
}
return true;
}