在偷懶了一個多月之後,俺終於開始正式做TeamToy的郵件提醒系統啦!
最初的想法是,做一個自動腳本,讓其每個週五下班的時候將“本週報告”發送到自己的和領導的郵箱當中;不過在研究了半天之後,發現比預想的要複雜,決定先從手動版開始。在各種搜索資料、偷懶、詢問Easy大和求助不乖師父之後,終於實現了最初設想“自動發送報告爲郵件”的“發送報告爲郵件”功能了!(當然言下之意就是“自動”的部分還沒實現……這個再說吧)
目的:在“報告”頁面中添加一個按鈕,點擊之後,自動將當前顯示的報告(div#report_list)部分內容發送到指定郵箱。
Hacking步驟:
1、先自行讀一遍SAE中的郵件函數,SAEmail相關的文檔:
http://apidoc.sinaapp.com/sae/SaeMail.html
2、發送郵件屬於基礎功能,在TeamToy當中都寫在 /code/function/core.function.php 當中。從hacking的思路而言,總是要先看看有沒有現成發送郵件的函數,所以先在core.function.php當中搜索 SAEmail 字段(當然你也可以在全部文檔中搜索),找到了一個 send_notice 函數。
讀了一下這個函數,發現跟咱要的功能相差太多,所以決定新加一個函數。
在下面新起一個:
function just_send_email( $to, $subject, $content ) { $to = $to; $subject = $subject; $content = $content; if( c('smtp') ) { $m = new SaeMail(); $m->quickSend( $to , $subject , strip_tags($content) , c('smtp_user') , c('smtp_password') ); if ($m === false) var_dump($mail->errno(), $mail->errmsg()); } }
3、進入 /code/mod/report.class.php ,在下面添加一個函數:
function mailreport() { /*這些變量可以先隨便填幾個string做測試,逐漸再把功能加入*/ $to = '[email protected]'; $subject = z(t(v('subject'))); $content = t(v('content')); just_send_email( $to, $subject, $content ); return render( $content , 'mail' ); }
上面最後return的內容是方便讓人做測試的。render的定義通過搜索 function render 可以定位到core.function.php,是給輸出的內容套套子用的,TeamToy默認只提供了default和ajax兩種模板,對郵件內容而言都太臃腫了,所以咱新建一個mail模板:
在 /code/view/layout/ 下面新建一個文件夾 mail ,在 mail下建一個文件 index.tpl.html ,裏面的內容寫這個就行:
<?=$data?>
回頭可以再加點css,現在先這麼放着就行。
4、進入 /code/view/layout/default/main/report/index.tpl.html ,加入觸發函數的入口。
研究這部分花了我很多時間,總算是七零八碎拼出來了一個解決辦法。
首先自然是在頁面里加一個入口,我寫在了原頁面“打印”功能的右邊:
<a href="javascript:do_print('report_list')">打印</a> | <a href="?m=report&a=mailreport">發送郵件</a>
之後的問題,就是如何將這個頁面裏div#report_list的內容傳遞到發送郵件的php函數當中去的問題。
(寫到這裏,發現左邊的javascript:do_print('report_list')已經是現成的內容抓取實現,如果能設法用類似的功能傳值,或者用JavaScript直接發送郵件出去,就不用我下面的這個實現了。)
從js傳值到php需要動用ajax的方式。TeamToy採用的js庫是mootools,與傳值有關的文檔可在這裏查看:
http://mootools.net/docs/core/Request/Request
當然,我這種菜鳥看了一遍文檔之後還是沒看懂,所以搜了一個demo出來:
http://www.knowledgesutra.com/forums/topic/64355-mootools-12-ajax-request/
簡單來說,最後的實現就是:
先在頁首添加一段js:
<script language="javascript"> window.addEvent('domready', function() { $('runAjax').addEvent('click', function(event) { event.stop(); var req = new Request({ method: 'post', url: $('runAjax').get('href'), data: { 'content' : $('report_list').get('html'), 'subject' : $('report_subject').get('html') }, onRequest: function() { }, onComplete: function(response) { alert('mail sent:' + response); } }).send(); $('runAjax').removeEvent('click'); }); }); </script>
然後在剛纔寫的那個“發送郵件”功能上,修改成這樣:
<a id='runAjax' href="?m=report&a=mailreport">發送郵件</a>
再就是report_subject這個id原本是沒有的,咱給它加上:
<h4 id="report_subject"> <?php $uid = intval(v('uid')); if( $uid < 1): ?> <?=c('team_name')?> ……
ok,commit上去試試看吧!
最後就是一些css的調整,以及收信人的設置,這個就不用我多寫啦。
通過Ajax的方式來發送郵件的問題就在於——無法自動發送-。-
所以自動發送要如何弄,俺還要再多想想……