iT邦幫忙

0

PHP OOP 類似mail body有些微差距的class設計

各位大大好
小弟目前有一個簽核系統很常會使用到寄信功能
寄信功能是已經封裝好了
但是目前在設定body方面上小弟還是看不順眼

現在有三種類型信件: 1. 簽核結案通知 2. 下一關簽核人通知 3. 退簽通知
這三封信件的body都只有些微欄位呈現差別
目前撰寫方式很醜的是全都塞在主要class Sign的function中

public function sendSignMail($sign_title, $description, $sign_type, $sign_priority, $approver_dept_no, $created_user, $test = false)
{
    $topic = "系統簽核通知信";

    $body ="親愛的主管您好:<br><br>";
    $body .="系統有您需要簽核的單據,內容如下:<br><br>";
    $body .="標題:$sign_title<br><br>";
    $body .="說明:<br>$description<br><br>";
    $body .="簽核類別:".$sign_type."<br>";
    $body .="簽呈等級:".$sign_priority."<br>";
    $body .="應簽部門:$dep_name<br>";
    $body .="應簽人員:$first_signer_name<br>";
    $body .="送簽人員:$sender<br>";
    $body .="送簽時間:$now <br><br>";

    $body .="    *********************************************************<br>
        本信件由系統自動發送,請勿直接回覆信件!!<br>
        若您有系統作業相關問題,請電洽系統管理人員<br>
        *********************************************************";
    
    fn_sendmail(1, $this->to_mail, $topic, $body, 2, 1);
}

public function sendReturnMail($sign_title, $return_dep, $returner $created_user,$mail_return_reason, $test = false)
{
    $topic = "系統退簽通知信";

    $body = "親愛的經辦人您好:<br><br>";
    $body .="系統通知您有單據被退簽,內容如下:<br><br>";
    $body .="標題:$sign_title<br>";
    $body .="經辦人:$created_user<br>";
    $body .="退簽部門:$return_dep<br>";
    $body .="退簽人員:$returner<br>";
    $body .="退簽原因:<br>$mail_return_reason<br><br>";
    $body .="退簽時間:$now <br><br>";


    $body .="    *********************************************************<br>
        本信件由系統自動發送,請勿直接回覆信件!!<br>
        若您有系統作業相關問題,請電洽系統管理人員<br>
        *********************************************************";

    fn_sendmail(1, $this->to_mail, $topic, $body, 2, 1);
}

3種不同的就有三個function
如果今天要新增一個共通欄位,就要去三個function新增
小弟覺得應該有更好的方法去設定類似的body
目前是想建立一個mail的主class
裡面可能有topic和 body屬性
然後再創一個signMail class來繼承
再從裡面去拚
但這樣好像還是要寫3個function
只是換個檔案寫的意思就是???
小弟不知道以OOP的角度這樣規劃會不會比較有彈性
上來請教各位大大

看更多先前的討論...收起先前的討論...
在你想接觸OOP的同時,先去了解什麼是SOLID
然後了解清楚物件的屬性、成員、方法。
https://ithelp.ithome.com.tw/articles/10114633
https://ithelp.ithome.com.tw/articles/10114707
https://ithelp.ithome.com.tw/articles/10114761
https://ithelp.ithome.com.tw/articles/10114805
https://ithelp.ithome.com.tw/articles/10114871
https://ithelp.ithome.com.tw/articles/10115273
這些是我很久以前寫的文章了。
因為我後來跑去開發 iOS對PHP的著墨就沒有那麼多了。
而在我開發app走的是完全型態的物件導向語言,跟php這個「被閹割的物件導向」的腳本式語言不太一樣,如果換成我今天的立場來重寫這些文章,可能又會有不少想法了。
有些不同的想法
如果你想做的好看,是可以直接嵌套HTML在PHP中,在必要的欄位裡echo相關資料,會比串接字串好管理些,最最好的方法,還是做個html範本檔,寄之前讀進來,再以資料庫相應欄位資料代換進內容
st474ddr iT邦新手 2 級 ‧ 2021-08-05 11:40:41 檢舉
@Sam大大好 感謝您的回覆及分享
我覺得如果是照SOLID應該要多建class出來
把功能分割 單一化
但是我卻覺得好像沒有更好的方式去拼湊mail body
所以想說會不會是哪個流程可以再調整

@japhenchen大大 感謝回覆
您提供的想法是我沒想到的
我會好好思考看看
我在想,你應該是沒有使用任何框架(Framework)吧。
不然這些框架都自然會提供處理樣板( View Template)的機制。
我剛剛一時找不到我前幾年有更新最終一次板本的無附掛任何framework的樣板……
只有先找到前一個未修正版。你可以看看。
我要是找得到最終版再提供給你。
https://samdevelop.blogspot.com/2012/07/phpview.html?view=magazine
st474ddr iT邦新手 2 級 ‧ 2021-08-05 14:05:38 檢舉
@Sam大大 感謝回覆
目前這專案確實沒有使用框架哈哈
所以才想說要自己刻一個
自己刻框架?

我下巴到現在都還沒收回來
st474ddr iT邦新手 2 級 ‧ 2021-08-05 16:26:41 檢舉
@japhenchen 大大
不是框架啦
只是這簡單的mail template
https://ithelp.ithome.com.tw/questions/10188066
我找到了,原來就在it邦內的某個問答中。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-08-05 15:29:24

想建立一個mail的主class, 裡面可能有topic和 body屬性

fn_sendmail 就是了

我只想得到用 array 產生 body 的字串如下
加滅看看...

<?php
$arr=array(
	"親愛的經辦人您好:<br>",
	"系統通知您有單據被退簽,內容如下:<br>",
	"標題:$sign_title",
	"經辦人:$created_user",
	"退簽部門:$return_dep",
	"退簽人員:$returner",
	"退簽原因:<br>$mail_return_reason<br>",
	"退簽時間:$now <br>"
	);

print(genBody($arr));

function genBody($parr) {
	$crlf = "<br>\n";
	$body="";
	foreach ($parr as $key => $value) {
		$body .= "{$value}$crlf";
	}
	return $body;
}
?>
st474ddr iT邦新手 2 級 ‧ 2021-08-05 16:35:41 檢舉

謝謝大大的回覆
這樣就是變成三個array丟入genBody
我也是有想過這種做法
只是我在想有沒有一種類似

$mail = new Mail();
$mail->topic="系統退簽通知信";
$mail->body->sign_title = $sign_title;
$mail->body->created_user = $created_user;
....

這種方式XDD

我要發表回答

立即登入回答