thinkphp漏洞_基于thinkphp的onethink如何整合smarty模版

更新时间:2019-12-02    来源:thinkphp    手机版     字体:

【www.bbyears.com--thinkphp】

整合smarty模版引擎, 兼容 think模版的步骤如下:

一:Application/Common/Conf/config.php添加

‘TMPL_ENGINE_TYPE’      => ‘Smarty’,

二:下载smarty模版引擎 下载地址

http://www.smarty.net/

放在ThinkPHP\Library\Vendor下面

因为onethink已经有smarty类,在

ThinkPHP/Library/Think/Template/Driver/Smarty.class.php

public function fetch($templateFile,$var) {
$templateFile = substr($templateFile,strlen(THEME_PATH));
vendor('Smarty.Smarty#class');
$tpl = new \Smarty();
$tpl->caching = C('TMPL_CACHE_ON');
$tpl->template_dir = THEME_PATH;
$tpl->compile_dir = CACHE_PATH ;
$tpl->cache_dir = TEMP_PATH ;
if(C('TMPL_ENGINE_CONFIG')) {
$config = C('TMPL_ENGINE_CONFIG');
foreach ($config as $key=>$val){
$tpl->{$key} = $val;
}
}
$tpl->assign($var);
$tpl->display($templateFile);
}

而onethink模版解析流程是在

hinkPHP\Library\Behavior\ParseTemplateBehavior.class.php
public function run(&$_data){
$engine = strtolower(C('TMPL_ENGINE_TYPE'));
$_content = empty($_data['content'])?$_data['file']:$_data['content'];
$_data['prefix'] = !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX');
if('think'==$engine){ // 采用Think模板引擎
if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix']))
|| $this->checkCache($_data['file'],$_data['prefix'])) { // 缓存有效
//载入模版缓存文件
Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']);
}else{
$tpl = Think::instance('Think\\Template');
// 编译并加载模板文件
$tpl->fetch($_content,$_data['var'],$_data['prefix']);
}
}else{
// 调用第三方模板引擎解析和输出
if(strpos($engine,'\\')){
$class = $engine;
}else{
$class = 'Think\\Template\\Driver\\'.ucwords($engine);
}
if(class_exists($class)) {
$tpl = new $class;
$tpl->fetch($_content,$_data['var']);
}else { // 类没有定义
E(L('_NOT_SUPPERT_').': ' . $class);
}
}
}

可以看出如果模版引擎不是think时,则实例化

‘Think\\Template\\Driver\\’.ucwords($engine);

这样你的系统可以支持smarty模版了,

但是你其他的模版有的不想使用smarty ,还想保留think

则可以在config.php里加判断

if( strstr($_GET['s'],"NoSmarty")!=''){){
 
return array(
 
'TMPL_ENGINE_TYPE'      => 'Smarty',
 
//当前控制器使用smarty
 
);
 
}else{
 
return array(
 
//当前控制器不使用smarty
 
);
 
}




ThinkPHP整合Smarty模板引擎操作mysql数据库

要想做到数据和前台页面真正的分离,就必然会用到smarty模板,这样,仅仅的传输数据就可以了。

配置Smarty的模板默认设置:'TMPL_ENGINE_TYPE' =>  'Smarty'

Smarty不解析模板内的标签及内容: {literal}  {/literal};//但有的不能用

如果建立的Smarty模板引擎,那么就不能用Think的对象来定义对象数据了,应该由Think变为Smarty。

如果现实内容: {$结果数组.一维标号.表的列名};

但是,不知道怎么回事,在3.2版里面,不能够使用foreach遍历内容。

SELECT的查询条件结构: select 字段 from 表名 where group 字段 having或 order  或 limit;

如建立下面的obj对象:

$obj=D();

$obj->select();是查询到数据表的所有信息

$obj->field(字段1,字段2,。。);指定查询字段;

$obj->table(数据表) 通过具体的数据表查询;

$obj->where(参数) 就是where后面的条件;

$obj->group(字段),根据字段分组查询;

$obj->having(参数条件),having条件设置;

$obj->order(参数),进行排序查询;

$obj->limit(偏移量,条数),限制条数查询;

$obj->select(主键值);只查询这个主键的信息。也可以指定多个主键

说明的是在SQL语句查询的时候是没有拼装顺序的,但是在内部是默认的给定顺序的。

如果查询的结果只有一条信息,可以使用find方法,节约资源。

$obj->find(主键值); 注意,这是一维数组

另外要说的还有:

having:这个类似于where,但是他们有以下的区别

1:当两者在一般查询中存在结果时,那就可以同时使用。

2:如果查询不到结果那就只能使用where

3:但如果要使用别名的话就只能使用having


聚合函数:

可以直接作为最后一个函数使用的方法,也可以直接进行使用:

count(); 查询有多少条记录。

max();     最大值查询。

min();      最小值查询。

avg(); 求平均值。

本文来源:http://www.bbyears.com/jiaocheng/81880.html