Sor*_*rcy 3 php cakephp callback save
我有一个相对简单的条目模型,只有五个字段:
所以,没什么特别的.现在,单个表单可以有多个条目(已经存在的条目和刚创建的新条目),表单通过ajax调用进行扩展.
当我提交表单时$this->data看起来像这样:
Array
(
[Entry] => Array
(
[date] => 2011-01-07
[0] => Array
(
[id] => 1
[type] => Eat
[amount] => 1 Steak, one baked potatoe
[unit] => lunch
[time] => Array
(
[hour] => 13
[min] => 31
)
)
[1] => Array
(
[type] => weight
[amount] => 78.5
[unit] => KG
[time] => Array
(
[hour] => 22
[min] => 22
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
第一个条目$this->data['Entry']['date']是所有条目应使用的日期.而且由于缺少user_id,我在entry-model中创建了一个"beforeSave"函数.它看起来像这样:
function beforeSave() {
App::import('Component','Session');
$this->Session = new SessionComponent();
if (isset($this->data) && isset($this->data['Entry'])) {
$date = $this->data['Entry']['date'];
unset($this->data['Entry']['date']);
foreach ($this->data['Entry'] as $n => $entry) {
if (is_array($entry)) {
$this->data['Entry'][$n]['date'] = $date . ' ' . $entry['time']['hour'] . ':' . $entry['time']['min'] . ':00';
$this->data['Entry'][$n]['user_id'] = $this->Session->read('Auth.User.id');
}
}
debug($this->data);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我删除日期,将其与用户的时间条目一起添加,从而创建一个mysql datetime条目并添加登录用户的user_id.直截了当,真的.结果数组(由最后一个输出debug())如下所示:
Array
(
[Entry] => Array
(
[0] => Array
(
[id] => 1
[type] => Eat
[amount] => 1 Steak, 1 baked potatoe
[unit] => lunch
[time] => Array
(
[hour] => 09
[min] => 31
)
[date] => 2011-01-07 09:31:00
[user_id] => 2
)
[1] => Array
(
[type] => Weight
[amount] => 78.5
[unit] => KG
[time] => Array
(
[hour] => 22
[min] => 22
)
[date] => 2011-01-07 22:22:00
[user_id] => 2
)
)
)
Run Code Online (Sandbox Code Playgroud)
所以它看起来就像我希望它看起来一样,它应该很容易保存.但是当我使用$this->Entry->saveAll($this->data['Entry'])保存所有条目时,它不仅不起作用,而且当我$this->data在saveAll之后直接调试时,它看起来与saveAll函数之前完全一样 - 日期又回到数组中,条目没有date或user_id条目.
我可以看到beforeSave被调用,我可以看到它发生了变化$this->data,但是在beforeSave结束和"saveAll"的使用之间的某个地方,我的所有变化都会丢失并$this->data恢复到原始状态.因此不会进行保存.
小智 6
尝试使用hasMany实现一些清理时遇到了类似的问题.事实证明问题在于saveAll()的工作原理.控制器中的$ this->数据与Model :: beforeSave()回调中的$ this-> data不同,两者不同步.当您调用Model :: saveAll()从控制器传递$ this-> data时您明确地给模型"旧版本"的数据数组.当你在cake/libs/model/model.php中查看saveAll定义时,它只是:
if (empty($data)) {
$data = $this->data
}
Run Code Online (Sandbox Code Playgroud)
并且不再需要在模型中同步修改后的$ data数组,并通过参数$ data从控制器传递.解决方案是不将数据传递给saveAll(),而是首先使用Model :: set()在模型上设置数据,然后调用Model :: saveAll()(不带$ data参数).
| 归档时间: |
|
| 查看次数: |
2527 次 |
| 最近记录: |