|
今天学了一下CI的页面布局layout,很好用,谢谢哈。原帖网址:http://codeigniter.org.cn/forums/forum.php?mod=viewthread&tid=1176,再次感谢!
但是以前用其他开发者写的框架的时候,发现他们的layout不是写在views下的,于是就想看看CI能不能也可以实现views目录以外的目录下视图的加载。
....
终于,可以实现了。麻烦大家看看哈,不好之处请多多指教。
方法一:
1,在application/core下扩展核心类load(具体见手册),如:
class MY_Loader extends CI_Loader {
2,重写view方法:
PHP复制代码 function view ($view, $vars = array(), $return = FALSE, $layout = FALSE)
{
if ($layout) //加载布局页面
{
$ext = pathinfo($view, PATHINFO_EXTENSION );
$view = ($ext == '') ? $view.EXT : $view;
$path = APPPATH .'layout/'.$view; //layout目录下的视图
return $this->_ci_load (array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array ($vars), '_ci_path' => $path, '_ci_return'
$return));
}
else
{
return $this->_ci_load (array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array ($vars), '_ci_return' => $return));
}
} 复制代码
3,页面布局layout类(library目录)中的view方法:
PHP复制代码 function view($view, $data1=null, $return=false, $layout = TRUE) //$layout参数传递给扩展核心类my_load.
{
$data2['content_for_layout'] = $this->obj->load->view($view,$data1,true); //内容页,如同在视图中输出数据,不同的是此数据为一个内容页面
if($return)
{
$output = $this->obj->load->view($this->layout,$data2, true, $layout);
return $output;
}
else
{
$this->obj->load->view($this->layout,$data2, false, $layout); //视图(布局)下的视图($data2的索引下包括内容视图及$data1)
}
} 复制代码
//4,可参考module(hmvc架构)类对$layout进行动态赋值。
方法二:
1,同方法一第1步
2,添加属性:var $_ci_is_inside_layout = FALSE; // 判断是否调用布局
3,添加方法:
PHP复制代码 public function _ci_layout_ready()
{
$this->_ci_is_inside_layout = TRUE;
} 复制代码
4,重写view方法:
PHP复制代码 function view ($view, $vars = array(), $return = FALSE)
{
if ($this->_ci_is_inside_layout ) //加载布局页面
{
$ext = pathinfo($view, PATHINFO_EXTENSION );
$view = ($ext == '') ? $view.EXT : $view;
$path = APPPATH .'layout/'.$view;
return $this->_ci_load (array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array ($vars), '_ci_path' => $path, '_ci_return'
=> $return));
}
else
{
return $this->_ci_load (array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array ($vars), '_ci_return' => $return));
}
} 复制代码
5,页面布局layout类(library目录)中的view方法:
PHP复制代码 function view($view, $data1=null, $return=false)
{
//$this->obj->load->_ci_layout_ready();//切记不能在此处调用。按代码先后执行的顺序是先执行下面一行的view,但是此view是要加载views目录下的视图,若取消
注释该行则执行下面一行的view方法后会跳到自己设定的目录下寻找视图。
$data2['content_for_layout'] = $this->obj->load->view($view,$data1,true); //内容页,如同在视图中输出数据,不同的是此数据为一个内容页面
$this->obj->load->_ci_layout_ready();
if($return)
{
$output = $this->obj->load->view($this->layout,$data2, true);
return $output;
}
else
{
$this->obj->load->view($this->layout,$data2, false); //视图(布局)下的视图($data2的索引下包括内容视图及$data1)
}
} 复制代码
|
评分
-
查看全部评分
|