ThinkPHP框架使用Smarty模板引擎

最近公司使用ThinkPHP框架,所以比较关注,想到之前公司使用的框架用的模板引擎是 Smarty,而且用的还挺顺手的。
转到使用ThinkPHP自带的模板引擎还有点不习惯,所以在想换成Smarty模板引擎,网上看了一下,结果还是比较简单。
以此记录一下

首先ThinkPHP框架里面要有Smarty扩展 位置在 ThinkPHP\Extend\Vendor\Smarty ,如果没有就去 Smarty官网下一个最新版吧,也推荐使用最新版的。一般完整版的ThinkPHP框架都含有 Smarty扩展的。
然后只需修改配置文件 Conf\config.php

<?php
return array(
    //'配置项'=>'配置值'
    'TMPL_ENGINE_TYPE'      => 'Smarty',
    'TMPL_ENGINE_CONFIG'    => array(
        'caching' => TRUE,
        'template_dir' => TMPL_PATH,
        'compile_dir' => TEMP_PATH,
        'cache_dir' => CACHE_PATH,
        'left_delimiter' => '{',
        'right_delimiter' => '}',
    ),
);
?>

Action:

1
2
3
4
5
6
7
8
9
10
<?php
class IndexAction extends Action {
    public function index(){
        $data = array(
            'asdf' => 1,'dfg' => 2,'asdfrg' => 3,'yhnfd' => 4,'bfws' => 1
        );
        $this->assign('test',$data);
        $this->display();
    }
}

html:

1
2
3
4
5
{$smarty.now}
<br />
{foreach $test as $key=>$data}
{$key}:{$data}<br />
{/foreach}

最后输出:
1411459827
asdf:1
dfg:2
asdfrg:3
yhnfd:4
bfws:1

yes,这样就搞定了,使用Smarty模板就这么简单

ThinkPHP 3.2.3 bug 列表(2015-1-15)

下载TP 3.2.3,将本地的TP3.2.2升级。发现一些仍未修复和新的bug(欢迎交流,如需转载,请著名来自 default.fu@foxmail.com):

1)文件 ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php 第47行:

原代码:$tokenValue =  $tokenType(microtime(TRUE)) ;

应改为:$tokenValue = is_callable($tokenType) ? $tokenType(microtime(TRUE)) : md5(microtime(TRUE));

否则会:执行报错!

2)文件:ThinkPHP/Library/Think/Upload/Driver/Bcs/requestcore.class.php 开头:

应该将开头的如下3行 namespace  注释掉,否则会报错重复定义!

  1. use Think\Upload\Driver\Bcs\BCS_RequestCore;  
  2. use Think\Upload\Driver\Bcs\BCS_ResponseCore;  
  3. use THink\Upload\Driver\Bcs\BCS_RequestCore_Exception;  



3)文件:ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php 应该将 只允HTTP头为 2xx 的时候才保存本地缓存

1筛选条件文件名不为空

2且HTTP头为2xx

应该改为如下:

  1. namespace Behavior;  
  2. use Think\Storage;  
  3. /** 
  4.  * 系统行为扩展:静态缓存写入 
  5.  */  
  6. class WriteHtmlCacheBehavior  
  7. {  
  8.   
  9.     // 行为扩展的执行入口必须是run  
  10.     public function run(&$content)  
  11.     {  
  12.         //2014-11-28 修改 如果有HTTP 4xx 3xx 5xx 头部,禁止存储  
  13.         //2014-12-1 修改 对注入的网址 防止生成,例如 /game/lst/SortType/hot/-e8-90-8c-e5-85-94-e7-88-b1-e6-b6-88-e9-99-a4/-e8-bf-9b-e5-87-bb-e7-9a-84-e9-83-a8-e8-90-bd/-e9-a3-8e-e4-ba-91-e5-a4-a9-e4-b8-8b/index.shtml  
  14.         if (C(‘HTML_CACHE_ON’) && defined(‘HTML_FILE_NAME’)  
  15.             && !preg_match(‘/Status.*[345]{1}\d{2}/i’, implode(‘ ‘, headers_list()))  
  16.             && !preg_match(‘/(-[a-z0-9]{2}){3,}/i’,HTML_FILE_NAME)  
  17.         ) {  
  18.             //静态文件写入  
  19.             Storage::put(HTML_FILE_NAME, $content‘html’);  
  20.         }  
  21.     }  
  22. }  

