[分享] 純view的樣版載入器 1.0

看板PHP作者 (皮皮快跑)時間14年前 (2010/08/28 22:52), 編輯推噓5(5073)
留言78則, 8人參與, 最新討論串1/1
各位版友大家晚安。 小弟呢!長久以來一直接到很多學生的專題疑難。 他們常常都丟程式碼給我看。 但我每次看到都很吐血。 因為......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這件事之後。 所生產出的第一個我覺得真正有幫助到人的東西。 除了鼓勵為動力,也尚祈批評,以供改進。 如要整個程式含範例檔,請來信: tkdmaf@gmail.com 或 sam@hurricanesoft.com.tw (因為gmail有時會誤判垃圾信的關係,可能的話兩個信箱都寄) 有關推文提到的short_tag一段,我將連結置於此: http://ci.wuboy.twbbs.org/user_guide/general/alternative_php.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.130.24

08/28 23:30, , 1F
題外話不過CI立即上手是沒問題的XD
08/28 23:30, 1F

08/29 00:15, , 2F
推薦這篇文章~
08/29 00:15, 2F

08/29 06:29, , 3F
推+1
08/29 06:29, 3F

08/29 10:35, , 4F
08/29 10:35, 4F

08/29 12:34, , 5F
說真的 最近玩ci 覺得ci的view要一直echo 太不乾淨了..
08/29 12:34, 5F

08/29 12:38, , 6F
蝦米? short_tag不是儘量不要用了? 怎麼會<?=$name?>
08/29 12:38, 6F

08/29 12:45, , 7F
我建議還是學smarty比較好..不難學 只要知道塞變數的方法
08/29 12:45, 7F

08/29 12:49, , 8F
完全不理解樓上說的CI的VIEW要一直echo是怎麼回事?
08/29 12:49, 8F

08/29 12:51, , 9F
如果說是指變數要echo,事實上ci也有提供純template的用法
08/29 12:51, 9F

08/29 12:52, , 10F
另外,short_tag儘量別用的理由是?
08/29 12:52, 10F

08/29 12:53, , 11F
而且,使用ci的存在,可不只是為了view這件事吧。
08/29 12:53, 11F

08/29 12:53, , 12F
再者,對初探樣版的人而言,輕巧好用我覺得比較重要。
08/29 12:53, 12F

08/29 12:57, , 14F
上面這篇在我使用ci後真是於我心有戚戚焉......
08/29 12:57, 14F

08/29 12:59, , 15F
php官方建議別用short tag 但我剛剛發現ci會自動打開@@
08/29 12:59, 15F

08/29 13:00, , 16F
08/29 13:00, 16F

08/29 13:00, , 17F
官方叫你別用你就別用?你怎麼知道官方說的一定就對?
08/29 13:00, 17F

08/29 13:04, , 18F
他既然設計有這個機制,如果不該用,他應該要拿掉。
08/29 13:04, 18F

08/29 13:04, , 19F
另外你的連結明明就有中文版,還是本版的某大大翻譯的。
08/29 13:04, 19F

08/29 13:05, , 20F
因為我不會用PTT的短網址,我用編輯補在我的本文。
08/29 13:05, 20F
※ 編輯: tkdmaf 來自: 59.104.130.24 (08/29 13:06)

08/29 13:08, , 21F
這樣的設計,就是為了減少學習使用上的時間和難題。
08/29 13:08, 21F

08/29 13:11, , 22F
tk 你有注意到 專案還沒進行到一半,就把 Smarty 的樣版語
08/29 13:11, 22F

08/29 13:11, , 23F
法清掉了,直接用 PHP 語法。只用 Smarty 的 cache 功能。
08/29 13:11, 23F

08/29 13:11, , 24F
代表 這篇文章的作法 用smarty 只用了一半 就放棄了..
08/29 13:11, 24F

08/29 13:12, , 25F
這樣有資格對smarty做評語?
08/29 13:12, 25F

08/29 13:12, , 26F
代表 這篇文章的作者 補正上上一行的錯字
08/29 13:12, 26F

08/29 13:15, , 27F
樣版引擎所帶來的好處是後續的維護動作 可是他根本就還沒
08/29 13:15, 27F

08/29 13:16, , 28F
做到後續維護 就把smarty丟掉了.. 這樣行嗎?
08/29 13:16, 28F

08/29 13:16, , 29F
我當然知道直接用php來做 效能較好 問題是在後續維護與乾淨
08/29 13:16, 29F

08/29 13:18, , 30F
smarty本來就是先苦後甘 他竟然沒撐過來就批評smarty
08/29 13:18, 30F

08/29 13:19, , 31F
當然 要用smarty是得多學一種表示法是比較麻煩..
08/29 13:19, 31F

08/29 13:20, , 32F
那我如果也為了效能 批評根本就不用用framework 如ci
08/29 13:20, 32F

08/29 13:21, , 33F
你也能認同? 效能必要的犧牲 換取後取維護才是重點好嗎?
08/29 13:21, 33F

08/29 13:24, , 34F
所以用smarty就會很好維護?
08/29 13:24, 34F

