作者:feifengxlq
原文地址:http://www.phpobject.net/blog/read.php/96.htm
时间:2007-1-12

    前天谈到MVC中的单点入口,今天我们主要谈谈MVC中的view(视图)。

     视图主要是把数据渲染现实给用户,其实就是把数据转化成THML输出给用户。在之前,我们一定都或多或少的了解过一些模版系统,比如说smarty,phplib,fasttemplate等等。模版系统不是完整意义上的视图,更加确切的说模版系统只是视图中的一个功能点。当然现在的模版系统的功能是越来越强大,比如说smarty实现了缓存的部分功能。

    关于模版系统的比较,大家可以看看这篇文章。模版系统原理其实很简单,就是把标签替换成相应的数据。但每个模版系统的实现方式都不完全一样,比如说smarty是编译型的,它第一个是把模版文件编译成相应的php文件,然后以后每次就直接调用编译后的文件,而PHPLIB是解析性的,每次都调用模版使用正则来替换。所以除了第一次smarty相对来说更加快。但是我不觉得使用标签有什么特别得好处。所谓得标签实现美工和程序分类,我认为是扯蛋。对于美工人员来说 {$var}和 有什么区别呢?

   在这里,我们做一个最简单的view类。
   首先,我们用函数实现一个最基本的渲染功能。

<?
function render($template,$vars)
{
    if(!
file_exists($template))die($template.'不存在!');
    
ob_start();
    if(
is_array($vars)){
        foreach(
$vars as $key=>$value){
            $
$key=$value;
        }
    }
    require 
$template;
    return 
ob_get_clean();
}
?>

   如果你对ob_start不熟悉,请自己查阅手册。使用这个函数可以实现一个简单的view,比如说简单变量,数组,对象,模块化等等。
   下面是一个使用demo,只贴出最核心的使用例子,模版文件请下载demo。
   

<?
   
function renderAction(){
        
$t_path=SITE_PATH.'/app/views/';//设置模版文件的路径
        
        
$array=array(
                
'simple_var'=>'简单变量!',
                
'array_var'=>array(
                            
'array1'=>'变量1的值',
                            
'array2'=>'变量2的值',
                            ),
                
'file_template'=>render($t_path.'viewer2.php',array('var2'=>'文件2中的变量!'))                    
                );        
        echo 
render($t_path.'viewer.php',$array);
    }
?>
    

   这里面用到了上一节的一些东西,不明白的请看《PHP实现MVC开发得最简单的方法——单点入口》
  实现后的效果图:
   点击在新窗口中浏览此图片

   最后提供一个类,实现类似zf的view的功能,关于它的使用,我就不多说了,很简单。

<?
/**
   *作者:feifengxlq
   *原文地址:http://www.phpobject.net/blog/read.php/96.htm 
   *时间:2007-1-12
*/
class viewer
{
    
    var 
$path;
    
/**
      * 构造函数
    */
    
function viewer($path='')
    {
       if(!empty(
$path))$this->set_tpl_path($path);
    }
    
/**
      * 设置模版文件路径
    */
    
function set_tpl_path($path)
    {
       if(!
file_exists($path))$this->error(1,$path);
       
$this->path=$path;
    }
    
/**
      * 渲染视图
    */
    
function render($template)
    {
       if(!
file_exists($this->path.$template))$this->error(2,$this->path.$template);
       
ob_start();
       require 
$this->path.$template;
       return 
ob_get_clean();
    }
    
    
/*--------私有方法----------------------*/
    /**
      * 出错处理
    */
    
function error($id,$other='')
    {
       switch(
$id)
       {
          case 
1:
             
$errormsg=$other.' 不是有效的文件路径!';
             break;
          case 
2:
             
$errormsg=$other.' 不是有效的模版文件!';
             break;
          default:
             break;     
       }
       die(
$errormsg);  
    }    
}
?>


    提供整个demo文件下载。
   
Tags: , ,
评论(9) | 引用(719) | 阅读(12701)
路人 Says:
2008/09/13 13:49
我觉得如果可以实现设计时美工支持的标签,那么可以说是实现了美工与程序的分离,像PHP这样的语言,开发环境还是比较恶劣的,算不上美工与程序分离。也只能支持楼主的:换来换去。
wf Says: Homepage
2008/08/27 21:23
为什么需要这一段?
if(is_array($vars)){
        foreach($vars as $key=>$value){
            $$key=$value;
        }


$vars是模型传过来的数据数组,那在模版文件里直接用echo $vars['XXX']不就可以了吗?
Donson Says Says:
2008/06/26 16:13
也有优点呀!
Donson Says Says:
2008/06/26 16:12
也有优点呀
GOD Says:
2008/04/22 11:12
确实是扯蛋~
好手 Says:
2007/12/17 15:02
thumbdown吗的什么乱七八糟的
AileenGuan Says:
2007/03/23 12:14
grin 想要完全分离逻辑和界面,纯属扯淡。无非是换来换去而已。把代码变得不像代码而已。
Donson Says:
2007/01/30 12:44
“所谓得标签实现美工和程序分类,我认为是扯蛋。”
哈哈,我认为也是这样...
Verdana Says:
2007/01/15 18:41
“所谓得标签实现美工和程序分类,我认为是扯蛋。”

非常赞同~~
分页: 1/73 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页
发表评论
昵称 [注册]
密码 游客无需密码
网址
电邮
打开HTML 打开UBB 打开表情 隐藏 记住我