0

我正在尝试向我的事件/添加添加重复功能。
因此,如果我从星期一到星期五(甚至更多天)有相同的事件,用户可以在一次添加中添加所有内容,而不是一个一个添加。

我在 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 来处理数据,但显然我无法在保存之前保存数据......任何提示?

4

1 回答 1

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->datafor $data。但是将它作为一个单独的函数可以避免 beforeSave 出现任何奇怪的问题。哦,我在重复变量中添加了一个未设置以防止任何循环(如果您想将重复值保存到表中,请删除该未设置)。您可以添加一个返回值来验证每个事件是否已保存,或处理异常等。

记得将 beforeSave 原样返回!

于 2013-05-27T13:49:07.340 回答