HOME>WEBプログラム覚書>[CakePHP2.2.x] 複数フィールドのバリデーション。例えばメールアドレスの再入力とか。
[CakePHP2.2.x] 複数フィールドのバリデーション。例えばメールアドレスの再入力とか。
メールアドレスの再入力とかうっとおしい派としてはあまりやりたくないのですが、一定の効果はあるみたいなので需要はあるようですね。
ってことでメールアドレスの再入力のような複数のフィールドの型が同じ場合のやりかた。
結果はこんな感じになります。バージョンは2.2.4。
なおベストプラクティスってわけではありません。おれおれなので信用しないでくださいw
View
ビューのコード。
バリデーションは個々におこないますがエラーはひとまとめにします。
(どちらかがエラーなら両方inValid的な扱い)
view
<?php
echo $this->Form->create('CodesRetry');
echo $this->Form->input('CodesRetry.email.base', array(
'label' => 'メールアドレス',
//'required' => 'required',
'div' => false,
));
echo $this->Form->input('CodesRetry.email.re_enter', array(
'label' => 'メールアドレス再入力',
//'required' => 'required',
'div' => false,
));
if ($this->Form->isFieldError('email')) {
echo $this->Form->error('email');
}
if (isset($success)) {
echo '<h2>Valid!</h2>';
}
echo $this->Form->end('チェック');
?>
このフォームをpostして$controller->request->dataをdumpすると下記のようになります。
emailを配列で受け取る形です。
controller
<?php
array(1) {
["CodesRetry"]=> array(1) {
["email"]=> array(2) {
["base"]=> string(0) ""
["re_entry"]=> string(0) ""
}
}
}
?>
Model
emailをバリデーションするためのモデルのコードは下記のようになります。
入力があるかのチェックとEmailのフォーマットのチェックと2つの入力値が等しいかのチェックをおこなっています。
model
<?php
class CodesRetry extends AppModel {
public $useTable = false;
public $validate = array(
'email' => array(
'notEmpties' => array(
'rule' => array('notEmpties', 'email'),
'message' => '入力は必須です。',
'required' => true,
),
'emails' => array(
'rule' => array('emails', 'email'),
'message' => 'メールアドレスの形式が異なっています。',
),
'equalToValue' => array(
'rule' => array('equalToValue', 'email', 'base', 're_entry'),
'message' => '入力された2つのメールアドレスが異なっています。',
),
),
);
/**
* emptyチェック
* $fieldValues[$fieldKey]が一つでもemptyの場合false
*
* @param array $fieldValues
* @param string fieldKey
* @return boolean
*/
public function notEmpties(Array $fieldValues, $fieldKey)
{
$result = true;
foreach ($fieldValues[$fieldKey] as $key => $value) {
if (!Validation::notEmpty($value)) {
$result = false;
}
}
return $result;
}
/**
* メールアドレスチェック
* $fieldValues[$fieldKey]が一つでもメールアドレスの
*
* @param array $fieldValues
* @param string fieldKey
* @return boolean
*/
public function emails(Array $fieldValues, $fieldKey)
{
$result = true;
foreach ($fieldValues[$fieldKey] as $key => $value) {
if (!Validation::email($value)) {
$result = false;
}
}
return $result;
}
/**
* $fieldValuesに含まれる2つの値が等しいかチェック
*
* @param array $fieldValues
* @param string $fieldKey
* @param int|string $one
* @param int|string $two
* @return boolean
*/
public function equalToValue(Array $fieldValues, $fieldKey, $one = 0, $two = 1)
{
if ($fieldValues[$fieldKey][$one] === $fieldValues[$fieldKey][$two]) {
$result = true;
} else {
$result = false;
}
return $result;
}
}
?>
組み込みのバリデーションルールは1つの値に対するものなので、
複数の値をチェックする独自のバリデーションメソッドを作ってます。
色々なところで使うのであればAppModelとかにおいてもよいかと思います。
Controller
コントローラーは下記のようなメソッドがあるだけで特に何もやってません。
controller
<?php
public $uses = array('CodesRetry');
public function retry()
{
if ($this->request->is('post')) {
$this->CodesRetry->set($this->request->data);
if ($this->CodesRetry->validates()) {
$this->set('success', 'true');
}
}
}
?>
実行結果はこちら
データベースへの保存
データベースに保存する場合は、バリデーション後にデータベースの
構造に合わせてデータを加工する必要があります。
Controller
<?php
$this->request->data['Model']['email'] = $this->request->data['Model']['email']['base'];
$this->Model->save($this->request->data);
?>
投稿日 |
2012年12月26日 13:45 |
カテゴリ |
PHP |
タグ |
CakePHP |
トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1317 |
コメント