禅道默认在BUG和任务 修改,指派 的时候会发送邮件给默认的接收人
但是其他模块就没有对应的开发配置。如果有发信的需求,就要手动修改代码来进行开发了
此次接到的需求是当上传新文档的时候 给指定人发信,这里指定人也是固定的,不需要额外选择
首先参考默认的测试发信页面
(本项目禅道是搭建在windows平台上的)
前台页面的路径在 \zentao\module\mail\view\test.html.php 没什么可说的,传了一个收件人到后台
后台处理的文件路径是\zentao\module\mail\control.php 找到public function test() 这个方法
这个方法前面大段都是判断服务器有没有权限 有没有开启fs读写
真正核心的是
$this->mail->send($this->post->to, $this->lang->mail->subject, $this->lang->mail->content, "", true);
传的5个参数是 发给谁,主题 ,正文 ,抄送, 是否发给自己。禅道发信默认是不发给自己的
我们再参考BUG模块发信的代码 在\zentao\module\bug\control.php里面
最后的核心发送代码 还是一行
$this->loadModel('mail')->send($toList, 'BUG #'. $bug->id . ' ' . $bug->title . ' - ' . $productName, $mailContent, $ccList);
和mail唯一不同的就是loadModel('mail')->send 和 mail->send 这一点了
那接下来 就可以复用这个地方的代码了
在文档的control.php里 建一个自己的send方法,这里我取名叫sendmail_doc,表明是文档发信
public function sendmail_doc()
{
/* 设置发送人和抄送人. 是禅道系统里有的用户*/
$toList = 'zhc';
$ccList = 'user1,user2'
/* 邮件标题和正文. */
$mailTitle ='有人上传了文件';
$mailContent = '有人上传了文件,请在系统中查看';
/*发送核心语句 */
$this->loadModel('mail')->send($toList, $mailTitle, $mailContent, $ccList,true);
}
ok 然后在创建的地方调用就好了
创建文档的前端页面在\zentao\module\doc\view\create.html.php里面 ,提交之后调用create()方法
只要在create()里面的post提交段插入即可,找到if(!empty($_POST))后面的内容
public function create($libID, $moduleID = 0, $productID = 0, $projectID = 0, $from = 'doc')
{
$projectID = (int)$projectID;
if(!empty($_POST))
{
$docResult = $this->doc->create();
/*就在插入表之后发送,对没错 就是这里*/
$this->sendmail_doc();
echo js::alert('您创建了文档,邮件已发送');
if(!$docResult or dao::isError()) die(js::error(dao::getError()));
$docID = $docResult['id'];
if($docResult['status'] == 'exists')
{
echo js::alert(sprintf($this->lang->duplicate, $this->lang->doc->common));
die(js::locate($this->createLink('doc', 'view', "docID=$docID"), 'parent'));
}
$this->action->create('doc', $docID, 'Created');
if($from == 'product') $link = $this->createLink('product', 'doc', "productID={$this->post->product}");
if($from == 'project') $link = $this->createLink('project', 'doc', "projectID={$this->post->project}");
if($from == 'doc')
{
$productID = intval($this->post->product);
$projectID = intval($this->post->project);
$vars = "libID=$libID&moduleID={$this->post->module}&productID=$productID&projectID=$projectID";
$link = $this->createLink('doc', 'browse', $vars);
}
die(js::locate($link, 'parent'));
}
$this->loadModel('product');
$this->loadModel('project');
....
这样在创建文档之后就可以发送了
但是 ,这样有个问题,发送的内容是固定的,我们需要带入文档信息 比如标题什么的
我们现在对这个sendmail_doc()进行改造 ,需要额外传一个参数进去
$this->sendmail_doc($docResult);
echo js::alert('您创建了文档,邮件已发送');
传入之后 在sendmail_doc()处增加处理的逻辑
public function sendmail_doc($docResult)
{
/* 设置发送人和抄送人. */
$toList = 'zhc';
$ccList = 'user1,user2';
$docID = $docResult['id'];
$doc = $this->doc->getById($docID, true);
/* 设置邮件标题和正文. */
$mailTitle = $this->app->user->account.'新上传了文件:'.$doc->title;
$mailContent = $doc->addedBy.'在'.$doc->addedDate.'上传了一份文件 , 文件名为:'.$doc->title.'请注意查看';
/发送/
$this->loadModel('mail')->send($toList, $mailTitle, $mailContent, $ccList,true);
}
$this->app->user->account 和 $doc->addedBy 都是可以作为发送人
$doc->addedBy是数据表doc里的addedBy字段
OK 大功告成。到这里 一个发信模块就加好了