4)文件:ThinkPHP/Library/Think/Storage/Driver/File.class.php 第45行:

原代码:mkdir($dir,0755,true);

应改为:mkdir($dir,0777,true);

否则会:在部分主机比如WIN VPS下会出现写入权限问题,写入失败。

原创by default.fu@foxmail.com

 

ThinkPHP使用技巧

1、让Runtime下的文件格式化:入口文件处:define(‘STRIP_RUNTIME_SPACE’,false);

2、开发时不进行缓存:入口文件处:define(‘NO_CACHE_RUNTIME’,true);
3、ThinkPHP支持四种访问模式:a:普通模式 b:pathinfo模式 c:rewrite模式 d:兼容模式 在配置文件中用URL_MODEL=0(1、2、3)来表示。
4、改变分隔线/:URL_PATHINFO_DEPR。默认为:/
5、跨模块<控制器>调用模板方法:模块<控制器名:模板名(不加后缀)>,如$this->display(‘Index:tt’);
6、跨皮肤调用模板方法:假如Tpl下有skin皮肤,该皮肤下有User文件夹,该文件夹下有sg.html,那么$this->display(‘skin@User:sg’);就跨皮肤调用了。
7、全路径输出:在工程目录<非项目目录>下,建一个Public文件夹,这就是公共文件,可以将js文件放在这里供前后台共用。现在假设Public文件夹下有一个ss.html文件,那么
      $this->display(‘./Public/ss.html’);就输出公共文件中的ss.html模板。
8、display的参数:依次为:模板名,编码格式,mimie。如:$this->display(‘./Public/ss.html’,’utf-8′,’text/xml’);
9、系统常量:
__ROOT__  //代表网站的根目录地址
__APP__  //代表项目的入口文件地址
__URL__  //代表当前操作地址
__ACTION__  //代表当前操作地址
__SELF__  //代表当前的URL地址
__CURRENT__  //代表当前模块的模板目录
__PUBLIC__  //代表整个项目的公用目录
__TMPL__  //代表整个项目的模板目录,如Tpl/default/
ACTION_NAME  //当前操作名称
APP_PATH  //代表当前项目目录
APP_NAME  //代表当前项目名称
APP_TMPL_PATH  //代表当前项目的模板目录
APP_PUBLIC_PATH  //代表项目公共文件目录
CACHE_PATH  //项目模板缓存目录
10、配置文件中一些有用的参数:
‘SHOW_RUN_TIME’=>true,//运行时间显示
‘SHOW_ADV_TIME’=>true,//显示详细的运行时间
‘SHOW_DB_TIMES’=>true,//显示数据库的操作次数
‘SHOW_CACHE_TIMES’=>true,//显示缓存操作次数
‘SHOW_USE_MEM’=>true,//显示内存开销
11、halt();//中断程序执行。
12、dump是ThinkPHP里面预定义好的一个函数,具有显示更清晰的作用。
13、读取配置文件其中信息:C,如:$a=C(‘DB_HOST’);这种情况可用于在后台中向管理员显示服务器IP,数据库信息等。
14、自定义Model类并在实例化模型<模型就是数据库操作类>时使用,如:
a、在工程目录下的home<前台文件夹>下的Lib下的Model下建立一个IndexModel.class.php,然后里面写一个方法play,此方法循环输出1至10。
b、在Action中的方法里:
$index=M(‘index’,’IndexModel’); //这里可以加上自定义的模型类一起实例化
$index->play();
那么会输出1至10。
15、实例化模型可以用D也可以用M,M是快速实例化,且可带参,如M(‘User’,’play’);//play是一个对应的模型类。也可以$user=new UserModel();
16、D方法可以自动检测模型类,不存在时它会抛出一个异常。同时对于已实例化过的模型,不会去重复实例化。默认的D方法只能支持调用当前项目(应用)下面的模型。
17、ThinkPHP的分组功能:如果现在想在前台实合例化后台模型,那么:
$admin=D(‘admin.user’);
dump($admin->find());
将输出后台模型数据,这就是分组功能。
18、CommonAction中的_initialize方法让每一个继承它的类的每个方法都要经过_initialize。think_access表要加个pid(int11)字段。四张表是必须的,但是还需要一张user表,里面字段自定。
19、解决ThinkPHP中使用Smarty然后include方法无效的办法:不是不支持,但是路径没有那么智能,比如Tpl的default下的Task模块下有一test.html文件,那么,请用<{include file=’default/Task/test.html’}>以下为引用的话:
include所包含的文件由file属性来指定,路径相对于template_dir,也就是所如果你在使用smarty的时候设置模板路径template_dir假设为Tpl,那么file的文件就应该相对于Tpl文件来取,就你的例子
{include file=”Public/header.html”}的话,那么header.html要放在Tpl下的Public文件夹下。
其实,在Smarty类中把include函数改一下让它输出路径,那么这问题将很好查找。
20、关联模型:尝试了很多次,它一直提示找不到relation方法,就在准备放弃那一秒,奇迹真的出现了:它可以了,配置还是那个配置,真的未改动,那个配置也没什么怀念的,还是记录一下吧:
UserModel.class.php如下:
<?php
class UserModel extends RelationModel{
     public $_link = array(
     ‘phone’=>array(
     ‘mapping_type’=>HAS_ONE,
     ‘foreign_key’=>’uid’,
                  ),
);
}
?>
IndexAction.class.php如下:
 public function index()
    {
$user=D(‘user’);
$users=$user->relation(true)->find(1);
dump($users);
    }
