js333 > 计算机互联网 > Thinkphp模板没有解析直接原样输出的解决方法,模

原标题:Thinkphp模板没有解析直接原样输出的解决方法,模

浏览次数:89 时间:2019-10-03

很多人都碰到相同问题,在变量中赋值的字符串中包含的__ROOT__、__PUBLIC__、__APP__,这种字符的, 在模板中display出来的时候都被替换成了真实路径。话说是在写Timi文件管理系统的时候发现的这个问题。
从文件中把源码读出来输出到页面后发现,只要是TP的路径字符,都被替换成了真实路径。

本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法。分享给大家供大家参考。具体如下:

Thinkphp模板没有解析直接原样输出的解决方法,thinkphp模板

本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法。分享给大家供大家参考。具体如下:

一、问题:

最近在学习thinkphp模板了,但是发现模板页原样出来了,经过一番艰苦搜索终于找到解决方案。

二、解决方法:

很多人都碰到相同问题,在变量中赋值的字符串中包含的__ROOT__、__PUBLIC__、__APP__,这种字符的, 在模板中display出来的时候都被替换成了真实路径。话说是在写Timi文件管理系统的时候发现的这个问题。

从文件中把源码读出来输出到页面后发现,只要是TP的路径字符,都被替换成了真实路径。
比如:

复制代码 代码如下:

$this->assign('fileContent',$fileContent);//$fileContent中包含__PUBLIC__“路径常量”字符。

 
页面输出后显示为真实路径/public/。
期间经过了多种尝试,比如assign的时候base64加密,模板输出的时候decode一下,发现没起作用。最后终于忍不住的看了下Tp这块的源码,发现在display方法的最后一步的时候通过调用tag方法把“Tp的路径常量”替换成真实路径的。在render方法之前都是正常的。

图片 1

本来准备改下源码实现下面这位童鞋的需求方案的:
老大、这是临时解决方案还是最终方案?
不过我感觉在assign()方法里面加个判断还不错,
如果是$this->assign('','',false),则对内容不替换,原样输出。

结果,看完这块源码后才发现,不是那么容易,改动太大了。

最后另一位童鞋的回复,点出了最终解决方案:

“可以参考这里的内容:)
 
有了模板替换规则后,页面上所有的__PUBLIC__ 字符串都会被替换,那如果确实需要输出__PUBLIC__ 字符串到模板呢,我们可以通过增加替换规则的方式,例如:

复制代码 代码如下:

'TMPL_PARSE_STRING'  =>array(
         '--PUBLIC--' => '__PUBLIC__', // 采用新规则输出/Public字符串
)

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

于是乎,方案出炉:

在Tp的配置文件config.php中配置

复制代码 代码如下:

'TMPL_PARSE_STRING' => array (//路径配置
      
        //Timi文件路径还原
        '--PUBLIC--' => '__PUBLIC__',
        '--APP--' => '__APP__',
        '--URL--' => '__URL__',
        '--ACTION--' => '__ACTION__',
        '--SELF--' => '__SELF__',
        '--INFO--' => '__INFO__',
        '--EXT--' => '__EXT__'
),

读出源码的时候正则替换一下“路径常量字符”__ROOT__为--ROOT--:

复制代码 代码如下:

$fileContent=file_get_contents($filePath);
$fileContent=htmlspecialchars(preg_replace('/__(.*?)__/is','--$1--',$fileContent));

然后TMPL_PARSE_STRING的配置在模板被解析的时候刚好替换回去,如下图所示:

图片 2

于是乎,这个问题就“暂时”“完美”解决了。

希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

 

比如:

一、问题:

thinkphp把HTML+PHP写的一个页面代码存入数据库以后 读取出来的效果HTML代码解析了PHP代码被直接输出

用Widget,渲染输出是可以做到的.
在Lib/Widget/下新建一个文件命名为TestWidget.class.php文件:
代码
<?php
class TestWidget extends Widget{

public function render($data) {
return $this->renderFile("test_page",$data);
}
}
在Lib/Widget/Test/下新建一个文件test_page.html把你上面从数据库中读的代码放入test_page.html中。
然后在其它模板中这样调用{:W('Test',array())}
这只是一个基本例子。具体项目中你可以把你从数据库读出的代码动态保存入Lib/Widget/Test/test_page.html中。在调用 return $this->renderFile("test_page",$data);  

一、模板的使用        (重点)

$this->assign('fileContent',$fileContent);//$fileContent中包含__PUBLIC__“路径常量”字符。

最近在学习thinkphp模板了,但是发现模板页原样出来了,经过一番艰苦搜索终于找到解决方案。

thinkphp模板输出问题

