自动加载默认约定好的视图的部分实现
有这么个控制器: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;
好了,就这样子,
社区发的第一帖,没有打草稿,考虑不全和错误的地方,希望大家帮我指正啊。 先顶起来 支持.,,,,,,,,, 好帖!!!!!
页:
[1]