我正在尝试为我的Events / add添加重复功能 因此,如果我在星期一到星期五(甚至更多天)拥有相同的事件,则用户可以在一个添加中添加所有内容,而不是逐个添加。
我在Events / add.ctp中添加了一个输入字段:
$this->Form->input('repeat', array('type' => 'number'));
在beforeSave()
中的do-while循环中进行比较 if(!empty($this->data[$this->alias]['repeat'])) {
$repeat = $this->data['Event']['repeat'];
$i = 0;
do {
$start = strtotime($this->data[$this->alias]['start'] . ' +1 day');
$end = strtotime($this->data[$this->alias]['end'] . ' +1 day');
$this->data[$this->alias]['start'] = date('Y-m-d H:i:s', $start);
$this->data[$this->alias]['end'] = date('Y-m-d H:i:s', $end);
$this->create();
$this->save($this->data);
//i think here's the problem... this shouldn't be done here right?
$i++;
} while ($repeat >= $i);
}
我没有关于如何使这成为可能的想法.. 我知道我必须使用beforeSave来处理添加操作后的数据,但显然我无法在保存之前保存数据...任何提示?
答案 0 :(得分:1)
绝对不要在beforeSave中这样做。正如你所说,在beforeSave中有一个保存有点奇怪......它甚至没有给你循环问题吗?因为你在循环中进行了保存,并且$this->data
内部保持了相同的repeat
值,所以它将永远重复,并且会对那些不良事件表进行喷射。
不,肯定会从那里得到那个循环。
我认为最好的方法是在模型中添加一个新功能
public function saveRepeating($data) {
if(!empty($data[$this->alias]['repeat'])) {
$repeat = $data['Event']['repeat'];
unset($data['Event']['repeat']); //prevent loops!
$i = 0;
do {
$start = strtotime($data[$this->alias]['start'] . ' +1 day');
$end = strtotime($data[$this->alias]['end'] . ' +1 day');
$data[$this->alias]['start'] = date('Y-m-d H:i:s', $start);
$data[$this->alias]['end'] = date('Y-m-d H:i:s', $end);
$this->create();
$this->save($data);
$i++;
} while ($repeat >= $i);
}
}
在您的控制器中,调用该函数而不是使用
保存$this->Model->saveRepeating($data);
注意我并没有真正改变你的循环中的任何内容,仅$this->data
代表$data
。但是将它作为一个单独的函数避免了beforeSave的任何奇怪的问题。哦,我添加了一个未设置的repeat变量来防止任何循环(如果你想将重复值保存到表中,则删除未设置)。您可以添加返回值以验证是否已保存每个事件,或处理异常等。
请记住恢复之前的beforeSave!