应该是<eq name="data.answer" value="">...<else/>...</eq>  

本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法。分享给大家供大家...

         a、规则

 
页面输出后显示为真实路径/public/。

二、解决方法:

                   模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)

期间经过了多种尝试,比如assign的时候base64加密,模板输出的时候decode一下,发现没起作用。最后终于忍不住的看了下Tp这块的源码,发现在display方法的最后一步的时候通过调用tag方法把“Tp的路径常量”替换成真实路径的。在render方法之前都是正常的。

很多人都碰到相同问题,在变量中赋值的字符串中包含的__ROOT__、__PUBLIC__、__APP__,这种字符的, 在模板中display出来的时候都被替换成了真实路径。话说是在写Timi文件管理系统的时候发现的这个问题。

                   更换模板文件的后缀名(修改配置文件)

图片 3

从文件中把源码读出来输出到页面后发现,只要是TP的路径字符,都被替换成了真实路径。
比如:

                   'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名

本来准备改下源码实现下面这位童鞋的需求方案的:

复制代码 代码如下:

         b、修改模板文件目录层次

老大、这是临时解决方案还是最终方案?
不过我感觉在assign()方法里面加个判断还不错,
如果是$this->assign('','',false),则对内容不替换,原样输出。

$this->assign('fileContent',$fileContent);//$fileContent中包含__PUBLIC__“路径常量”字符。

                   'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次

结果,看完这块源码后才发现,不是那么容易,改动太大了。

 
页面输出后显示为真实路径/public/。
期间经过了多种尝试,比如assign的时候base64加密,模板输出的时候decode一下,发现没起作用。最后终于忍不住的看了下Tp这块的源码,发现在display方法的最后一步的时候通过调用tag方法把“Tp的路径常量”替换成真实路径的。在render方法之前都是正常的。

         c、模板主题

最后另一位童鞋的回复,点出了最终解决方案:

图片 4

                   'DEFAULT_THEME'=>'your',//设置默认模板主题

“可以参考这里的内容: l(模板替换)

本来准备改下源码实现下面这位童鞋的需求方案的:
老大、这是临时解决方案还是最终方案?
不过我感觉在assign()方法里面加个判断还不错,
如果是$this->assign('','',false),则对内容不替换,原样输出。

                   需要在TPL下面新建一个your文件夹作为模板主题文件夹

 

结果,看完这块源码后才发现,不是那么容易,改动太大了。

                   如何动态修改模板主题?

有了模板替换规则后,页面上所有的__PUBLIC__ 字符串都会被替换,那如果确实需要输出__PUBLIC__ 字符串到模板呢,我们可以通过增加替换规则的方式,例如:

最后另一位童鞋的回复,点出了最终解决方案:

                   1、在后台准备一个功能,修改config.php文件中的默认模板项

    'TMPL_PARSE_STRING'  =>array(
         '--PUBLIC--' => '__PUBLIC__', // 采用新规则输出/Public字符串
    )

“可以参考这里的内容://www.jb51.net/article/54217.htm(模板替换)
 
有了模板替换规则后,页面上所有的__PUBLIC__ 字符串都会被替换,那如果确实需要输出__PUBLIC__ 字符串到模板呢,我们可以通过增加替换规则的方式,例如:

                   2、通过url传递 t=主题 参数可以修改不同的模板

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。 

复制代码 代码如下:

                            'DEFAULT_THEME'=>'your',//设置默认模板主题

7 这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

'TMPL_PARSE_STRING'  =>array(
         '--PUBLIC--' => '__PUBLIC__', // 采用新规则输出/Public字符串
)

                            'TMPL_DETECT_THEME'=>true,//自动侦测模板主题

于是乎,方案出炉:

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

                            'THEME_LIST'=>'your,my',//支持的模板主题列表

在Tp的配置文件config.php中配置

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

                  

'TMPL_PARSE_STRING' => array (//路径配置
      
        //Timi文件路径还原
        '--PUBLIC--' => '__PUBLIC__',
        '--APP--' => '__APP__',
        '--URL--' => '__URL__',
        '--ACTION--' => '__ACTION__',
        '--SELF--' => '__SELF__',
        '--INFO--' => '__INFO__',
        '--EXT--' => '__EXT__'
),

于是乎,方案出炉:

二、输出模板内容      (重点)

读出源码的时候正则替换一下“路径常量字符”__ROOT__为--ROOT--:

在Tp的配置文件config.php中配置

         a、display

$fileContent=file_get_contents($filePath); 

复制代码 代码如下:

                   1.display中没有参数

$fileContent=htmlspecialchars(preg_replace('/__(.*?)__/is','--$1--',$fileContent));

