Cake PHPの覚書

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;
	}