zoukankan      html  css  js  c++  java
  • Smarty模板引擎

    一、Smarty模板引擎

    1.Smarty模板引擎简介

    Smarty分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,就是要使PHP程序员同前端人员分离,程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。

    • Smarty模板引擎优点:

      1)速度:相对于其他模板技术而言,采用Smarty编写程序可以获得最大速度的提高。

      2)编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不必进行重新编译模板(在源程序没有改动的情况下)

      3)缓存技术:Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。

      4)插件技术:Smarty可以自定义插件。插件实际就是一些自定义的函数。

      5)模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。

    • 不适合使用Smarty的地方:

      1)需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。

      2)小项目。因小项目简单而使美工与程序员兼于一人,使用Smarty会在一定程度上丧失PHP开发迅速的优点。

    2.Smarty模板引擎原理

    Smarty模板引擎的原理:把模板文件编译成php文件,然后每次都去读取模板的修改时间,没有修改就不编译。然后include这个“编译”后的PHP文件。所谓编译也就是模板用正则替换成含PHP代码的过程。模板文件和php程序文件经过模板引擎的编译后合成一个文件,即编译后的文件。

    3.Smarty开发模式与运行流程

    Smarty的这种开发模式是基于MVC框架概念。MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC已经成为一种软件设计典范,它用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

    • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。

    通常模型对象负责在数据库中存取数据。

    • View(视图)是应用程序中处理数据显示的部分。

    通常视图是依据模型数据创建的。

    • Controller(控制器)是应用程序中处理用户交互的部分。

    通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

    Smarty模板引擎将PHP程序直接生成模板文件,最终浏览器中读取的就是Smarty模板文件,并且Smarty能够对模板文件进行判断,如果是第一次或者模板已经改变,则重新生成。

    二、学习Smarty模板

    1.下载解压

    • 根目录:

    2.结构介绍

    • libs下:

    • demo下:

    3.基本实现

    • 配置

      test.php

      <?php
      //1.Smarty类的引入  引入上图的主文件
      require '../libs/Smarty.class.php';
      
      //2.Smarty类的实例化
      $smarty = new Smarty();
      
      //3.Smarty  "五配置两方法"
      $smarty -> setLeftDelimiter('{');         //左定界符
      $smarty -> setRightDelimiter('}');        //右定界符
      $smarty -> setTemplateDir('tpl');         //html模板的地址
      $smarty -> setCompileDir('template_c');   //模板编译生成的文件
      $smarty -> setCacheDir('cache');          //缓存地址
      
      //Smarty的缓存机制不太理想,可以不使用
      $smarty -> setCaching(Smarty::CACHING_LIFETIME_CURRENT);
      $smarty -> setCacheLifetime(300);
      
    • 基本操作

      test.php

      //1.注册
      $smarty->assign('title','学习Smarty');
      
      /*也可以分开
      $title = "学习Smarty";
      $smarty->assign('title',$title);
      */
      
      //2.展示模板
      $smarty->display('test.tpl');
      

      test.tpl

      {$title}
      

      以上实现了一个简单的模板注册数据以及展示数据

      总结步骤:

      Step 1:加载 Smarty 模版引擎。

      Step 2:建立 Smarty 对象。

      Step 3:设定 Smarty 对象的参数。

      Step 4:在程序中处理变量后,再用 Smarty 的 assign 方法将ji变量置入模版里。

      Step 5:利用 Smarty 的 display 方法将网页显示出来

    三、Smarty模板的设计

    1.模版注释

    ​ 模板注释被号包围,例如 *{ this is a comment *} **

    ​ 定界符可以改变,如果定界符改为<{}>

    ​ 则注释为 <{ this is a comment }>

    2.保留变量

    ​ 在Smarty模板中使用保留变量时,无须使用assign()方法传值,直接调用变量名即可。

    ​ smarty中常用 的保留变量:

    ```php
    {$smarty.now}            //取得当前时间戳
    {$smarty.const}          //直接访问php常量
    {$smarty.capture} 		 
    {$smarty.config}         //取得配置变量
    {$smarty.section} 
    {$smarty.template} 
    {$smarty.current_dir} 
    {$smarty.version} 
    {$smarty.block.child} 
    {$smarty.block.parent} 
    {$smarty.ldelim},  
    {$smarty.rdelim}
    ```
    

    自行百度

    3.变量调节器

    • capitalize (首字母大写)

      继续在代码实现:

      test.php

      //1.注册数据
      $smarty -> assign('habbit','i like eat apple');
      
      //2.展示模板
      $smarty -> display('test.tpl');
      

      test.tpl

      {$habbit|capitalize}
      

      效果展示:

      可以看出每个单词的首字母大写了

    • date_format (转换时间戳格式)

      test.php

      $smarty -> assign('date',time());
      

      test.tpl

      {$date|date_format}
      

      效果是将时间戳格式转换为我们可读的年月日

      {$date|date_format:"%B %e, %Y"}
      
    • default (默认展示)

      test.php

      //定义一个变量模拟 个人签名 为空的时候
      $signifcant = "";
      $smarty -> assign('signifcant',$signifcant);
      

      test.tpl

      
      

    效果展示:

    如果$significant不为空

    $signifcant = "哥只是个传说";
    

    效果展示:

    1540804977201

    从以上三个变量调节器中,我们了解到了变量调节器的作用以及用法

    后面的粗略列出:

    • escpae

      用于html转码,url转码,十六进制转码等。详见手册

    • lower/upper

      将变量字符串小(大)写

    • nl2br

      所有换行符转换成 <br/>

    • .......(后面自己看手册)

    4.流程控制

    • 条件判断

      • 基本句式

        {if $name eq "Fred"}
           Welcome Sir.
        {elseif $name eq "Wilma"}
           Welcome Ma'am.
        {else}
           Welcome,whatever you are.
        {/if}
        
      • 基本的条件修饰符:

        • eq (==)
        • neq (!=)
        • gt (>)
        • lt (<)

      注意:修饰词必须和变量或常量用空格隔开

      • 案例

      test.php

      $score  = 59;
      $smarty -> assign('score',$score);
      

      test.tpl

      {if $score gt  90}
        优秀
      {elseif $score gt 59}
        合格
      {else}
        挂科啦
      {/if}
      

      效果展示:

      • Smarty 的循环语句 section

        • 尝试使用

        test.php

        $arr2 = array(
            array(
                'title'  => 'Smarty的学习',
                'author' => '小明'
            ),
            array(
                'title'  => 'html的学习',
                'author' => '小红'
            )
        );
        $smarty -> assign('arr2',$arr2);
        

        test.tpl

        {section name=arrList loop=$arr2}
          {$arr2[arrList].author}
          {$arr2[arrList].title}
        {/section}
        

    • 以上是表格其他 section 的参数

      • foreach

        • 可用于循环关联数组

          test.php

          $arr2 = array(
              array(
                  'title'  => 'Smarty的学习',
                  'author' => '小明'
              ),
              array(
                  'title'  => 'html的学习',
                  'author' => '小红'
              )
          );
          $smarty -> assign('arr2',$arr2);
          

          test.tpl

          {foreach item=arrList from=$arr2}
            {$arrList.title}
            {$arrList.author}
            <br>
            {foreachelse}
            当前没有内容
          {/foreach}
          

          {foreachelse} 。同时,{section } 也支持 {sectionelse}

          不赘述。

        • Smarty 3之后,支持php原生的foreach 语法

          {foreach $arr2 as $arrList}
            {$arrList.title}
            {$arrList.author}
            <br>
          {/foreach}
          

    5.Smarty文件的引入

    • include

      先创建一个header.tpl 文件,待引入,写简单的一句话

      我是 header.tpl
      

      然后到 test.tpl 中去引入

      {include file="header.tpl"}
      

    ​ 效果如下:

    `include` 除了 `file` 属性之外,还有其他自定义的属性
    

    ​ 比如创建一个属性sitename 用他表示网站名称

    {include file="header.tpl" sitename="github"}
    

    ​ 这时候 header.tpl 里面就可以输出 sitename 的属性

    {$sitename}
    
    • Smarty类与对象的复制与使用

      • register_object方法,在Smarty中已经弃用

      • assign方法;将一个类的对象以变量的形式复制到smarty模板中使用

        test.php

        class A{
          function meth1(){
              echo "hello";
          }
        };
        
        $a = new A();
        $smarty->assign('a',$a);
        
        $smarty -> display('test.tpl');
        

        test.tpl

        {$a -> meth1()}
        

      这样就能输出 hello 的字样

    6.函数的使用

    • php内置函数

      test.php

      $smarty -> assign('time',time());
      $smarty -> display('test.tpl');
      

      test.tpl

      {"Y-m-d"|data:$time}
      

    前面"Y-m-d"是作为函数data()的第一个参数,冒号后面时data()的第二个参数

    打印出时间

    • 自定义函数

      • register

        $smarty -> registerPlugin('function','f_test','test);
        

    7.function函数库的定义和使用

    步骤:

    • 1.函数库自定义插件

    • 2.按照命名规范命名php文件

    • 3..按照命名规范命名自定义函数插件 smarty_function_插件名

      如下:(计算矩形面积的自定义函数插件)

    • 4.创建模板和展示模板

    area.tpl模板内容

    {test width=200 height=30}
    

    目录结构:

    1541237846733

    • 5.调试结果

    8.modifies变量调节器插件的定义和使用

    • 方法和自定义函数插件类似

      命名规范

    模板的内容:调用modifier插件

    9.block_function区块函数插件的定义和使用

    • 自定义区块函数插件

    • 创建模板

      1541302924497

    • 展示模板

    • 效果

    鲜花会生锈,盐巴会腐烂
  • 相关阅读:
    android 7.0带来的
    转 android 侧滑实现
    (转)30道面试题
    【转】关于手机号注册的一些思考
    一个美国人对"智能制造"的思考!
    【转】社区O2O的增量与存量,机会在哪?
    【转】30岁之前打好基础,无惧职场“35岁现象”! | 人力资源心理学
    Linux 复制、移动覆盖文件不提示
    使用DDMS测试安卓手机APP的性能(android)
    【转】测试思考——测试人员需要具备哪些素质?
  • 原文地址:https://www.cnblogs.com/hunterxing/p/9903479.html
Copyright © 2011-2022 走看看