人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CakePHPで多次元配列のバリデーションの方法を教えてください。

■ビュー
<?php echo $form->create(array('action' => 'add'))?>
<?php echo $form->input('Test.list.name', array('type'=>'text'))?>
<?php echo $form->end('送信')?>

■Testコントローラー
function add(){
if (isset($this->data)) {
$this->Test->set($this->data);
if ($this->Test->validates()) {
/* saveの処理 */
}
}
}

■Testモデル
var $validate = array(
'list' => array(
'name' => array(
'rule' => 'notEmpty',
'message' => '未入力です',
),
),
);

■問題
未入力の状態で送信すると「preg_match() expects parameter 2 to be string, array given [CORE\cake\libs\validation.php, line 946]」
というエラーメッセージが表示されます。
該当箇所を見ると、preg_matchの指定が正しく行えていない?ような感じだと思うのですが、
バリデーションの書き方が悪いのか、別の問題なのか現時点で分かりません。

原因がお分かりの方は、アドバイスお願いします。
CakePHPは1.3.2を使用しています。PHPは5.3.1です。

●質問者: k27w
●カテゴリ:ウェブ制作
✍キーワード:946 ADD Cake CakePHP CORE
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tdoi
●60ポイント

notEmpyは配列には使えません。

内部的には、以下のようなことが実行されてエラーになります。

$data = array('Test' => array('list' => array('name' => '入力内容')));
preg_match('/[^\s]+/m', $data);

どうしてもこのようなことをする必要があれば、以下のURLを参考にして、validatorを追加してあげてください。

http://book.cakephp.org/ja/view/150/Custom-Validation-Rules

確認していませんが、こんな感じでいけると思います。

class Test {
 var $name = 'Test';
 var $validate = array(
 'list' => array('rule' => array('contentsNotEmpty', array('list', 'name')),
 'message' => 'Nameが未入力です'));

 function contentsNotEmpty($data, $keys) {
 $target = $data[$this->name];
 foreach ($keys as $key) {
 if (!isset($target[$key]) {
 return false;
 } else {
 $target = $target[$key];
 }
 }
 return (preg_match('/[^\s]+/m', $target));
 }
}
◎質問者からの返答

独自のバリデーションを作ってそこで判定するんですね。

エラーの意味も理解できました。ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