■ビュー
<?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です。
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)); } }
独自のバリデーションを作ってそこで判定するんですね。
エラーの意味も理解できました。ありがとうございます。