'TMPL_PARSE_STRING' => array (//路径配置
      
        //Timi文件路径还原
        '--PUBLIC--' => '__PUBLIC__',
        '--APP--' => '__APP__',
        '--URL--' => '__URL__',
        '--ACTION--' => '__ACTION__',
        '--SELF--' => '__SELF__',
        '--INFO--' => '__INFO__',
        '--EXT--' => '__EXT__'
),

                            $this->display();

然后TMPL_PARSE_STRING的配置在模板被解析的时候刚好替换回去~

读出源码的时候正则替换一下“路径常量字符”__ROOT__为--ROOT--:

                   2.可以带参数

图片 5

复制代码 代码如下:

                            $this->display(本模块文件夹下的其他模板文件);

于是乎,这个问题就“暂时”“完美”解决了。

$fileContent=file_get_contents($filePath);
$fileContent=htmlspecialchars(preg_replace('/__(.*?)__/is','--$1--',$fileContent));

                            $this->display('index2');

然后TMPL_PARSE_STRING的配置在模板被解析的时候刚好替换回去,如下图所示:

 

图片 6

                            $this->display(其他文件夹下的模板文件);

于是乎,这个问题就“暂时”“完美”解决了。

                            $this->display('Public:error');//注意,仅仅需要在Tpl下有Public文件夹以及其中的error.html即可,不需要一定有Public模块

希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

 

您可能感兴趣的文章:

  • Thinkphp模板中截取字符串函数简介
  • Thinkphp模板中使用自定义函数的方法
  • ThinkPHP模板之变量输出、自定义函数与判断语句用法
  • ThinkPHP模板自定义标签使用方法
  • ThinkPHP使用smarty模板引擎的方法
  • 浅析ThinkPHP的模板输出功能
  • ThinkPHP模板比较标签用法详解
  • thinkphp模板继承实例简述
  • thinkPHP5.0框架安装教程
  • thinkPHP5.0框架命名空间详解
  • thinkPHP5.0框架模块设计详解
  • thinkPHP5框架渲染模板的3种方式简述

                            $this->display(其他主题下的 文件夹下的 模板文件);//需要开启主题支持

                            $this->display('my:Index:index');

 

                            $this->display(一个url路径);

                            $this->display('./Public/error.html');

 

                            $this->display('./Public/error.html','utf-8','text/xml');

 

                            $this->show($content);

                   3.fetch方法

                            获得模板文件中的内容,以字符串形式返回

                            $content=$this->fetch('Public:error');

                   4.show方法

                            不需要模板文件,可以直接输出模板内容

                                     $content=$this->fetch('Public:error');

                                     dump($content);

                                      $content=str_replace('h1','i',$content);

                                     $this->show($content);

三、模板中的赋值      (重点)

                   //$this->assign('name','赵桐正');

                   $this->name='赵桐正2';

                   $this->display();

四、模板替换          (重点)

__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/

__ROOT__: 会替换成当前网站的地址(不含域名)

__APP__: 会替换成当前项目的URL地址 (不含域名)

__GROUP__:会替换成当前分组的URL地址 (不含域名)

__URL__: 会替换成当前模块的URL地址(不含域名)

__ACTION__:会替换成当前操作的URL地址 (不含域名)

__SELF__: 会替换成当前的页面URL

                  

                   更换模板变量规则,修改配置项

                   'TMPL_PARSE_STRING'=>array(           //添加自己的模板变量规则

                   '__CSS__'=>__ROOT__.'/Public/Css',

                   '__JS__'=>__ROOT__.'/Public/Js',

         ),

 

 

'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符
'TMPL_L_DELIM'=>'<{', //修改左定界符
'TMPL_R_DELIM'=>'}>', //修改右定界符
'DB_TYPE'=>'mysql', //设置数据库类型
'DB_HOST'=>'localhost',//设置主机
'DB_NAME'=>'thinkphp',//设置数据库名
'DB_USER'=>'root', //设置用户名
'DB_PWD'=>'', //设置密码
'DB_PORT'=>'3306', //设置端口号
'DB_PREFIX'=>'tp_', //设置表前缀
'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息
'SHOW_PAGE_TRACE'=>true,//开启页面Trace
'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名
'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次
'TMPL_DETECT_THEME'=>true,//自动侦测模板主题
'THEME_LIST'=>'your,my',//支持的模板主题列表
'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则
'__CSS__'=>__ROOT__.'/Public/Css',
'__JS__'=>__ROOT__.'/Public/Js',
),

 


本文由js333发布于计算机互联网,转载请注明出处:Thinkphp模板没有解析直接原样输出的解决方法,模

关键词:

上一篇:python编写简易聊天室实现局域网内聊天功能金沙

下一篇:没有了