星期一, 5月 12, 2008

怠惰的程式員設計的 php template engine

想要從敝系畢業的話,必須先考過系上的程式能力檢定。雖然他有提供練習用伺服器,但是用起來很囉唆,要裝一堆軟體、設定 IP 等等有的沒的。

為了讓拙荊方便練習,上學期中我就抽空寫了個功能目標類似的小網站給她,還有其他程檢沒過的同學們玩。不過... 到最後來玩的都是過的,沒過的都懶得玩 = =

Anyway,這門零學分不上課的必修課可是系上唯一有開暑修的課,意思是說這些沒過的傢伙暑假又得再考一次。於是我想把上學期寫的這個東西拿出來整理一下,看看有沒有可以改進的地方...

想進化的第一個門檻就是,之前寫的時候時間有點趕,整個程式以 procedural 為主,完全沒有考慮到安全性、擴充性、與維護等等議題。首先把 Program 與 Presentation 分開,就需要用到一個 template engine。但是 php 的 template engine 都是 Smarty 一類的大傢伙,我實在不想也懶得把他抓進來放到我這只有兩三個檔案的小專案裡面。於是,這個東西就誕生了!

<?php
// 設定 Template 檔案所在目錄
define('_STUPIDITY_TEMPLATE_DIR_', '/home/username/public_html/project_name/stupidity');

class Stupidity
{
    function assign($key, $value)
    {
        $this->_assigned[$key] = $value;
    }

    function get($key)
    {
        return $this->_assigned[$key];
    }

    function say($key)
    {
        echo $this->_assigned[$key];
    }

    function render()
    {
        global $stupidity;
        include_once(_STUPIDITY_TEMPLATE_DIR_ . '/' .
            $this->template_filename);
    }
}

$stupidity = new Stupidity();

?>

用起來也很簡單,在程式的部份先 include stupidity.php,設定 template filename,assign 資料以後,再 render 就行了:

====== index.php ======
<?php
include('stupidity.php');
$stupidity->template_filename = 'index.stupid';
$stupidity->assign('author', 'Palatis');
$stupidity->render();
?>

====== stupidity/index.stupid ======
<html>
  <head>
    <title>I N D E X</title>
  </head>
  <body>
    <h1>I N D E X</h1>
    <p>Copyright 2008 by <?php $stupidity->say('author'); ?>.>/p<
  </body>
</html>

BSD License!不過我沒有對它作過任何測試,如果爆掉的話就... 好自為之喔!

BTW... 這個檢定系統 Google 會想買嗎?XD~

2 則留言:

ijliao 提到...

貴系真硬, 竟然還要先過程設檢定 *_*

Girvan 提到...

您好,最近開發了一個由Smarty概念而來的樣版引擎。叫Sopily,可能也很適合您的需求,您也可以單放一個class檔案,就不用載入plugin,也可以達成樣版的功能哦!歡迎您能來試用。