在Cakephp中,我可以在模型中使用afterSave()来执行其他任务,具体取决于刚刚保存的内容吗?

时间:2012-06-12 13:38:03

标签: cakephp

我有两个模型:绘图有许多面板和面板属于绘图。每次保存面板时,我都想检查它是否是要添加到图形中的第三个面板。如果是,我想将三个面板合并为一个新的png文件,并将png的文件名和路径保存到Drawing表中。

class Drawing extends AppModel {
  public $name = 'Drawing';
  public $hasMany = array(
    'Panel' => array(
        'className' => 'Panel',
        'dependent' => true,
        'fields' => array('id', 'filepath', 'filename', 'placement')
        )
  );
}

class Panel extends AppModel {
  public $name = 'Panel';
  public $belongsTo = array(
    'Drawing'=>array(
        'className'=>'Drawing',
        'foreignKey'=>'drawing_id',
        'counterCache' => true
        )
    );
}

由于我在Panel模型中将counterCache设置为true,因此我在图纸表中使用panel_count跟踪面板 - 我可以检查何时有3个面板。我认为最好的方法是使用afterSave()回调。这样,我可以检查现在是否有三个面板,如果有,我可以更新我想要的任何内容。 (我的控制器会阻止用户在有三个时添加新面板)。但是,我不认为下面的代码有效 - 它会阻止我的应用程序的其他部分运行,如果我删除了afterSave()函数,一切都会再次运行。如何在Drawing模型中检查panel_count?有更好的方法吗?

// Inside of the Drawing model... 
public function afterSave($created){
  if ($this->data[panel_count] == 3){
    // create a new image by merging the three panel images together
    // add the filename and path of the new image to the database
  }
}

1 个答案:

答案 0 :(得分:0)

创建一个新的模型方法来执行该功能,并使用该方法从控制器中保存。原因是Drawing.panel_count属性的更改(您必须更新Drawing记录,这会创建一个afterSave循环)。

我通常会避免任何数据修改的回调(特别是在同一个模型中),因为它们每次都会运行,有时我只是想在没有额外修改的情况下保存。将一段代码从一个方法移动到一个afterSave回调比以后更容易。