用PHP開始你的MVC (四)實現View層
MVC模式的view層的主要任務是進行頁面的和結果的顯示工作,在php的實現過程中,主要是體現為一個模板(使用模板,可以達到php程式碼和html程式碼分離的目的,這樣程式碼和頁面的維護就方便多了,便於管理和頁面的更換,可以真正的劃分程式設計師、美工的分工)的解析過程:
首先,controler層從model層得到資料
其次,controler層將資料交給view層
再次,view層的介面將資料按一定的方式傳給模板解析類,
最後,模板解析類將資料解析到模板中,然後顯示。
下面是一個具體的實現例子
目錄結構
|- ClassRenderTest.php //測試解析classlist.html |- StudentRenderTest.php //測試解析studentlist.html |- render / TemplateParser.php //模板解析類 |- render / Render.php //解析模板的所有類的基礎類 |- render / StudentRender.php //解析模板studentlist.html的類 |- render / ClassRender.php //解析模板classlist.html的類 |- template / studentlist.html //模板檔案 |- template / classlist.html //模板檔案 |
注意:
1、這裡模板解析類選用了簡單的“TemplateParser.php”,根據個人的需要你可以選用任何一種模板解析類;
2、如果每個模板解析都直接呼叫“TemplateParser.php”,可能會有大量的重複程式碼出現,這是oo思想所不准許出現的。因此採用“Render.php”對它進行包裝,然後再對“Render.php”裡面的Render類進行擴充套件,來對不同檔案模板進行解析;
3、不同的模板解析類的,使用的方法是不同的,他們的包裝方式也可能不同。
4、“StudentRender.php”“ClassRender.php”就是包裝過的Render類,分別用來滿足解析“studentlist.html”“classlist.html”的需要。
檔案1:classlist.html
current time is : _now_ <BR><BR> current school class list : <TABLE border=1> <TR> <TH>ID</TH> <TH>NAME</TH> <TH>GRADE</TH> <TH>CLASS</TH> </TR> BEGIN_classlist_ <TR> <TD>_cid_</TD> <TD>_cname_</TD> <TD>_grade_</TD> <TD>_class_</TD> </TR> END_classlist_ </TABLE> |
current time is : _now_ <BR><BR> current class is : <TABLE border=1> BEGIN_classinfo_ <TR> <TH>class id: _cid_</TH> <TH>class name: _cname_</TH> <TH>class grade: _grade_</TH> <TH>class num: _class_</TH> </TR> END_classinfo_ </TABLE><br> current class's student : <TABLE border=1> <TR> <TH>ID</TH> <TH>NAME</TH> <TH>SCORE</TH> </TR> BEGIN_studentlist_ <TR> <TD>_sid_</TD> <TD>_sname_</TD> <TD>_score_</TD> </TR> END_studentlist_ </TABLE> |
檔案3:TemplateParser.php
下面的模板解析類是筆者臨時寫的一個簡單的模板解析類,功能很少,沒有真正什麼使用價值。但是在這裡可以滿足這篇文章講解的需要。
同時,如果以前沒有接觸過模板解析,對模板解析的實現方法有一定疑問的同僚,可以研究一下這個簡單類實現解析的方式,程式碼挺簡單的應該能看懂的。
這個解析類有自己的模板結構,“塊”(要進行迴圈顯示的地方)的定義如下:
BEGIN_你的塊名_
......html程式碼.......
_你的塊裡面的變數的名稱_
......html程式碼.......
END_你的塊名_
變數的定義方式如下:
......html程式碼.......
_你的塊裡面的變數的名稱_
......html程式碼.......
具體的“塊”和“變數”的使用參考上面的兩個模板
<?php /* * template parse class */ class TemplateParser{ /* * @var template root directory */ var $root = ''; /* * @var template filename */ var $tpl = ''; /* * @var data for parse template */ var $data = array(); /* * @var template parse result */ var $result = ''; /* * construct function */ function TemplateParser($root=''){ $this->root = $root; } /* * set template file name */ function loadTemplateFile($tplFile){ $this->tpl = $tplFile; } /* * set global var value; * * @param $varName global var name * @param $data var's value */ function setData($varName, $data){ $this->data['__ALL__'][$varName] = $data; } /* * set global var value; * * @param $blockName template block name * @param $data var value * @param $rec var value */ function setBlockData($blockName, &$data, $rec=false){ $this->data[$blockName] = &$data; $this->rec[$blockName] = $rec; } /* * parse template action */ function parse(){ $tplstr = file_get_contents("{$this->root}/{$this->tpl}"); foreach($this->data as $block=>$value){ $tag = "|BEGIN_{$block}_(.*)END_{$block}_|sm"; preg_match($tag, $tplstr, $tmpdata); if($tmpdata[1]!=null){ $tmpstr = ''; if($this->rec[$block]){ foreach($value as $subValue) $tmpstr .= $this->_parseBlock($tmpdata[1], $subValue); }else{ $tmpstr .= $this->_parseBlock($tmpdata[1], $value); } } $tplstr = preg_replace("|BEGIN_{$block}_(.*)END_{$block}_|sm", $tmpstr, $tplstr); } $tplstr = $this->_parseBlock($tplstr, $this->data['__ALL__']); $this->result = $tplstr; } /* * parse block * * @param $str string one block string * @param $data array data for parse */ function _parseBlock($str, $data){ foreach($data as $key=>$value){ $keys[] = "_{$key}_"; $values[] = "$value"; } return str_replace($keys, $values, $str); } /* * return parse result */ function get(){ return $this->result; } /* * show parse result */ function show(){ echo $this->result; } } ?> |
<?php /* * include template parser class */ require_once "TemplateParser.php"; /* * base render class */ class Render{ /* * @var object of template parser class */ var $parser = ""; /* * instruct function */ function Render($root, $tplFile){ $this->parser = new TemplateParser($root); $this->parser->loadTemplateFile($tplFile); } /* * add data to template parser * * @param $data array() data for parse */ function initData(&$data){ return ; } /* * show template parse result */ function show(){ $this->parser->parse(); $this->parser->show(); } } ?> |
<?php function StudentRender(){ function initData($data){ |
<?php function ClassRender(){ function initData(&$data){ |
--------------------------------------------------
下面兩個是測試檔案,第一個比較簡單一些
--------------------------------------------------
測試檔案1:ClassRenderTest.php
<?php /* * include "class list show render" */ require_once "render/ClassRender.php"; /* * data for parse * * include (class list) */ $data = array('class'=>array('1'=>array('cid'=>1, 'cname'=>'class one', 'grade'=>3, 'class'=>1), '2'=>array('cid'=>2, 'cname'=>'class two', 'grade'=>3, 'class'=>2), '3'=>array('cid'=>3, 'cname'=>'class three', 'grade'=>4, 'class'=>1), '4'=>array('cid'=>4, 'cname'=>'class four', 'grade'=>4, 'class'=>2), '5'=>array('cid'=>5, 'cname'=>'class five', 'grade'=>5, 'class'=>1))); /* * do template parse */ doRender($data); /* * may see as controler's action, use to parse template */ function doRender(&$data){ $render = new ClassRender(); $render->initData($data); $render->show(); } ?> |
current time is : 2004-05-10 23:51:26 <BR><BR> current school class list : <TABLE border=1> <TR> <TH>ID</TH> <TH>NAME</TH> <TH>GRADE</TH> <TH>CLASS</TH> </TR> <TR> <TD>1</TD> <TD>class one</TD> <TD>3</TD> <TD>1</TD> </TR> <TR> <TD>2</TD> <TD>class two</TD> <TD>3</TD> <TD>2</TD> </TR> <TR> <TD>3</TD> <TD>class three</TD> <TD>4</TD> <TD>1</TD> </TR> <TR> <TD>4</TD> <TD>class four</TD> <TD>4</TD> <TD>2</TD> </TR> <TR> <TD>5</TD> <TD>class five</TD> <TD>5</TD> <TD>1</TD> </TR> </TABLE> |
<?php /* * include "shudent list show render" */ require_once "render/StudentRender.php"; /* * data for parse * * include (one class info) and (one class's student list) */ $data = array('class'=>array('cid'=>1, 'cname'=>'class one', 'grade'=>3, 'class'=>1), 'student'=>array('1'=>array('sid'=>1, 'sname'=>'stu one', 'score'=>100), '2'=>array('sid'=>2, 'sname'=>'stu two', 'score'=>90), '3'=>array('sid'=>3, 'sname'=>'stu three', 'score'=>80), '4'=>array('sid'=>4, 'sname'=>'stu four', 'score'=>95), '5'=>array('sid'=>5, 'sname'=>'stu five', 'score'=>55))); /* * do template parse */ doRender($data); /* * may see as controler's action, use to parse template */ function doRender(&$data){ $render = new StudentRender(); $render->initData($data); $render->show(); } ?> |
current time is : 2004-05-10 23:52:22 <BR><BR> current class is : <TABLE border=1> <TR> <TH>class id: 1</TH> <TH>class name: class one</TH> <TH>class grade: 3</TH> <TH>class num: 1</TH> </TR> </TABLE><br> current class's student : <TABLE border=1> <TR> <TH>ID</TH> <TH>NAME</TH> <TH>SCORE</TH> </TR> <TR> <TD>1</TD> <TD>stu one</TD> <TD>100</TD> </TR> <TR> <TD>2</TD> <TD>stu two</TD> <TD>90</TD> </TR> <TR> <TD>3</TD> <TD>stu three</TD> <TD>80</TD> </TR> <TR> <TD>4</TD> <TD>stu four</TD> <TD>95</TD> </TR> <TR> <TD>5</TD> <TD>stu five</TD> <TD>55</TD> </TR> </TABLE> |