CakePHPのver2.8にて。
以下のようなデータを作成します。
php
1$this->request->data = 2[ 3 "ModelName" => 4 [ 5 0 => 6 [ 7 "foo_1" => "あああ", 8 "foo_2" => "いいい" 9 ], 10 1 => 11 [ 12 "foo_1" => "ううう", 13 "foo_2" => "えええ" 14 ], 15 ] 16]
そしてこのデータを保存します。
php
1$this->ModelName->create(); 2if($this->ModelName->saveAll($this->request->data["modelName"])) 3{ 4 $this->Flash->success("保存しました"); 5} 6else 7{ 8 $this->Flash->error("保存できませんでした"); 9}
saveAllが成功にせよ失敗にせよ、その後「$this->request->data」の中身を調べると
php
1$this->request->data = 2[ 3 "ModelName" => 4 [ 5 0 => 6 [ 7 "foo_1" => "あああ", 8 "foo_2" => "いいい" 9 ], 10 1 => 11 [ 12 "ModelName" => 13 [ 14 "foo_1" => "ううう", 15 "foo_2" => "えええ" 16 ] 17 ], 18 ] 19]
と、片方だけ1階層深くネストされちゃうんです。
成功したときは問題ないのですが、失敗したときは、この「$this->request->data」を持って再度Viewを描画するため、2つ目のデータが存在しないことになってしまい、Viewに再描画されません。
ちなみにどの段階でデータが書き換えられてしまうのか確かめるために、以下のように部分部分でdebugさせてみると、
php
1debug($this->request->data);// ...(1) 2 3$this->ModelName->create(); 4 5debug($this->request->data);// ...(2) 6 7if($this->ModelName->saveAll($this->request->data["modelName"])) 8{ 9 debug($this->request->data);// ...(3) 10 $this->Flash->success("保存しました"); 11} 12else 13{ 14 debug($this->request->data);// ...(4) 15 $this->Flash->error("保存できませんでした"); 16}
やはり、(3)と(4)の部分でデータが書き換わってしまっていました。
ちなみにsaveAllでまず動くのはバリデーションでしょうから、バリデーションのみを実行させてみました。
php
1debug($this->request->data);// ...(1) 2 3$this->ModelName->saveAll($this->request->data["ModelName"], ['validate' => 'only']);//saveAllのバリデーション機能のみを使用 4if($this->ModelName->validates()) 5{ 6 debug($this->request->data);// ...(2) 7} 8else 9{ 10 debug($this->request->data);// ...(3) 11 debug($this->ModelName->validationErrors); 12}
すると、やはり、実行後の(2)と(3)でデータが書き換わってしまっています。
単純にバリデーションしただけで、そのバリデーションしたデータそのものが書き換わってしまうことなんてありえるんでしょうか?
ちなみにバリデーションのルールが書いてあるモデルファイルのバリデーションルールは、念の為すべて殺してあります。
php
1class ModelName extends AppModel { 2public $validate = 3[ 4// 'foo_1' => 5// [ 6// 'notBlank' => 7// [ 8// 'rule' => ['notBlank'], 9// ], 10// ], 11// 'foo_2' => 12// [ 13// 'notBlank' => 14// [ 15// 'rule' => ['notBlank'], 16// ], 17// ], 18]; 19}
どなたか、取っ掛かりだけでもいいので、こういう事案にあったことある方いましたら、詳細教えてください!
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。