Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cakephp避免多次回调_Php_Cakephp_Cakephp 2.4 - Fatal编程技术网

cakephp避免多次回调

cakephp避免多次回调,php,cakephp,cakephp-2.4,Php,Cakephp,Cakephp 2.4,假设我有一个用户模型,他有许多项目(当然,项目属于用户) 每次在我的应用程序中的任何位置修改项时,我都希望向其用户(或其用户)发送电子邮件 所以在我的项目模型中,我写了 public function beforeSave($options = array()) { // if data is modified find User and send him email } 但是当我在操作中同时编辑多个项目时(即在foreach循环中),会发送多封电子邮件,但我只需要一封电子邮件,或者为

假设我有一个
用户
模型,他
有许多
项目
(当然,
项目
属于
用户

每次在我的应用程序中的任何位置修改
项时,我都希望向其用户(或其用户)发送电子邮件

所以在我的项目模型中,我写了

public function beforeSave($options = array())
{
    // if data is modified find User and send him email
}
但是当我在操作中同时编辑多个项目时(即在foreach循环中),会发送多封电子邮件,但我只需要一封电子邮件,或者为参与更新的每个用户发送一封电子邮件

我怎样才能做到这一点


可能使用cakephp事件系统?

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

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

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

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

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

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'));
}

我编辑。在我的一个操作中,我必须循环浏览这些项目并逐个保存它们。这样会触发许多回调。如果使用
saveMany
,您可以选择将回调设置为false。我确实希望触发回调。如果我使用saveMany,beforeSave回调的触发次数是项目编号的一倍还是与项目编号相同?(顺便说一句,我不能使用saveMany,因为我必须执行循环项目的逻辑)我设法删除了我的foreach cicle并使用了saveMany调用。但是beforeSave仍然被调用两次如果我保存两项,我认为我们不能使用
saveMany
将回调设置为false,使用
saveField
可以将回调设置为false解决方案有效,但是我有许多修改项目的操作,所以我需要使用回调:我不想在每个操作结束时重复
MyEmailComponent->notify
代码。如果我添加了另一个动作,我不想记得添加行。我想这就是回调的目的