08/29 13:26, , 35F
把你的樣版和我的樣版丟給10個來維護或編寫。
08/29 13:26, 35F

08/29 13:26, , 36F
你認為他們比較喜歡維護smarty還是純php?
08/29 13:26, 36F

08/29 13:28, , 37F
不會smarty的 會喜歡php 會了就會想用smarty
08/29 13:28, 37F

08/29 13:43, , 38F
如果smarty沒有存在的必要 那smarty幹嘛繼續更新成3?
08/29 13:43, 38F

08/29 13:44, , 39F
當然要不要使用smarty 並非必要... 我不是指一定要用他
08/29 13:44, 39F

08/29 13:55, , 40F
很多php framework都建議不該在選用其他的樣板引擎 直接用
08/29 13:55, 40F

08/29 13:56, , 41F
php的就好了 也不難理解.. 因為會增加學習障礙...
08/29 13:56, 41F

08/29 13:57, , 42F
可是在我最近使用ci 的心得 他的form helper、html helper
08/29 13:57, 42F

08/29 13:57, , 43F
根本就是在做跟smarty一樣的事情 是reinvent a wheel ?
08/29 13:57, 43F

08/29 14:08, , 44F
你要不要專文回一篇?
08/29 14:08, 44F

08/29 14:09, , 45F
雖然我覺得你的想法和我想做的事情及對象是不同的。
08/29 14:09, 45F

08/29 14:45, , 47F
你好像又再寫了一次ci 的view 看上面連結 最下面的範例..
08/29 14:45, 47F

08/29 14:46, , 48F
因為你說了 我的想法與你想做的事與對象不同 我又再仔細看
08/29 14:46, 48F

08/29 14:47, , 49F
你文章的內容 看是想表達什麼 怎麼會與我不同
08/29 14:47, 49F

08/29 14:48, , 51F
或許你想看中文的 上面連結是中文的 看該頁最下面
08/29 14:48, 51F

08/29 14:50, , 52F
我想一開頭我就講過,我是ci的重度患者。
08/29 14:50, 52F

08/29 14:51, , 53F
所以?你這篇文章的重點是在
08/29 14:51, 53F

08/29 14:51, , 54F
我想做的事與對象,並不是你。
08/29 14:51, 54F

08/29 14:51, , 55F
$frame['body'] = $load->view('body','',TRUE);
08/29 14:51, 55F

08/29 14:51, , 56F
$load->view('mypages',$frame);
08/29 14:51, 56F

08/29 14:51, , 57F
這個特殊作法?
08/29 14:51, 57F

08/29 14:51, , 58F
而是尚未接觸過樣板或是framework的設計人員。
08/29 14:51, 58F

08/29 14:52, , 59F
我也說了,會framework或是會ci的人。
08/29 14:52, 59F

08/29 14:52, , 60F
而清楚的明白我這個就是VIEW。他不會是別的東西。
08/29 14:52, 60F

08/29 14:52, , 61F
你要說我就只是把VIEW切出來給別人用嘛!那我完全不否認。
08/29 14:52, 61F

08/29 14:53, , 62F
他的輕巧,就純粹因為:他就是VIEW。不是別的東西。
08/29 14:53, 62F

08/29 14:53, , 63F
喔.. 原來這不是開發給ci用的 是給完全沒接觸過framework的
08/29 14:53, 63F

08/29 14:53, , 64F
不喜歡,你可以不要用。我也沒叫別人不要用SMARTY!
08/29 14:53, 64F

08/29 14:54, , 65F
沒 我只是覺得你應該做重點上色..適用怎樣的人
08/29 14:54, 65F

08/29 14:56, , 66F
簡單的來說 你是把ci的view割出來獨立使用.. 這樣講就好啦
08/29 14:56, 66F

08/29 14:57, , 67F
所以是誤會嗎?
08/29 14:57, 67F

08/29 14:59, , 68F
恩 文章太長 挑重點看 只看到像ci的部分
08/29 14:59, 68F

08/29 15:01, , 69F
不是每個人一開始都能接受SMARTY或是ci
08/29 15:01, 69F

08/29 15:01, , 70F
這個東西就只是為了多少讓他們先了解程式和樣板的可分離性
08/29 15:01, 70F

08/29 15:07, , 71F
另一方面就只是我自己在研究VIEW的做法。
08/29 15:07, 71F

08/30 00:07, , 72F
好啦 搞了半天只是因為誤會嘛....別吵別吵 ^^"a
08/30 00:07, 72F

08/31 11:36, , 73F
建議不要教學生 framework 或是 smarty
08/31 11:36, 73F


08/31 11:37, , 75F
上面有比較簡單的做法 ~ 學生要學的是基礎
08/31 11:37, 75F

08/31 17:36, , 76F
我是覺得如果對物件導向有一定的了解了。
08/31 17:36, 76F

08/31 17:37, , 77F
要學framework就沒什麼問題。
08/31 17:37, 77F

08/31 17:39, , 78F
假設我教學生整個連物件都教完的話。我會馬上叫他們用CI。
08/31 17:39, 78F
文章代碼(AID): #1CUIAtMy (PHP)
文章代碼(AID): #1CUIAtMy (PHP)