wndyd 发表于 2010-9-15 12:47:19

自动加载默认约定好的视图的部分实现

有这么个控制器:
   
   class News extends Controller
   {
      function News()
       {parent:Controller();}
      function index()
       {...}
      }
试图调用我们可以有CI原先默认组织方式:
1.直接放在Views下,CI默认的情况。视图路径:views/news_index.php
   我们调用的时候
   
    function index(){
    $this->load->view('news_index');
    }
   
2.在Views下建立任意文件夹。视图路径:views/content/news_index.php
控制器里调用:
    function index(){
    $this->load->view('content/news_index');
    }
   
我们还可以建立多层级:试图路径:views/content/chinaspecial/2010/news_index.php
控制器里调用:
    function index(){
    $this->load->view(content/chinaspecial/2010/news_index');
    }
   

上面的视图的组织方式 我们在控制器里调用的时候都要天上相应的路径信息。

现在有这样一些需求:
需求1:
比如我当前的控制器是News 下面有个动作是Index.
那我在视图文件夹Views下建立一个文件夹News,在News文件夹下建立一个视图,index.php,路径:Views/News/Index.php
那么控制器里调用:

    function index(){
      //a:$this->load->view()
      //b:$this->load->view('',$data);($this->load->view($data) 这样实现的时候视乎有点麻烦,呵呵 主要是$data是字符串数据的时候)
      //c:$this->load->view('',$data,true);
      }
   

比如我现在需要把前台后台分开:
需求2:
那我需要建立一个文件夹:Admin
那么上面的视图文件路径应该是:Views/Admin/News/Index.php
在控制器里也想:

    function index(){
      //a:$this->load->view()
      //b:$this->load->view'',$data)
      //c:$this->load->view('',$data,true);
      }
   
这样调用

还有我想在Views直接体现不同的皮肤
需求3:
比如我有三种皮肤:默认的皮肤(default) 蓝色:blue 绿色:green.
那我们视图文件的路径应该是:
Views/default/News/Index.php

Views/default/Admin/News/Index.php


这些需求CI没有提供,甚至:$this->load->view()这样会报错,查看源码 View方法的原型是:function view($view, $vars = array(), $return = FALSE) 所以会报错

所以我们要自己扩展这些需求:

其实要达到这样的要求有很多方式:

CI手册里就可以参考。
我想下大致有这样几种:
a: 建个BaseContorller extends Controller然后   News extends BaseContorller
b: post_controller
d:重写 覆盖 CI_Loader类
e:继承 CI_Loader 类 重写 Views 方法
其他。。。

我这里需要修改Views方法的原型:function view($view='', $vars = array(), $return = FALSE)
所以 d e两种都可以
都可以

我选择e的方法:

在system/application/libraries/下建立MY_Loader.php文件
实现我的需求1:
内容:

<?php
class MY_Loader extends CI_Loader
{
function view($view='', $vars = array(), $return = FALSE)
{
    if($view==""){
   $ci=&get_instance();
   $class=$ci->router->fetch_class();
   $method=$ci->router->fetch_method();
   $view=$class.'/'.$method.$area;
   }
return parent::View($view,$vars,$return);
}
}
?>


实现我的需求2:


<?php
class MY_Loader extends CI_Loader
{
//同样能适合需求1
function view($view='', $vars = array(), $return = FALSE)
{
    if($view==""){
   $ci=&get_instance();
   $class=$ci->router->fetch_class();
   $area=$ci->router->fetch_directory();
   $area=$area==''?'':$area.'/';
   $method=$ci->router->fetch_method();
   $view=$area.$class.'/'.$method;
    }
return parent::View($view,$vars,$return);
}
}
?>



实现我的需求3:
这个我就不全写出来了,应该简单的。
可以再配置文件里加个$config[''default_skin']='default';
还可以建立 例如:session['my_skin'] 或cookie[''my_skin''] 给用户选择皮肤:
部分类似代码:
$skin=cookie[''my_skin''];
$skin==$skin==''?$config[''default_skin']:$skin;
$skin=$skin==''?'':$skin.'/';
$view=$skin.$area.$class.'/'.$method;
好了,就这样子,

社区发的第一帖,没有打草稿,考虑不全和错误的地方,希望大家帮我指正啊。

douzi_yueyue 发表于 2010-9-15 12:51:18

先顶起来

donquixote 发表于 2010-9-15 13:18:51

支持.,,,,,,,,,

cifans 发表于 2010-10-10 12:29:37

好帖!!!!!
页: [1]
查看完整版本: 自动加载默认约定好的视图的部分实现