0

假设我有一个User模型hasMany ItemsItem belongsTo User当然还有 )

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

所以在我的项目模型中,我写了类似的东西

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

但是,当我在我的操作中同时编辑多个项目(即在 foreach 循环中)时,会发送几封电子邮件,但我只想要一封电子邮件,或者为参与更新的每个用户发送一封电子邮件。

我怎样才能做到这一点?

也许使用 cakephp 事件系统?

4

2 回答 2

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'));
}
于 2013-11-08T14:42:53.393 回答
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
    }
}
于 2013-11-08T14:25:39.450 回答