Yii框架-Smarty-整合

 一、搭建yii框架

一、首先你得下个YII框架的源码 ;下载地址:http://www.yiiframework.com/download/

二、把下载到的源码解压放到一个PHP可访问的位置;如我的 F:/site(已具备了php环境了哦!);

与此同时,在site文件夹下会看到解压到的相关文件及文件夹有:1、LICENSE 2、CHANGELOG 3、README 4、UPGRADE 5、demos 5、framework 6、requirements 7、testDemo (大概共七个)

三、解压完成后,在php.ini中开启yii所需的基本配置模块; 你可运行 requirements文件夹下的index.php文件 进行检查一下YII配置需求 ;我的为:http://site/requirements/index.php  如图(对应下,结果所对应的那一栏如果发现有“未通过”的你在在php所安装的目录下找到php.ini,把他们所对应的注释去掉即可):

php若不在C盘,应该其配置文件拷至c:windows下;相应dll模块拷入system32下;添加php5环境变量添量path;(XP)

四、然后的话,就是配置计算机的环境变量了,也就是把php所安装的路径添加到path中去;

具体的操作步骤为:

鼠标右键我的电脑图标—>  选择弹出窗的“属性”选项-->点击“高级”选项卡—>在选项卡下面找到“环境变量选项”进入-->在“系统变量(s)”处找到变量名为“Path”双击打开编辑—> 加入php所在的安装目录即可;如我的为:C:php5

五、好,搞定相关的配置后,接下来就是创建一个YII的应该啦;一般操作如下:

打开命令提示符cmd(可以在开始--运行--输入cmd 回车即可) —> 进入yii 所在文件下的framework文件夹 如我的为:F:/site/framework,如下图:

--> 执行命令在site下创建站点名为“demo”的应用(操作为:执行命令—yiic webapp ../demo)回车如下图:

--> 输入“yes” 或“y” 即可创建 ---> 回车后出现那么的一堆东西,主要下最下面,如果是这样就是成功了,如图:image

--> 浏览器上进行http://site/demo/index.php  看到这样(如下图),那么恭喜你,一个静态的站点你建立成功了;

TIPS:在运行 http://site/demo/index.php 时,你有可能会遇到,打不开,出现date();的问题,放心,别紧张,follow me…

找到PHP所在安装目录中的php.ini文件---> 打开找到“date.timezone” –> 把前面的注释去掉并给其赋值为PRC(即中华人民共和国的意思),修改后,整行即为date.timezone = 'PRC' [北京时间]

二、搭建smarty模板引擎

1、下载Smarty包
     可以从官方站点下载:http://smarty.php.net   


2、解压缩Smarty包并找到合适的位置存放.解压之后文件夹名可能是Smarty.x.x.x,把它修改成smarty(此处只为将来使用方便起见,并非必须),然后将含有Smarty文件的文件夹拷贝到某一个目录下(建议不要放在你的网站目录下,这样别人可以通过路径访问到这些文件,如果非要放在网站目录下,那最好目录的名字起的生僻一些。这些文件即使被别人访问到,也未必造成安全问题,但是一切都为了以防万一)。
    在文章的下面内容中,我们都是假设你的文件放在了d:smarty下。

3、找到你的php.ini配置文件(可以通过运行phpinfo()查看此文件路径,但一般都放在系统目录下)修改php.ini的include_path选项,把smarty的库文件路径加上,比如:
    include_path = ".;d:smartylibs"
    提醒一下,php.ini中一共有两处include_path,一处是Unix下使用的,一处是windows下使用的,要修改windows下使用的:
-------------------------------------------------------------
; Windows: "path1;path2"

include_path = ".;c:phpincludes;D:PHPSmartylibs"
--------------------------------------------------------------
4、重新启动IIS/APACHE,重新启动的目的是使刚才的修改生效。
重新启动的方法很简单,APACHE直接restart即可。对于IIS,可以用net stop iiadmin命令关闭iis,然后用net start w3svc命令启动,就完成了重新启动。如果实在不会重启,就干脆重新启动计算机,这样最省事。
设置之后,在php文件中可以用include("Smarty.class.php");语句直接调用。

5、在你的网站目录下创建一个文件夹,名字任意,假设叫MySmarty:
    然后再在这个MySmarty目录下创建2个文件夹,templates和configs。
    创建完成之后如下:
    (你的网站目录)/MySmarty/templates     (这个目录用来存放模版)
    (你的网站目录)/MySmarty/configs   (这个目录用来存放一些配置信息)

6、在MySmarty目录下再创建两个文件夹,名字分别叫:smarty_cache和smarty_templates_c。为什么刚才不一起创建呢?因为这个步骤在原来的官方资料中没有,而我在配置过程中发现,如果没有这两个文件夹,smarty将无法工作,不知道是不是官方资料的smarty版本和目前最新的版本有出入的原因。但是只要配置这两个目录,Smarty便可以顺利工作。因此建议进行配置。

7、这时候你别忘了把我们上面从一开始到现在创建的四个文件夹的权限设置好。当然还包括存放smarty的文件夹d:smarty的权限,因为有的NTFS格式的系统有严格的权限规定,你的目录创建之后还得有足够的权限才能让web程序访问。一般来说win2000和win2003下采用NTFS分区格式的系统需要做这样的设定,具体方法是在文件夹上点击右键,在“属性”中打开“安全”标签,在里面列出了可以访问这个目录的用户列表,如果没有web访问权限,则需要添加,把Internet来宾帐户和启动IIS进程帐户两个帐户都添加上即可。如果觉得麻烦,可以直接将Everyone用户组添加上,允许任何用户访问。

8、这时候安装工作基本完成,可以进行第一个简单例子的测试:
    在你的网站目录下建立 index.php文件,并且在(网站目录)/smarty/templates/下建立index.tpl文件,分别输入以下代码   index.php

<?php
   //载入Smarty库
   include("Smarty.class.php");
   $smarty = new Smarty();
   //下面的(你的网站目录)用绝对路径,比如d:/intepub/wwwroot
   $smarty->template_dir = 'D:/WorkSpace/PHP/MySmarty/templates';
   $smarty->config_dir = 'D:/WorkSpace/PHP/MySmarty/config';
   $smarty->cache_dir = 'D:/WorkSpace/PHP/MySmarty/smarty_cache';
   $smarty->compile_dir = 'D:/WorkSpace/PHP/MySmarty/smarty_templates_c';
   //上面四行为使用Smarty前的必要参数配置
   $smarty->assign('name','跟17PHP学安装Smarty');
   $smarty->display('index.tpl');
?>
templates文件夹下
   index.tpl
   <html>
   <body>
   你好,{$name}!
   </body>
   </html>

9、现在终于可以观看以下自己的杰作了。运行index.php(当然是在你的web服务器上运行,和运行普通php文件完全一样。)
   http://localhost/index.php
   这时候如果看到下面的输出结果,说明你安装成功了~~~是不是很简单呢?
   你好,跟17PHP学安装Smarty!

 

   后记:虽然到此为止Smarty的安装已经完成,但是站长还是想给大家一点小建议。在上面的小例子中,可以发现如果我们每次使用Smarty前都需要设置参数,那未免过于麻烦。这时候你可以把smarty信息设置的四行代码包裹在一个类或者一个包含文件当中。这样就不用每次使用前都首先配置信息。关于这个就是Smarty的使用知识了,本篇文章不再涉及。站长目前也处在学习过程中,等到后面再继续推出和Smarty相关的文章吧~~~

三、整合

1. protected目录下建立文件夹vendor/smarty,把smarty的类包libs文件夹内容放入其中;     

 

2. extensions目录下边建立文件CSmarty.php

 

CSmarty.php文件具体内容如下(意思自己体会理解)

<?php

require_once(Yii::getPathOfAlias('application.vendor.smarty').DIRECTORY_SEPARATOR.'Smarty.class.php');

define('SMARTY_VIEW_DIR',Yii::getPathOfAlias('application.views.smarty'));

class CSmarty extends Smarty {

   const DS =DIRECTORY_SEPARATOR;

    function __construct() {

       parent::__construct();

       $this->template_dir =SMARTY_VIEW_DIR.self::DS.'tpl';

       $this->compile_dir =SMARTY_VIEW_DIR.self::DS.'tpl_c';

       $this->caching = true;

       $this->cache_dir =SMARTY_VIEW_DIR.self::DS.'cache';

       $this->left_delimiter =  '{';

       $this->right_delimiter = '}';

       $this->cache_lifetime = 3600;

    }

    function init() {}

}

      3. 根据CSmarty.php代码内容建立相应的文件夹(views下tpl,tpl_c,cache)

   4. 主配置文件设置

打开protected/config/main.php

components数组中加入

'smarty'=>array(

   'class'=>'application.extensions.CSmarty',

   ),

      5. 得到smarty实例 (修改actionindex函数)

  在控制器(protected/components/controler或controler/site)里边:

public function actionIndex(){

   Yii::app()->smarty-> assign('name','张三');   //Yii::app()->smarty(); (X)

    Yii::app()->smarty-> display('a.tpl');

}

  a.tpl所在目录protected/views/smarty/tpl/a.tpl,具体代码{$name}

 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
 <title>你好,{$name}!</title>
 </head>
 <body>
 你好,{$name}!
 </body>
 </html>

此时系统会报错:

 

原因: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类(frame目录下)里面的autoload函数,增加如下代码

  public static function autoload($className){

    //只要类名包含smarty的,无论大小写,都返回,

    //这样就跳出了YII自动加载类而去执行SMARTY的自动加载类函数了

   if(preg_match('/smarty/i', $className)){

     return;

    }

再次测试:OK

      6. 优化(通过)

action中直接用Yii::app()->smarty就可以试用smarty了。

如果每次在action中使用Yii::app()->smarty比较麻烦的话,

可以在components下的Controller中可以加入

protected $smarty = '';

protected function init() { ------public????

       $this->smarty = Yii::app()->smarty;

 }

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

原文地址:https://www.cnblogs.com/siliconvalley/p/3204746.html