看板 PHP 關於我們 聯絡資訊
各位版友大家晚安。 小弟呢!長久以來一直接到很多學生的專題疑難。 他們常常都丟程式碼給我看。 但我每次看到都很吐血。 因為......html和php混在一起實在是太難分難解了。 在眾多的技術都討論了MVC的架構理論。 小弟現在也算是codeigniter的重度患者。 但問題在於,很多時候,又不能馬上叫那些學生立刻去學smarty樣版引擎。 或是立刻上手像是zend framework、cakephp、symfony、codeigniter這些東西。 然後大家就陷入了會寫物件的用framework很高興,不會寫的就純寫肉肉長的php 逐步的虐待自己又無法很順利的切割view和程式。 昨天又是一個專題發問過來,我看了一個不大的50行的程式。 其中echo就佔了快要一半。 然而半年以前,曾經寫過一個樣版載入架構,但是他有幾個大缺點。 載入變數定義方式不佳、採用變數置換內容、無法掛入php程式碼……這些問題。 自從用了ci之後,我就不斷的一直思考關於view的問題。 有沒有什麼是可以做純view載入樣板的方法? ci的動作方式一直讓我擁入想法,卻一直沒有機會實現他。 但是今天卻讓我有機會去實現這麼一個東西。 當然可能有很多高手有寫出類似或根本就是的東西。 不管怎麼說,這樣一個樣板載入器總是能解決很多想把程式和view做最基礎切割的 設計人員,一個不錯的載入器程式。 底下將會公開這個程式的源碼,當然因為是第一版本的東西。 所以自然而然有我不知道可能的bug也不一定。 或者各位覺得這樣的東西應該要加上怎麼樣的功能或是怎麼樣的限制也可以提出討論。 能讓他的功能更加完整也是相當不錯的。 如果有人會覺得你這就是有參考ci的一些方法,這我不否認的確是有。 但無論如何,總是把他輕巧的參考出來並使用。 所以並非全然是超抄使用。各位如果有看過ci和我這隻程式就明白了。 檔名:template_engine.php <?php class template_engine{ function view($source_page,$variable = '',$return = FALSE){ $variable = $this->_check_array($variable); foreach($variable as $key => $value){ $$key = $value; } if($return){ ob_start(); eval("?>".file_get_contents($source_page.".php")."<?"); $buffer_tmp = ob_get_contents(); ob_end_clean(); return $buffer_tmp; } else{ eval("?>".file_get_contents($source_page.".php")."<?"); } } function _check_array($variable){ if($variable == null) return array(); if(!is_array($variable)){ echo 'This variable is not array'; exit(); } return $variable; } } ?> 使用方法:(會用ci或是一般framework的朋友就一定會用的啦。) <?php require('template_engine.php'); $load = new template_engine; $frame['topbanner'] = $load->view('topbanner','',TRUE); $frame['leftmenu'] = $load->view('leftmenu','',TRUE); $frame['body'] = $load->view('body','',TRUE); $load->view('mypages',$frame); ?> 有用過framework應該覺得相當眼熟。是的,他該當就是如此的用法了。 $load->view()中有三個參數 第一個參數是載入的樣版檔名,副檔名強制為php,而這邊只需要輸入主檔名。 第二個參數是陣列,你傳入的陣列鍵名在樣版中會被解成變數。 舉例來說: $data['name'] = 'sam'; $load->view('body',$data); 則在你的body.php中,你要使用$data['name'],他會變成$name。 所以你的body.php中就是直接寫<?=$name?>他就會顯示$data['name']的內容。 第三個參數是決定顯示還是傳回內容。 如果輸入TRUE的話是不顯示,將內容傳回至變數。 如果輸入FALSE或是不輸入的話,則會變成將內容顯示出來。 再來要說明的就是,在你載入的樣版中,所以PHP的程式碼都是可執行的。 但無論如何我們還是遵從FRAMEWORK的一些不成文的規範如下: 1.使用<?=$name?>而不要使用<?php echo $name?> 2.條件式、迴圈、判斷式中的HTML輸出請讓他成為純HTML而不使用echo也不用大刮號 來列示範圍如下: 使用<?php if(條件):?>及<?php else:?>及<?php endif?> 而不使用<?php if(條件){.....}else{}?> 使用<?php while(條件):?>及<?php endwhile?> 而不使用<?php while(條件){.....}?> 使用<?php for(迴圈):?>及<?php endfor?> 而不使用<?php for(迴圈){.....}?> 使用<?php foreach(陣列方法):?>及<?php endforeach?> 而不使用<?php foreach(陣列方法){......}?> 其他一些遵從framework使用的架構規範都是比較好的做法。 目前這個載入器還沒有很深入的去寫比較多的php程式碼在內。 畢竟是純把他當樣版來使用(他也應當必須是當樣版載入來使用)。 若然有bug或是問題還煩請大家回報。 這樣我可以讓這個程式更加的完善。 有什麼需要追加的功能或不錯的意見也請大家能多多提供給我。 總之我是覺得這對很多初探php和html分開作頁的學習者。 這個程式提供了不錯而且有效的解決方案。 總之,我也是盡力在解決這樣的問題上。 幫助需要的人,也透過這樣的模式,讓大家能早一點上手framework。 這是一個輕巧的程式,卻也是我花了很長的時間一直在思考view這件事之後。 所生產出的第一個我覺得真正有幫助到人的東西。 除了鼓勵為動力,也尚祈批評,以供改進。 如要整個程式含範例檔,請來信: [email protected][email protected] (因為gmail有時會誤判垃圾信的關係,可能的話兩個信箱都寄) 有關推文提到的short_tag一段,我將連結置於此: http://ci.wuboy.twbbs.org/user_guide/general/alternative_php.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.130.24
superpai:題外話不過CI立即上手是沒問題的XD 08/28 23:30
shadowjohn:推薦這篇文章~ 08/29 00:15
donaldknuth:推+1 08/29 06:29
jami520:推 08/29 10:35
ileadu:說真的 最近玩ci 覺得ci的view要一直echo 太不乾淨了.. 08/29 12:34
ileadu:蝦米? short_tag不是儘量不要用了? 怎麼會<?=$name?> 08/29 12:38
ileadu:我建議還是學smarty比較好..不難學 只要知道塞變數的方法 08/29 12:45
tkdmaf:完全不理解樓上說的CI的VIEW要一直echo是怎麼回事? 08/29 12:49
tkdmaf:如果說是指變數要echo,事實上ci也有提供純template的用法 08/29 12:51
tkdmaf:另外,short_tag儘量別用的理由是? 08/29 12:52
tkdmaf:而且,使用ci的存在,可不只是為了view這件事吧。 08/29 12:53
tkdmaf:再者,對初探樣版的人而言,輕巧好用我覺得比較重要。 08/29 12:53
tkdmaf:上面這篇在我使用ci後真是於我心有戚戚焉...... 08/29 12:57
ileadu:php官方建議別用short tag 但我剛剛發現ci會自動打開@@ 08/29 12:59
ileadu:http://ppt.cc/6;vF 08/29 13:00
tkdmaf:官方叫你別用你就別用?你怎麼知道官方說的一定就對? 08/29 13:00
tkdmaf:他既然設計有這個機制,如果不該用,他應該要拿掉。 08/29 13:04
tkdmaf:另外你的連結明明就有中文版,還是本版的某大大翻譯的。 08/29 13:04
tkdmaf:因為我不會用PTT的短網址,我用編輯補在我的本文。 08/29 13:05
※ 編輯: tkdmaf 來自: 59.104.130.24 (08/29 13:06)
tkdmaf:這樣的設計,就是為了減少學習使用上的時間和難題。 08/29 13:08
ileadu:tk 你有注意到 專案還沒進行到一半,就把 Smarty 的樣版語 08/29 13:11
ileadu:法清掉了,直接用 PHP 語法。只用 Smarty 的 cache 功能。 08/29 13:11
ileadu:代表 這篇文章的作法 用smarty 只用了一半 就放棄了.. 08/29 13:11
ileadu:這樣有資格對smarty做評語? 08/29 13:12
ileadu:代表 這篇文章的作者 補正上上一行的錯字 08/29 13:12
ileadu:樣版引擎所帶來的好處是後續的維護動作 可是他根本就還沒 08/29 13:15
ileadu:做到後續維護 就把smarty丟掉了.. 這樣行嗎? 08/29 13:16
ileadu:我當然知道直接用php來做 效能較好 問題是在後續維護與乾淨 08/29 13:16
ileadu:smarty本來就是先苦後甘 他竟然沒撐過來就批評smarty 08/29 13:18
ileadu:當然 要用smarty是得多學一種表示法是比較麻煩.. 08/29 13:19
ileadu:那我如果也為了效能 批評根本就不用用framework 如ci 08/29 13:20
ileadu:你也能認同? 效能必要的犧牲 換取後取維護才是重點好嗎? 08/29 13:21
tkdmaf:所以用smarty就會很好維護? 08/29 13:24
tkdmaf:把你的樣版和我的樣版丟給10個來維護或編寫。 08/29 13:26
tkdmaf:你認為他們比較喜歡維護smarty還是純php? 08/29 13:26
ileadu:不會smarty的 會喜歡php 會了就會想用smarty 08/29 13:28
ileadu:如果smarty沒有存在的必要 那smarty幹嘛繼續更新成3? 08/29 13:43
ileadu:當然要不要使用smarty 並非必要... 我不是指一定要用他 08/29 13:44
ileadu:很多php framework都建議不該在選用其他的樣板引擎 直接用 08/29 13:55
ileadu:php的就好了 也不難理解.. 因為會增加學習障礙... 08/29 13:56
ileadu:可是在我最近使用ci 的心得 他的form helper、html helper 08/29 13:57
ileadu:根本就是在做跟smarty一樣的事情 是reinvent a wheel ? 08/29 13:57
tkdmaf:你要不要專文回一篇? 08/29 14:08
tkdmaf:雖然我覺得你的想法和我想做的事情及對象是不同的。 08/29 14:09
ileadu:你好像又再寫了一次ci 的view 看上面連結 最下面的範例.. 08/29 14:45
ileadu:因為你說了 我的想法與你想做的事與對象不同 我又再仔細看 08/29 14:46
ileadu:你文章的內容 看是想表達什麼 怎麼會與我不同 08/29 14:47
ileadu:或許你想看中文的 上面連結是中文的 看該頁最下面 08/29 14:48
tkdmaf:我想一開頭我就講過,我是ci的重度患者。 08/29 14:50
ileadu:所以?你這篇文章的重點是在 08/29 14:51
tkdmaf:我想做的事與對象,並不是你。 08/29 14:51
ileadu:$frame['body'] = $load->view('body','',TRUE); 08/29 14:51
ileadu:$load->view('mypages',$frame); 08/29 14:51
ileadu:這個特殊作法? 08/29 14:51
tkdmaf:而是尚未接觸過樣板或是framework的設計人員。 08/29 14:51
tkdmaf:我也說了,會framework或是會ci的人。 08/29 14:52
tkdmaf:而清楚的明白我這個就是VIEW。他不會是別的東西。 08/29 14:52
tkdmaf:你要說我就只是把VIEW切出來給別人用嘛!那我完全不否認。 08/29 14:52
tkdmaf:他的輕巧,就純粹因為:他就是VIEW。不是別的東西。 08/29 14:53
ileadu:喔.. 原來這不是開發給ci用的 是給完全沒接觸過framework的 08/29 14:53
tkdmaf:不喜歡,你可以不要用。我也沒叫別人不要用SMARTY! 08/29 14:53
ileadu:沒 我只是覺得你應該做重點上色..適用怎樣的人 08/29 14:54
ileadu:簡單的來說 你是把ci的view割出來獨立使用.. 這樣講就好啦 08/29 14:56
tkdmaf:所以是誤會嗎? 08/29 14:57
ileadu:恩 文章太長 挑重點看 只看到像ci的部分 08/29 14:59
tkdmaf:不是每個人一開始都能接受SMARTY或是ci 08/29 15:01
tkdmaf:這個東西就只是為了多少讓他們先了解程式和樣板的可分離性 08/29 15:01
tkdmaf:另一方面就只是我自己在研究VIEW的做法。 08/29 15:07
pthuang:好啦 搞了半天只是因為誤會嘛....別吵別吵 ^^"a 08/30 00:07
knockout:建議不要教學生 framework 或是 smarty 08/31 11:36
knockout:上面有比較簡單的做法 ~ 學生要學的是基礎 08/31 11:37
tkdmaf:我是覺得如果對物件導向有一定的了解了。 08/31 17:36
tkdmaf:要學framework就沒什麼問題。 08/31 17:37
tkdmaf:假設我教學生整個連物件都教完的話。我會馬上叫他們用CI。 08/31 17:39