禅道默认在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 大功告成。到这里 一个发信模块就加好了