cakephp避免多次回调

时间:2013-11-08 12:46:02

标签: php cakephp cakephp-2.4

假设我有一个User模型hasMany Items(当然还有Item belongsTo User

每次在我的应用程序中的任何地方修改Item我希望将电子邮件发送给他的用户(或其用户)

所以在我的Item模型中我写了类似

的东西
public function beforeSave($options = array())
{
    // if data is modified find User and send him email
}

但是,当我在我的行动中同时编辑多个项目时(即在foreach循环中),然后发送了几封电子邮件,但我只想要一封电子邮件,或者每个参与更新的用户只需一封电子邮件

我怎样才能做到这一点?

也许使用cakephp Event系统?

2 个答案:

答案 0 :(得分:0)

您可以设置一个额外的变量:

public $isMultiple = false;
public function beforeSave($options = array())
{
    if(!$this->isMultiple) {
        $this->isMultiple = true;
        // if data is modified find User and send him email
    }
}

答案 1 :(得分:0)

首先,不要从数据模型中发送电子邮件。电子邮件活动非常不稳定,您应该尽可能保持数据模型代码的稳定性。相反,当您需要发送电子邮件时,请使用组件并在组件上调用方法。

听起来您想报告已完成的交易,而不是单独的记录编辑。处理此问题的一种方法是在用户模型中设置上次发送电子邮件时的日期时间戳。然后,您可以使用该日期时间戳来查找已修改的项记录,并通知这些更改。

在您的控制器中,您只需根据需要修改项目。

public function action()
{
    foreach($record in $records)
    {
        ......
        $this->Item->save(....);
    }

    $this->MyEmailComponent->notify($user_id);
}

然后,在您的电子邮件组件中,您将查询自上次发送电子邮件以来哪些项目已更改的项目模型。

public function notify($user_id)
{
    $this->User->id = $user_id;
    $last_email = $this->User->field('emailed');

    $updated_items = $this->Item->find('all',array(
        'conditions'=>array('Item.updated >'=>$last_email)
    ));

    // send email about those items

    $this->User->saveField('emailed',date('Y-m-d h:i:s'));
}