一种简单的实现方式是,直接全局切换风格模版目录,这样的缺点是要求新的风格模版必须实现所有页面。
而更优雅的实现方式是:允许风格模版按需实现页面,新的风格模板没有实现的页面自动使用默认模版页面。
这里介绍两种改造实现的方法:
1,增加新的全局函数 templateview()
templateview() 的函数原型和功能对应CodeIgniter4框架自身的函数 view()。
区别就是 templateview 函数会自动处理风格问题。
函数代码添加到APP\Common.php中:
这里的全局函数只是提供了一个调用封装,我们会将实际实现添加到BaseController中。
这里用到了在全局函数中访问当前控制器实例的方法,可以参考之前的文章实现 CodeIgniter4中如何在view或者helper函数中访问当前控制器对象。
在BaseController中添加如下实现代码:
这样主要工作就算完成了。
其它需要调整的地方
区别就是 templateview 函数会自动处理风格问题。
函数代码添加到APP\Common.php中:
[复制到剪贴板] |
function templateview($page, $data=[], $options = []){
return currentControl()->templateview($page, $data, $options);
}
这里的全局函数只是提供了一个调用封装,我们会将实际实现添加到BaseController中。
这里用到了在全局函数中访问当前控制器实例的方法,可以参考之前的文章实现 CodeIgniter4中如何在view或者helper函数中访问当前控制器对象。
在BaseController中添加如下实现代码:
[复制到剪贴板] |
/**
* 视图模版的路径
*/
private $viewPath = APPPATH . 'Views/templates/';
//当前风格模版名称
private $template = null;
public function templateview($page, $data=[], $options = []){
return view($this->templateFile($page), $data, $options);
}
/**
* 根据风格模版获取视图文件,不存在时返回默认模版文件
*/
public function templateFile($view){
$fileExt = pathinfo($view, PATHINFO_EXTENSION);
$viewfile = empty($fileExt) ? $view . '.php' : $view;
if(empty($this->template))
return 'default/' . $viewfile;//默认视图文件
$viewfile = $this->viewPath . $this->template .'/'. $viewfile;
if(is_file($viewfile))
return $this->template .'/'.$viewfile;//风格模版的视图文件
return 'default/' . $viewfile;//默认视图文件
}
这样主要工作就算完成了。
其它需要调整的地方
- 在Controller的初始化代码中给 $this->template 属性赋值。
- 控制器中调用 view() 函数的地方,如果需要使用风格模版功能,改为调用 $this->templateview()函数或者全局函数 templateview()
- 在视图文件中如果调用其它视图的地方如<?=view('header')?> 改为 <?=templateview('header')?>
第二种实现方式
直接替换框架的 view() 函数。
函数代码添加到APP\Common.php中完成函数替换:
再就是BaseController中代码,和第一部分的代码基本一样,只有templateview函数代码不同,新的代码参考如下
在Controller的初始化代码中给 $this->template 属性赋值。
这样子就可以了。其它的地方基本不需要修改。
函数代码添加到APP\Common.php中完成函数替换:
[复制到剪贴板] |
function view($page, $data=[], $options = []){
return currentControl()->templateview($page, $data, $options);
}
再就是BaseController中代码,和第一部分的代码基本一样,只有templateview函数代码不同,新的代码参考如下
[复制到剪贴板] |
public function templateview($page, $data=[], $options = []){
$view = $this->templateFile($page);
//这里要增加判断视图文件是否存在,如果不存在,则认为不是风格视图文件。
//直接使用原始的视图文件
if(!is_file($this->viewPath . $view ))
$view = $page;
//这里不能再调用view函数,把view函数代码拷贝过来。
$renderer = \Config\Services::renderer();
$config = config(\Config\View::class);
$saveData = $config->saveData;
if (array_key_exists('saveData', $options)) {
$saveData = (bool) $options['saveData'];
unset($options['saveData']);
}
return $renderer->setData($data, 'raw')->render($view, $options, $saveData);
}
在Controller的初始化代码中给 $this->template 属性赋值。
这样子就可以了。其它的地方基本不需要修改。