例えばメールアドレスや電話番号。
ユーザー登録の処理などの際に、新規ならば、存在していないことをチェックしたいし、更新ならば、現在の自分自身のレコード以外を対象に存在していない値であることを確認したいもの。
それ用の独自バリデーションを作る。
より効率的な書き方がある気がするけど、とりあえずの物を。
実現方法
現在の Controller 名を取得する
Controller に対応する Action を取得する
取得した Controller と Action に応じた処理をゴニョゴニョする
準備
APPPATH/classes/myuti/validation/common.php に準備すると仮定。
呼び出し元で使えるようにする(お好きな方法で)
APPPATH/classes/myuti/validation/common.php にバリデーション用ファイルを準備する
APPPATH/classes/myuti/validation/common.php
<?php
class MyUtil_Validation_Common {
public static function _validation_is_unique_value($val)
{
// フィールド名を取得:このフィールド名に対して既にレコードが存在するかどうかを確認
$filed_name = \Validation::active_field()->name;
switch (strtolower(Request::main()->controller))
{
case 'controller_admin_maintenance_user':
//
$model_name = '\\Auth\\Model\\Auth_user';
switch (strtolower(Request::main()->action))
{
case 'create':
// create
$values = $model_name::find('all',array(
'where' => array(
array($filed_name, $val),
),
));
if (count($values))
{
return false;
}
break;
case 'edit':
// edit
// URI last Segment will be target_id
$current_id = Request::main()->uri->segment(count(Request::main()->uri->segments()));
$values = $model_name::find('all',array(
'where' => array(
array('id', $current_id),
),
));
if (count($values) != 1)
{
return false;
}
$origin_value = $values[$current_id]->$filed_name;
if ($origin_value != $val)
{
// 元の $field_name から値が変わっているので、新しい値が既に存在していたら return false する
$values = $model_name::find('all',array(
'where' => array(
array($filed_name, $val),
),
));
if (count($values))
{
return false;
}
}
break;
default:
return false;
break;
}
break;
default:
return false;
break;
}
return true;
}
}
こんな感じでどうでしょうか。
課題とか
Switch文を増やしていけばそれなりに処理出来る気がします。が、Switch文を増やしていくのもなんか嫌。
ルーティングへの対応を入れてないのがダメ
Edit の時の URI 判定をもう少し妥当なやり方にしないとまずい
とか、なんだか色々あります…
イマイチな感じやけど、とりあえず。