PHP平台首页: 基于Yii框架中使用smarty模板的方法

2019-09-30 作者:网络时代   |   浏览(104)

平台首页 1

复制代码 代码如下:

具体说来,我是在做Yii多语言站点的时候触发这个warning的,我写了一句:

date_default_timezone_set("PRC");
class PlaceController extends CController {
protected $_smarty;
function __construct(){
parent::__construct('place');//需要一个参数来调用父类的构造函数,该参数为控制器ID
$path = Yii::getPathOfAlias('application');//获得protected文件夹的绝对路径
include (dirname($path).DIRECTORY_SEPARATOR.'Smarty'.DIRECTORY_SEPARATOR.'Smarty.class.php');//smarty所在路径
$this->_smarty = new Smarty();
$this->_smarty->template_dir = dirname($path).DIRECTORY_SEPARATOR.'template'.DIRECTORY_SEPARATOR;//模板路径
}

Yii::app()->language = Yii::app()->request->cookies['lang'];

<?php
require_once(Yii::getPathOfAlias('application.extensions.smarty').DIRECTORY_SEPARATOR.'Smarty.class.php'); 
    define('SMARTY_VIEW_DIR', Yii::getPathOfAlias('application.views')); 

 代码如下

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

一句话,错在用对象作为数组的键。比如说,以下代码就会引发这个warning:

主要一个问题是自动加载类执行冲突的问题
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函数,增加如下代码

Yii::app()->language = Yii::app()->request->cookies['lang']->value;

第一种方法 按照YII系统的办法生成视图觉得有点麻烦,觉得用smarty更省事。尝试着把smarty模板加进来了。

 代码如下

然后建立samrty所需的template_c,cache等文件夹。
接下来是配置部分
打开protected/config/main.php在components数组中加入

$arr = array();
  
class a
  
{
  
}
  
$o = new a;
  
echo $arr[$o];

            $this->template_dir = SMARTY_VIEW_DIR; 
            $this->compile_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'template_c'; 
            $this->caching = true; 
            $this->cache_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'cache'; 
            $this->left_delimiter  =  '<!--{'; 
            $this->right_delimiter =  '}-->'; 
            $this->cache_lifetime = 3600; 
        } 
        function init() {} 
    } 
    ?>

 代码如下

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

$this->_files[$category][$language]=$this->basePath.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$category.'.php';
124         }

复制代码 代码如下:

在下面一句报错:

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

本文由澳门新葡亰网址大全发布于网络时代,转载请注明出处:PHP平台首页: 基于Yii框架中使用smarty模板的方法

关键词: