用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5324|回复: 3
收起左侧

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

[复制链接]
发表于 2010-9-15 12:47:19 | 显示全部楼层 |阅读模式
有这么个控制器:
   
PHP复制代码
 
     class News extends Controller
     {
      function News()
       {parent:Controller();}
      function index()
       {...}
      }
复制代码

试图调用我们可以有CI原先默认组织方式:
1.直接放在Views下,CI默认的情况。视图路径:views/news_index.php
   我们调用的时候
  
PHP复制代码
 
    function index(){
    $this->load->view('news_index');
    }
   
复制代码

2.在Views下建立任意文件夹。视图路径:views/content/news_index.php
控制器里调用:
PHP复制代码
 
    function index(){
    $this->load->view('content/news_index');
    }
   
复制代码

  我们还可以建立多层级:试图路径:views/content/chinaspecial/2010/news_index.php
控制器里调用:
PHP复制代码
 
    function index(){
    $this->load->view(content/chinaspecial/2010/news_index');
    }
   
复制代码


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

现在有这样一些需求:
需求1:
比如我当前的控制器是News 下面有个动作是Index.
那我在视图文件夹Views下建立一个文件夹News,在News文件夹下建立一个视图,index.php,路径:Views/News/Index.php
那么控制器里调用:
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
在控制器里也想:
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[blue|green]/News/Index.php

Views/default[blue|green]/Admin/News/Index.php


这些需求CI没有提供,甚至:$this->load->view()这样会报错,查看源码 View方法的原型是:
PHP复制代码
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方法的原型:
PHP复制代码
function view($view='', $vars = array(), $return = FALSE)
复制代码

所以 d e两种都可以
都可以

我选择e的方法:

在system/application/libraries/下建立MY_Loader.php文件
实现我的需求1:
内容:
PHP复制代码
 
<?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复制代码
 
<?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''] 给用户选择皮肤:
部分类似代码:
PHP复制代码
$skin=cookie[''my_skin''];
$skin==$skin==''?$config[''default_skin']:$skin;
$skin=$skin=='
'?'':$skin.'/';
$view=$skin.$area.$class.'
/'.$method;
复制代码

好了,就这样子,

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

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

发表于 2010-9-15 12:51:18 | 显示全部楼层
先顶起来
发表于 2010-9-15 13:18:51 | 显示全部楼层
支持.,,,,,,,,,
发表于 2010-10-10 12:29:37 | 显示全部楼层
好帖!!!!!

本版积分规则