0

Events/add に繰り返し機能を追加しようとしています。
そのため、月曜日から金曜日 (またはそれ以上) まで同じイベントがある場合、ユーザーは 1 つずつ追加するのではなく、1 回の追加ですべてを追加できます。

Events/add.ctp に次の入力フィールドを追加しました。

$this->Form->input('repeat', array('type' => 'number'));

do で比較する - beforeSave() の 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->dataください$data。しかし、それを別の関数として持つことで、beforeSave に関する奇妙な問題を回避できます。ああ、ループを防ぐために、repeat 変数に unset を追加しました (ただし、repeat 値をテーブルに保存する場合は、その unset を削除してください)。戻り値を追加して、すべてのイベントが保存されたことを検証したり、例外を処理したりできます。

beforeSave を以前の状態に戻すことを忘れないでください。

于 2013-05-27T13:49:07.340 に答える