zoukankan      html  css  js  c++  java
  • yii整合smarty【转】

    转自: http://mrcelite.blog.51cto.com/2977858/789406

    在protected下的extensions文件夹放入我们的smarty类包,按照约定我们同在protected下的extensions(Yii的扩展默认都扔到这里)中建立CSmarty类文件。

    内容如下:

    1. <?php  
    2. /**  
    3. *Author:Elite  
    4. */ 
    5.  
    6. require_once(Yii::getPathOfAlias('application.extensions.smarty').DIRECTORY_SEPARATOR.'Smarty.class.php');  
    7. define('SMARTY_VIEW_DIR', Yii::getPathOfAlias('application.views'));  
    8.  
    9. class CSmarty extends Smarty {  
    10.     const DIR_SEP = DIRECTORY_SEPARATOR;  
    11.     function __construct() {  
    12.         parent::__construct();  
    13.          
    14.         $this->template_dir = SMARTY_VIEW_DIR;  
    15.         $this->compile_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'template_c';  
    16.         $this->caching = true;  
    17.         $this->cache_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'cache';  
    18.         $this->left_delimiter  =  '<!--{';  
    19.         $this->right_delimiter =  '}-->';  
    20.         $this->cache_lifetime = 3600;  
    21.     }  
    22.     function init() {}  
    23. }  
    24. ?> 

    然后建立相关联的文件夹。

    紧接这是我们的配置部分

    打开protected/config/main.php

    在components数组中加入

    'smarty'=>array(
        'class'=>'application.extensions.CSmarty',
    ),

    最后在action中直接用Yii::app()->smarty就可以试用smarty了。如果每次在action中使用Yii::app()->smarty比较麻烦的话,可以在components下的Controller中可以加入

    protected $smarty = '';

    protected function init() {
           $this->smarty = Yii::app()->smarty;
     }

    然后在action中直接可以用$this->smarty使用smarty了。

    //按照以上配置完成之后,还会遇到smarty和yii类自动加载冲突问题

    //解决smarty和yii类自动加载冲突

    转自  http://blog.163.com/ydmx_lei/blog/static/77053405201252021057209/

    主要一个问题是自动加载类执行冲突的问题。

    YII注册了一个自动加载类spl_autoload_register(array('YiiBase','autoload')),SMARTY也注册了一个自动加载类,spl_autoload_register('smartyAutoload'),YII 注册在前,这样在遇到一个类名的时候,先执行的是YII的自定义自动加载类的函数,对应SMARTY里的每个类名而言,也是先调用YII的自动加载类的函 数,但是如果不符合YII自动加载的条件的话,就会执行SMARTY的自动加载类的函数,然而,SMARTY的类名在自动加载类的时候,确符合了YII自 动加载类的逻辑语句,结果就是YII使用Include语句要包含的类肯定找不到。

    解决的办法是:当SMARTY的类自动加载的时候,跳出在YII定义的自动加载函数,这样就会执行SMARTY的加载函数

    具体实现是,修改YIIBase类里面的autoload函数,增加如下代码

    public static function autoload($className)

    {

    // use include so that the error PHP file may appear

    if(preg_match('/smarty/i', $className)){      //只要类名包含smarty的,无论大小写,都返回,这样就跳出了YII自动加载类而去执行                                                                                  SMARTY的自动加载类函数了

    return;

    }

                 YII自动加载类代码

    }

    这样就可以在每个Action里使用smarty模板了。

    public function actionIndex(){

    $this->_smarty->assign('test', '测试');

    $this->_smarty->display('create.html');

    }

    后记:

      yii和smarty都注册了自己的自动加载函数, 而十分凑巧的是 smarty 加载的文件恰巧满足yii的类自动加载判断,最后出现了比较尴尬的事,smarty的类自动加载的文件跑到了yii中,yii加载文件失败,所以,才有了更改yii类自动加载的函数的不得已之举。

  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/mtima/p/2851872.html
Copyright © 2011-2022 走看看