21、关闭ap.php缓存:配置文件中:  APP_DEBUG=>true,
22、ThinkPHP中判断为空的方法:<present name=”name”>name已经赋值<else /> name还没有赋值</present>
23、ThinkPHP原生模板中if语句中session判断的问题:
      正确使用如下:
      <if condition=”$_SESSION[‘level’] egt 2″>
     <a href=”>收藏此人才</a>
     </if>
     正解:
由于 if 标签的 condition 属性里面基本上使用的是 php 语法,尽可能使用判断标签和 Switch 标签会更加简洁,原则上来说,能够用 switch 和比较标签解决的尽量不用 if 标签完成。因为 switch 和比较标签可以使用变量调节器和系统变量。如果某些特殊的要求下面, IF 标签仍然无法满足要求的话,可以使用原生 php 代码或者 PHP 标签来直接书写代码
<eq name= “Think.session.disEdit” value= “1”>。。。。。</eq>  这个没试,但已明白
<if condition=”$_SESSION[‘disEdit’] eq 1″>   这个是可以的

24、分组模式配置:

  //分组模式配置
‘APP_GROUP_LIST’=>’Index,Job,Member,Shop’,
‘DEFAULT_GROUP’=>’Index’,
25、_initialize这个函数不太好记,卧槽,记这里吧。
26、Thinkphp开发时关闭缓存的方法:
 

因在开发中需要经常修改,从而要经常删除缓存,才能看到效果。

所以为了开发的方便,可以把缓存给去除。

1.找到\ThinkPHP\Common\convention.php和\ThinkPHP\Common\debug.php

2.打开这两个文件找到你想要的设置即可。

debug.php中

‘TMPL_CACHE_ON’=>false,      // 默认开启模板缓存

convention.php中’

TMPL_CACHE_ON’   => false,  // 默认开启模板编译缓存 false 的话每次都重新编译模板

‘ACTION_CACHE_ON’  => false,  // 默认关闭Action 缓存

‘HTML_CACHE_ON’   => false,   // 默认关闭静态缓存

