欢迎光临 Rick 's BLOG
日志首页  | C# .Net编程  | 原创作品  | 生活点滴  | C\C++相关  | 多媒体相关※ERMP  | VB相关  | 其它运维与编程  |  留言簿
在php中实现安全的用户登录、Cookie中保存登录状态(remember me) 【宇轩】ASP WEB服务器
晴天  在CodeIgniter4实现前端切换风格模版功能,并允许风格模版只实现部分页面
[ 发布日期:12个月前 (12-05) ]   [ 来自:本站原创 ] [分类:原创作品]
准备给博客系统增加风格模版功能,同时还需要允许新的风格模版按需实现部分页面即可。

一种简单的实现方式是,直接全局切换风格模版目录,这样的缺点是要求新的风格模版必须实现所有页面。

而更优雅的实现方式是:允许风格模版按需实现页面,新的风格模板没有实现的页面自动使用默认模版页面。

这里介绍两种改造实现的方法:

1,增加新的全局函数 templateview()


 templateview() 的函数原型和功能对应CodeIgniter4框架自身的函数 view()。
区别就是 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($viewPATHINFO_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;//默认视图文件




这样主要工作就算完成了。
其它需要调整的地方

  1. 在Controller的初始化代码中给 $this->template 属性赋值。
  2. 控制器中调用 view() 函数的地方,如果需要使用风格模版功能,改为调用 $this->templateview()函数或者全局函数 templateview()
  3. 在视图文件中如果调用其它视图的地方如<?=view('header')?> 改为 <?=templateview('header')?>



第二种实现方式


直接替换框架的 view() 函数。
函数代码添加到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 属性赋值。
这样子就可以了。其它的地方基本不需要修改。


引用通告地址 (0):
复制引用地址https://www.rickw.cn/trackback/291
复制引用地址https://www.rickw.cn/trackback/291/GBK
[ 分类:原创作品  | 查看:1078 ]

暂时没有评论,快来发表一个评论吧。
发表评论
作者:   用户:[访客] 
评论:

表  情
禁止表情 | 禁止UBB | 禁止图片 | 识别链接
对不起,你没有权限上传附件!
验证:
 
PoweredBy R-Blog V1.00 © 2004-2024 WWW.RICKW.CN, Processed in second(s) , 7 queries    京ICP备17058477号-5