菜鳥學編程:給TeamToy添加一鍵發送週報至領導郵箱的功能

在偷懶了一個多月之後,俺終於開始正式做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的方式來發送郵件的問題就在於——無法自動發送-。-

所以自動發送要如何弄,俺還要再多想想……

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章