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です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/20 15:09:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント60pt

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));
  }
}
id:k27w

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

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

2010/07/20 15:08:52
  • id:yamaneroom
    yamaneroom 2010/07/19 17:05:36
    preg_matchにどんな形でパラメータを渡しているのか?
  • id:k27w
    「Testモデル」に書いたとおりです。それ以外は指定していません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません