zoukankan      html  css  js  c++  java
  • Smarty3学习笔记

    Smarty3 笔记
    By 飞鸿影~
    2014-9-23 21:46:38

    Smarty入门

    1、什么是smarty?
    Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,
    使php程序员只专注于php代码的编写,网页美工只专注于网页的美化

    2、采用模版引擎后:
    1)php代码与html代码分离开了,php代码放在一个单独的php文件中,html代码放在一个单独的html文件中
    2)数据的传递首现php中的数据先给了模版引擎,然后模版引擎再把接收到的数据给模版文件显示。
    3)模版文件中不再有php代码或者说php标记的出现,模版中显示的数据都是通过模版引擎的标记显示出来的

    index.php -> smarty模版引擎 -> index.html

    3、Smarty的优点:
    1)速度快:相对于其它的模版引擎而言的
    2)编译型:支持缓存技术,无需每次重新编译(在模版文件没有改动的情况下)
    3)模版中可以使用流程控制语句。

    4、Smarty模版引擎运作流程
    ①在php程序运行时,初始化smarty模版引擎
    ②smarty模版引擎读取模版文件(.html或tpl文件)
    ③在读取模版文件的时候,smarty模版引擎会自动判断该模版文件是否需要重新编译。
    ④如果不需要重新编译,则直接进行模版变量替换。
    ⑤如果是第一次执行此程序文件或者说模版被改动了,那么就需要重新编译后再进行模版变量替换。
    ⑥最终执行的是编译后的php文件。
    ⑦输出结果到浏览器。

    5、如何获得Smarty:
    到官方网站去下载smarty模版引擎压缩包
    官网:http://www.smarty.net
    解压后将libs目录拷贝至项目开发目录

    6、搭建Smarty模板示例:
    1)将libs库目录复制过来。
    2)创建一个模板目录templates模板文件存放目录
    创建一个configs配置文件目录
    3)编写index.php文件(入口文件)做Smarty导入和创建;templates目录中新建index.html模板文件
    ++ index.php 

    <?php
        require("libs/Smarty.class.php");    //导入Smarty类
        $smarty = new Smarty();    //创建对象
        $smarty->assign("name","zhangsan");    //向Smarty模板中分配变量name=zhangsan
        $smarty->display("index.html");    //使用index.html显示
    ?>

    ++ index.html 

    <html>
        {$name}
    </html>

    [小提示]
    assign():主要用来将php中的标量类型的数据赋值给模版变量
    display():主要用来显示指定的模版文件,可以指定路径

    [模板中如何显示分配的变量?]
    一般的变量,使用 {$var} 形式.例如我们这里分配的name=zhangsan,
    我们在模板index.html中使用 {$name} 显示.
    后面会讲述更多关于模板变量显示的内容.

    4)使用浏览器访问index.php,将会创建目录templates_c和cache目录

    5)最后的结构:

    根目录
     |--libs         //Smarty库
     |   |--Smarty.class.php
     |--templates     //模板目录
     |   |--index.html
     |--templates_c //模板编译目录
     |--cache        //模板静态缓存目录(注意需开启缓存)
     |--configs        //配置文件目录
     |--index.php   //php文件(入口)


    6)其他可选配置项(不改即为默认值):

    //配置
    $smarty->debugging=false;    //是否开启debug调试
    $smarty->template_dir="templates/";     //模板目录
    $smarty->compile_dir="templates_c/";    //编译目录
    $smarty->config_dir="configs/";     //配置项目录
    $smarty->cache_dir="cache/";    //缓存目录
    $smarty->caching=false;     //是否开启缓存
    $smarty->cache_lifetime=3600;    //缓存生命周期,单位是s
    $smarty->left_delimiter="{";    //左定界符
    $smarty->right_delimiter="}";    //右定界符

    7、Smarty应用之模版变量
    通常分配的变量有:字符串、数字、数组、对象
    [例]2.php:

    $smarty->assign("title","Smarty模板引擎实例--变量输出");//字符串
    $smarty->assign("num",100);//数字
    $smarty->assign(array("name"=>"zhangsan","age"=>23));//多个值
    $smarty->assign("a1",array(10,20,30));//索引数组
    $smarty->assign("a2",array("name1"=>"zs","name2"=>"zs2"));//关联数组
    $smarty->assign("ob",new Demo());//对象,含有公共属性name和age,为了节约篇幅,这里省略了类

    模板里访问分配的变量(templates/2.html):

    <h2>{$title}</h2>
    <ul>
        <li><a href="index.php">返回首页</a></li>
        <li>^_^{*注释的内容不会被输出*}</li>
        <li>输出一个数值:{$num},{$num*2}</li>
        <li>输出一个字符串:{$title},长度:{strlen($title)}</li>
        <li>输出一个数组里面的批量值:{$name},{$age}</li>
        <li>输出一个索引数组a1:{$a1[0]},{$a1[1]},{$a1[2]}</li>
        <li>输出一个关联数组a2:{$a2['name1']},{$a2['name2']}</li>
        <li>输出一个关联数组a2:{$a2.name1},{$a2.name2}</li>
        <li>输出一个对象:{$ob->name},{$ob->age}</li>
    </ul>

    8、模板里php函数使用(一般是return有结果的函数才直接使用)
    (templates/3.html):

    当前时间{date("Y-m-d H:i:s")}
    自定义函数:{fun()}

    **其中自定义函数在3.php中是

    function fun(){
        return "hehe";
    }


    9、模板里超全局变量使用(templates/4.html):

    <li>session中的信息:{$smarty.session.name}</li>
    <li>get中的信息:{$smarty.get.id}</li>
    <li>post中的信息:{$smarty.post.name}</li>
    <li>常量PI中的信息:{$smarty.const.PI}</li>

    **当然,得提前在4.php中定义才行:

    $_SESSION['name']="admin";
    $_GET['id']=100;
    $_POST['name']="yjc";
    const PI=3.14;

    更多还支持:
    诸如  $_GET, $_POST,$_COOKIE, $_SERVER, $_ENV and $_SESSION   都可以使用 {$smarty.post.get} 类似
    方法输出,记得改为小写

    10、模板从configs/目录读取配置文件
    模板里读取格式: {config_load file="lang.conf" section="en"} 
    其中section为可选项,配置文件后缀一般是conf,ini等

    举例说明配置文件格式(configs/user.conf)

    [users]
    username=zhangsan
    age=22

    模板里使用配置文件定义的变量方法是:

    {$smarty.config.username}或者{#username#}
    {$smarty.config.age}或者{#age#}


    11、模板里包含文件
    例如包含当前目录下menu.html

    {include file="menu.html"}


    12、模板里foreach遍历数组
    Smarty3.0新版使用格式(与php原生的基本一样):

    {foreach $data as $key=>$value}
        {$value.name}
        {$value.age}
    {/foreach}

    Smarty3.0同时兼容旧版使用方法:

    {foreach from=$data key="key" item="value"}
    
    {/foreach}

    [实践]
    当然,我们可以连接数据库后,使用之前写的Model.class.php数据库操作类写一个学生信息管理系统.
    通过使用switch,可以实现单个页面display多个页面,很类似ThnkPHP控制器的雏形.
    大概思路:

    switch($_GET['a']){
        case "add"://添加信息表单
            $smarty->display("stu/add.html");
            break;
        case "insert"://执行添加信息
            break;
        case "edit"://修改信息表单
            $smarty->display("stu/edit.html");
            break;
        case "update"://执行更新信息
            break;
        case "del"://删除信息
            break;
        case "index":
        default://浏览信息
            $s->smarty("stu/index.html");
    }

    Smarty高级

    1、Smarty保留变量

    {$smarty.now} 当前时间戳,同{$time()}
    {$smarty.const} 输出系统已定义常量,后面加上常量名
    {$smarty.capture} 捕获标签{capture name="mycap"}一些内容{/capture}里的内容,这里使用{$smarty.capture.mycap}读取
    {$smarty.config} 读取配置文件(如my.conf)里变量,后面加变量名。等效{#变量名#}
    {$smarty.section} (后续课程模板继承里讲解)
    {$smarty.template} 当前模板名(不包括目录)
    {$smarty.current_dir} 当前模板目录
    {$smarty.version} 当前Smarty版本
    {$smarty.block.child} (后续课程模板继承里讲解)
    {$smarty.block.parent} (后续课程模板继承里讲解)
    {$smarty.ldelim}, {$smarty.rdelim} 输出当前左、右定界符


    当然,在上一节内容,我们还学习了 {$smarty.get},{$smarty.post},{$smarty.session},{$smarty.cookie},{$smarty.server},{$smarty.env},{$smarty.request} 等PHP全局变量.

    2、Smarty变量调节器

    1)系统提供的调节器(*号标注表示使用较多.大部分使用频率不高,了解即可):

    *capitalize [首字符大写] 
    cat [连接字符串] 
    count_characters [字符计数] 
    count_paragraphs [计算段数] 
    count_sentences [计算句数] 
    count_words [计算词数] 
    *date_format [格式化日期] 
    default [默认值] 
    escape [转义] 
    indent [缩进] 
    lower [小写] 
    *nl2br [换行符替换成 <br />] 
    regex_replace [正则替换] 
    *replace [替换] 
    spacify [插空] 
    string_format [字符串格式化] 
    strip [去除(多余空格)] 
    strip_tags [去除html标签] 
    *truncate [截取] 
    *upper [大写] 
    wordwrap [行宽约束] 


    使用方法示例(2.html):

    <li>原字符串:{$str}</li>
    <li>首字母大写(有点用):{$str|capitalize}</li>
    <li>大写:{$str|lower}</li>
    <li>新闻:{$content|strip_tags|strip|truncate:0:20:"utf-8"}...</li>

    2)自定义调节器(采用插件文件方式):
    a)在smarty模板的libs/plugins/目录下创建调节器:
    调节器文件名:modifier.调节器名.php

    注意:若是自定义的的调节器不在libs/plugins/目录下,需要使用下面Smarty的方法追加。
    如:  smarty->addPluginsDir("./libs/myplugins");//追加一个插件目录的方式 
    注意清除编译缓存目录
    b)在这个文件里的函数名:

    function smarty_modifier_调节器函数名(参数列表...){ //..... }

    例如:

    /**
    * 自定义调节器:字符串截取函数
    * 参数:
    * $str:表示被截取的字符串
    * $len:保留字串的长度值。默认值:10
    */
    function smarty_modifier_mystr($str,$len=10){
        if(strlen($str)>$len){
            return substr($str,0,$len)."...";
        }else{
            return $str;
        }
    }

    注意:在使用是,要按函数的参数顺序来。
    c)使用 {$str|调节器名} 

    练习:自定义一个调节器: myfont($str,$size,$color) 
    如: {$str|myfont:7:"red"}  =>输出:  <font size="7" color="red">$str</font> 

    3)自定义调节器(采用注册调节器方式):
    除了上面的方法外还有一个方式可以定义一个变量的调节器
    使用Smarty的一个方法: registerPlugin("modifier","调节器名", "被指定的函数名"); 
    例如: 

    $smarty->registerPlugin("modifier","mystrlen","strlen");//注册一个调节器的函数


    使用: 

    {$str|mystrlen} //输出str字串的长度

    4)组合调节器:

    {$articleTitle}
    {$articleTitle|upper|spacify}
    {$articleTitle|lower|spacify|truncate}
    {$articleTitle|lower|truncate:30|spacify}
    {$articleTitle|lower|spacify|truncate:30:". . ."}

    3、Smarty中的函数

    (标注*号为实用的)

    格式:

    {函数名 属性1="值1" 属性2="值2" }
    {/函数名}

    1)内置函数

    {assign}  在模板中定义并变量,并赋值
    示例:

    {assign var="name" value="Bob"}{assign "name" "Bob"} {* 简写 *}


    {$var=}  简写模板中定义变量(同assign),
    示例:

    {$name='Bob'}{$user.name="Bob"}{$users[]="Bob"} 

     {append}  在模板执行期间建立或追加模板变量数组。
    示例:对数组name追加成员值

    {append var='name' value='Bob' index='first'}


     {function}  用来在模板中创建函数,可以像调用插件函数一样调用它们。
     {call}  用来调用{function}标签定义的模板函数
     {capture}  用来捕获模板输出的数据并将其存储到一个变量里,而不是将它们输出到页面。
    {config_load} 载入配置文件:用来从配置文件(位于configs目录)中加载config变量(#variables#)到模版。
    示例:

    {config_load file="lang.conf" section="en"}

     {debug}  显示调试控制台
    {for}  简单的循环
     {for} 标签用来创建一个简单循环,支持 {forelse} 分支标签且支持以下不同的格式:

    {for $var=$start to $end}步长为1的简单循环; 
    {for $var=$start to $end step $step}其它步长循环。

    示例:

    <ul>
    {for $foo=1 to 3} 
    <li>{$foo}</li>
    {/for}
    </ul>

    {foreach},{foreachelse}  

      3.x版格式:

    {foreach $data as [$k=>]$v}
    //输出$k / $v
    {/foreach}

      2.x版格式(仍然兼容)

    {foreach from=$data item="v" key="key"}
    {/foreach}

    {if},{elseif},{else}  
    每一个{if}必须与一个{/if}成对出现,允许使用{else}和{elseif}。
    所有php条件和函数在这里同样适用,诸如||、or、&&、and、is_array()等等。
    例如:

    {if $name == 'Fred' || $name == 'Wilma'}
    ...
    {/if}

    *{include} 包含其他模板
    例如:

    {include file="header.html"}
    {include file="sider.html"}

    {insert}标签类似于{include}标签,不同之处是即使打开caching,它所包含的内容也不会被缓存,每次调用模板都会执行.
    该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域。

    {* 获取一个横幅广告示例 *}
    {insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

    {block} 用来定义一个命名的模板继承源区域。
    {extends} 标签用在模板继承中子模版对父模板的继承。

    {ldelim},{rdelim} 用来转义模版定界符,默认值为"{"和"}"。
    *{literal} 标签区域内的数据将按字面意思处理,代表性地是用在javascript/css语块周围
    {nocache} 用来禁止模版块缓存,每个{nocache}应与{/nocache}成对出现。
    {php},{include_php}已被Smarty弃用,不应再使用。还是用你自己编写的php脚本或插件函数来代替它吧!
    *{section},{sectionelse}
    {while}

    2)Smarty扩展函数(Smarty自定义的,使用频率不高,了解即可)

    {counter} 
    {cycle} 
    {eval} 
    {fetch} 
    {html_checkboxes} 
    {html_image} 
    {html_options} 
    {html_radios} 
    {html_select_date} 
    {html_select_time} 
    {html_table} 
    {mailto} 
    {math} 
    {textformat}

    4、缓存

    1)配置开启缓存

    $smarty = new Smarty;
    $smarty->caching = true;//开启缓存
    $smarty->cache_lifetime = 3600;//缓存开启1小时

    一般不建议全站开启缓存,哪个页面需要就开启哪个。
    所以,不要把缓存配置写在公共配置文件里

    2)Smarty里缓存相关方法

    isCached() 检测模板是否具有有效缓存
    clearCache() 清除指定模板缓存
    clearAllCache() 清除整个模板缓存

    3)使用情况示例
    比如学生信息的增删查改操作,我们在查询时可以缓存:

    if(!$smarty->isCached("index.html")){
    $data=$m->select();
    $smarty->assign("data",$data);
    }
    $smarty->display("index.html");

    对于增删改,我们不应该使用缓存,所以在执行相关操作成功后,应该清除缓存:

    if($res){
       $smarty->clearCache("index.html");
    }

    但是这样还有个Bug,就是你不管修改哪个用户数据,进入edit页面,表单里数据不变。
    那么这时候只能使用多级缓存了,用户修改页面就要这样写了:

    if(!$smarty->isCached("stu/edit.html",$_GET['id'])){
        $stu = $mod->find($_GET['id']);
        $smarty->assign("data",$stu);
    }
    $smarty->display("stu/edit.html",$_GET['id']);

    那么update更新成功后应该清除两个缓存:

    $smarty->clearCache("index.html"); //清除浏览缓存
    $smarty->clearCache("edit.html",$_POST['id']); //清除修改表单缓存
  • 相关阅读:
    vuesocket.io在单文件中使用(进入到单文件再发请求)
    el-tree设置默认展开及选中
    Vue项目中解决跨域问题
    echarts堆叠条形图计算总数()
    原生js实现点击目标区域外侧触发事件
    js构造树形菜单
    wangEditor服务器上传图片(Vue使用)
    webpack(6) 打包多页应用和sourcemap 使用
    NoSql相关
    Markdown
  • 原文地址:https://www.cnblogs.com/52fhy/p/3989446.html
Copyright © 2011-2022 走看看