将条目与单个添加相乘

时间:2013-05-24 10:13:28

标签: cakephp-2.0 repeat

我正在尝试为我的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来处理添加操作后的数据,但显然我无法在保存之前保存数据...任何提示?

1 个答案:

答案 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!