0

updateAll() で beforeSave() および afterSave() コールバックをトリガーする必要があります。IDフィールドを更新する必要があるため、updateAll()を使用します..(編集可能なIDについては「間違っている」ことはわかっていましたが、使用したこのデータベースはすでにそのように面倒です)。

私がする必要があるのは、save() と同じように、updateAll() をトリガーして beforeSave() と afterSave() を起動することです。

これは CakePHP 1.3 の updateAll() のハックです。

function updateAll($fields, $conditions = true) {
    $args = func_get_args();
    $output = call_user_func_array(array('parent', 'updateAll'), $args);
    if ($output) {
        $created = false;
        $options = array();
        $this->Behaviors->trigger($this, 'afterSave', array(
           $created,
           $options,
       ));

       $this->afterSave($created);
       $this->_clearCache();
       return true;
    }
    return false;
}

次に、これはCakePHP 2.3で調整したコードです

function updateAll($fields, $conditions = true) {
    $args = func_get_args();
    $output = call_user_func_array(array('parent', 'updateAll'), $args);
    if ($output) {
       $created = false;
       $options = array();
       $event = new CakeEvent('Model.afterSave', $this, array($created, $options));
       $this->getEventManager()->dispatch($event);

       $this->afterSave($created);
       $this->_clearCache();
       return true;
    }
    return false;
}

問題は、updateAll で beforeSave() を呼び出したい場合はどうすればよいかということです。

4

1 に答える 1

0

私が持っていたなんてばかげた質問。

コードは次のとおりです。

function updateAll($fields, $conditions = true) {

    $options = array();
    $event = new CakeEvent('Model.beforeSave', $this, array($options) );
    list($event->break, $event->breakOn) = array(true, array(false, null));
    $this->getEventManager()->dispatch($event);

    $args = func_get_args();
    $output = call_user_func_array(array('parent', 'updateAll'), $args);
    if ($output) {
      $created = false;
      $options = array();
      $event = new CakeEvent('Model.afterSave', $this, array($created, $options));
      $this->getEventManager()->dispatch($event);

      $this->afterSave($created);
      $this->_clearCache();
      return true;
   }
   return false;
}
于 2013-04-08T12:47:15.000 に答える