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

    • 展示模板

    • 效果

    鲜花会生锈,盐巴会腐烂
  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/hunterxing/p/9903479.html
Copyright © 2011-2022 走看看