27、中文字符长度截取:{$vo[‘title’]|mb_substr=###,0,16,’UTF-8′},这是支持中文的,很好用。

28、ThinkPHP2.1中,如果想开启debug后显示页面运行时间,那么要在页面中加入{__RUNTIME__}才可以的。
29、HTML压缩:
TMPL_STRIP_SPACE
这个不是压缩 只是去空白和注释
30、模板后缀设置:’TMPL_TEMPLATE_SUFFIX’ => ‘.tpl’

ThinkPHP实现静态缓存和动态缓存

利用ThinkPHP既可以很容易实现页面静态化(静态缓存),又可以很容易实现动态缓存(文件缓存和memecache缓存等)

工具/原料

  • memcached.exe

  • php_memcache.dll

方法/步骤

  1. 弄清静态缓存和动态缓存的用途:

    静态缓存:生成静态页面——缓存的是整个页面;

    动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不需要再读取数据库了,直接通过缓存文件来调取相应数据”;

  2. 第二步:静态缓存的实现,在config.php文件中作如下配置:

    ThinkPHP实现静态缓存和动态缓存
  3. 动态缓存的实现方式“文件缓存”(默认方式):

    ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“文件”中;

    //S(‘缓存名称’,’缓存数据’,’缓存时间’)—缓存文件默认保存到“Runtime/Temp/”文件夹

    存数据:S(‘index_list’,$list,10); //$list:是从数据库中读取的数据

    读数据:S(‘index_list’); //直接从缓存文件读取,不再经过数据库

  4. 动态缓存的实现方式“memecache缓存”,需先安装Memcached

  5. 再开启memecache缓存,在config.php中作如下配置

    ThinkPHP实现静态缓存和动态缓存
  6. 6

    其次通过S()函数实现“memecache缓存”:

     

    ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“内存”中;

    存数据:S(‘index_list’,$list,10);

    读数据:S(‘index_list’)

  7. 7

    至此,你可以利用ThinkPHP实现静态缓存和动态缓存了

    END

注意事项

  • 安装Memcached时,需下载正确版本的php_memcache.dll文件

    http://jingyan.baidu.com/article/93f9803fea7cf4e0e46f55ad.html

Thinkphp实现站点静态化的方法

thinkphp提供了一个有效的生成静态页的方法,(在tp2.0的手册上有说明,3.0的手册上没有说明了,不过3.0方法还是存在的。)
$this->buildHtml('静态文件', '静态路径','模板文件');
稍微说明下参数,有些朋友问我这个参数和具体如何使用。
参数一:静态文件,是指生成后的静态文件名,文件保存路径完整的就是:静态路径/静态文件。例如静态文件设置a/index.那么保存的路径就是项
目路径/Html/a/index.html(默认的静态路径在项目路径的Html文件夹下,没有可以自己创建)
参数二:静态路径,上面已经说明了默认的路径,3.0中可以在入口文件里加入参数来更改静态路径。
define(‘HTML_PATH’, ‘./’);(将静态路径义为网站根目录)
参数三:模板文件,我感觉官方这个描述是不正确的,准确的来说应该是目标模块,就是需要生成静态文件的模块。格式:模块名:操作。比如要生成Index下的a方法为静态文件,那就是Index:a。如果为空则默认生成当前操作的静态文件。
例子:
class IndexAction extends Action {
    public function index(){
        $this->buildHtml("index",'',"");
        $this -> display();
    }
}
其实
$this->buildHtml("index",'',"");
$this->buildHtml("index",'',"Index:index");
$this->buildHtml("index",'',"index");
这样三个格式等效的
下面是静态化的实现,就两种方法
可以在当前模块下加如上述语句,那么只要运行该模块就会产生指定的目录下的”模块.html”文件,通常的做法就是站点建设好以后,专门写一个方法,然后让其执行,使整个站点一次性生成静态文件,注意:如果站点有编辑或调整那么必须清理缓存一次,就是项目下的Runtime文件夹必须清空