美文网首页PHPPHP经验分享
(笔记)php-smarty模板引擎

(笔记)php-smarty模板引擎

作者: 十亩鱼塘 | 来源:发表于2015-12-18 13:59 被阅读2313次

    <h1>一、模板引擎简介</h1>
    <blockquote>什么是模板?</blockquote>所谓模板就是指无PHP代码,只有HTML+CSS+JS。
    <blockquote>什么是模板引擎?</blockquote>模板引擎主要工作就是对我们的模板(界面)与业务逻辑(PHP代码)相分离的一种解决方案。
    <h1>二、如何去开发一个模板引擎</h1>
    如何将PHP与HTML分离出来,想以前学过那些文件操作函数。
    demo03.php demo03.html


    demo03.php
    demo03.html

    <h1>三、封装自己的模板引擎</h1>
    思路:
    1、首先进行html页面与php页面分离
    2、分配变量到模板页面
    3、输出显示

    <?php
    class Template{
        //定义一个数组来接受数据
        private $data = array();
        //定义html(模板)路径
        //定义标签的左右标识符
        public $left_limiter = '<{';
        public $right_limiter = '}>';
        public $Template_dir="./";//./表示当前路径
            /**
             * 自定义模板框架*/
        /**
         * 定义一个方法来分离html和php代码
         * @param $name 表示标签
         * @param $value 表示替换的值*/
        public function assign($name,$value) {
            $this->data[$name]=$value;
        }
        //显示内容
        public function display($file){
            //获取html文件
            $str = file_get_contents($this->Template_dir.$file);
            
            foreach($this->data as $key=>$val){
                
                $str = str_replace($this->left_limiter.$key.$this->right_limiter, $val, $str);
            }
            echo $str;
            
        }
    }
    
    ?>
    

    下面我们讲smarty模板


    四、smarty模板

    <blockquote>smarty是基于PHP开发的PHP模板引擎,他提供了逻辑与外在内容的分离</blockquote>

    1、smarty的特点

    <li>速度:相对于其他模板引擎,smarty可以提供更快响应速度</li><li>编译型:把模板文件替换成一个HTML+PHP混合样式的PHP文件,当下模板没有改变,将自动转向导编译文件</li><li>缓存技术:实际上是把最终显示的页面文件,在一定的缓存时间内,生成静态html文件,当我们访问访问模板文件,将直接转向到静态页面html</li><li>插件技术:该模板引擎,可以自定义(函数),非常灵活</li>
    <blockquote>以下不适用于模板引擎</blockquote>
    <li>实时更新 比如:股票,天气预报</li>

    2、smarty下载和安装

    下载smarty

    文件减压后
    文件说明:
    demo:系统提供的实例文件
    libs:核心文件
    

    3、libs目录分析

    libs目录
    libs目录说明:
    plugins:自定义插件文件夹
    sysplugins:系统插件文件夹
    debug.tpl:调试模板
    Smarty.class.php:Smarty3.0中的核心类文件
    $martyBC.class.php:向后兼容类,Smarty2.0版本
    

    4、Smarty配置

    1)复制libs文件夹到项目目录下,改名为smarty方便以后使用
    2)配置系统默认文件夹,虽然运行过程,系统可以自动生成,但是,建议大家手动创建文件夹,如果在linux中,对我们的目录没有写权限的,所以要先建好相应的目录,目录参考smarty.class.php中


    创建目录的文件
    创建的目录:
    templates:定义默认模板文件夹
    templates_c:定义编译目录
    cache:定义缓存文件夹
    configs:定义默认配置文件夹
    

    5、编译原理

    <blockquote>如何判断模板文件是否改变?</blockquote>

    文件在系统中的表现形式有三个时间:
    创建时间:ctime
    修改时间:mtime
    访问时间:atime
    

    判断是否改变的依据是采用修改时间,判断修改时间是否有改变,改变就是模板发生了变化,否则就没改变

    编译原理图
    smarty开发流程
    1)把libs核心文件包含到我们当前项目中,并改名为smarty
    2)创建业务逻辑页面PHP页面和HTML模板页面
    3)在PHP中,包含Smarty.class.php文件到当前页面
    4)实例化对象
    5)分配变量到模板文件assign($name,$value)
    6)显示输出display($file)
    smarty开发流程图
    demo01.php demo01.html

    6、smarty中相关属性和方法

    1、左右定界符


    左右定界符
    修改左右定界符
    Paste_Image.png

    2、相关方法

    assign($name,$value)
    解析:assign函数分配变量到模板文件,$name标记名 $value赋的值
    display($file)
    解析:显示并输出相应的模板$file代表模板文件路径
    

    3、常用路径设置
    <li>setTemplateDir()</li><li>setCompileDir()</li><li>setConfigDir()</li><li>setCacheDir()</li>
    由于很多自定义系统不想采用默认的设置路径,那么可以通过set方法来定义目录结构


    自定义目录结构

    五、设计篇

    1、注释

    语法:{*注释代码*}
    
    注释示例代码

    2、变量
    2.1、从PHP中分配的变量

    $smarty->assign('title',$title);
    //2、分配一维数组变量到模板
    $lamp = array('linux','Apache','Mysql','PHP');
    $smarty->assign('lamp',$lamp);
    //3、分配二维数组到模板
    $person = array(
        array('name'=>'ly','age'=>'20','address'=>'cz'),
        array('name'=>'ly','age'=>'20','address'=>'cz'),
        array('name'=>'ly','age'=>'20','address'=>'cz')
    );
    $smarty->assign('person',$person);
    //4、分配对象到模板
    class Person{
        public $name;
        public function speak(){
            echo $this->name.'在说话...';
        }
    }
    $user = new Person();
    $user->name = 'ly';
    $smarty->assign('user',$user);
    

    模板页

    <html>
    <body>
    <h1>{$title}</h1>
    <hr>
    {*一维数组的调用方法*}
    lamp中的l:{$lamp[0]}
    <br/>
    lamp中的a:{$lamp[1]}
    <br/>
    lamp中的m:{$lamp[2]}
    <br/>
    lamp中的p:{$lamp[3]}
    <hr>
    {*二维数组的调用方法*}
    {$person[0]['age']}---{$person[0]['address']}
    <hr>
    {*对象的调用方法*}
    {$user->speak()}
    </body>
    </html>
    

    2.2、从配置文件中读取变量

    语法:{config_load file ="file.conf"}
    

    file:配置文件路径
    调用的方法:{#变量名#} 或 {$smarty.config.变量名}


    调用配置文件中的变量

    2.3在模板文件中创建

    {assign var='变量名称' value='变量的值'}
    
    Paste_Image.png
    {变量 = 变量值}
    
    Paste_Image.png

    扩展


    Paste_Image.png

    3、smarty中保留变量

    $smarty.get.page相当于$_GET['page']
    $smarty.post.page 相当于 $_POST['page']
    $smarty.cookies.username 相当于 $_COOKIES['username']
    $smarty.server.SERVER_NAME 相当于 $_SERVER['SERVER_NAME']
    $smarty.env.Path 相当于 $_ENV['Path']
    $smarty.session.id 相当于 $_SESSION['id']
    $smarty.request.username 相当于 $_REQUEST['username']
    $smarty.now 获取当前时间戳
    {$smarty.now|date_format:’%Y-%m-%d %H:%M:%S’}
    
    Paste_Image.png
    4、变量调节器
    <blockquote>什么是变量调节器</blockquote>实际上就是一些函数,这些函数的功能就是对变量进行格式化
    {$var|capitalize} 首字母大写
    {$var|count_characters:true} 字符计数
    {$var|cat:var2} 连接字符串
    {$var|count_paragraphs} 段落计数
    {$var|count_sentences} 句子计数
    {$var|count_words} 计算词数
    {$var|data_format:"%Y%m%d"} 时间格式化
    {$var|default:"value"} 如果变量为空或为定义,那么采用默认值
    {$var|escape} 编译转码
    {$var|indent:10:"*"} 首行缩进,后面的参数表示每个缩进字符要放的字符
    {$var|lower} 字符串小写
    {$var|nl2br} \n转<br/>
    {$var|regex_replace:"/[\t\n]/",""} 正则替换
    {$var|spacify:"^^"} 在字符之间插入相应字符如^^
    {$var|string_format:'%d'} 字符串格式化
    {$var|strip:'*'} 去掉重复空格
    {$var|strip_tags} 去除html标签
    {$var|truncate:30:'...'}:字符串截取,注意,优缺点
    {$var|upper} 大写
    {$var|wordwrap:30:'<br>'} 行宽约
    
    实例代码

    5、系统内建函数

    1capture

    语法:
    {capture var="content"}
    内容
    {/capture}
    

    作用:捕获一部分内容或变量,赋值给content
    调用方式:{$smarty.capture.content}


    capture 实例代码

    2config_load
    配置文件


    配置文件
    全局变量直接通过
    {config_load file="配置文件路径"}
    调用方式:{#变量名#}

    局部变量调用方式:
    {config_load file="配置文件路径" section="节的名称"}


    局部变量调用
    3foreach(采用PHP语法进行遍历)
    采用PHP语法进行遍历
    4foreach(采用smarty中的语法进行遍历)
    语法:
    {foreach from=数组 key=键 name=名称 item=内容}
    {foreachelse}
    {/foreach}
    参数说明:
    from:要遍历的数组名称,必选
    item:要遍历的内容或选项,必选
    key:代表数组的索引键值
    name:该foreach的名称
    
    采用smarty中的语法进行遍历

    <li>二维数组遍历</li>


    二维数组遍历

    <li>二维数组遍历有两种方式:</li>


    二维数组遍历的两种方式
    foreach--附加属性
    $smarty.foreach.name.index @index 下标0
    $smarty.foreach.name.iteration @iteration 迭代(当前是第几次循环),默认从1开始
    $smarty.foreach.name.first @first bool当时第一次该值为真
    $smarty.foreach.name.last @last bool当时最后一次该值为真
    $smarty.foreach.name.show @show 数据显示true显示数据,false不显示数据
    $smarty.foreach.name.total @total 循环的总次数
    
    foreach附加属性实例

    5、include 函数

    {include file='var' assign='var' [var...]}
    

    文件包含,同时可以通过assign进行变量传递


    图解
    实例代码

    6、include_php

    {include_php file='var' assign='var' once='true|false'}
    
    include_php实例代码

    7、if elseif else

    语法:
    {if}
    {elseif}
    {else}
    {/if}
    
    实例代码

    8、literal

    语法:
    {literal}
        .....
    {/literal}
    
    literal

    9、section sectionelse

    {section name=名称 loop=循环数组 start=开始(0) step=步阶(1) max=最大循环次数}
    {sectionelse}
    {/section}
    参数:
    name:代表section名称,在循环过程中,会作为索引,必选
    loop:代表循环数组,由其来确定循环的次数,必选
    start:默认从第几个元素开始遍历
    step:每次循环次数,默认是1
    max:最大循环次数
    

    一维数组的遍历:


    section

    二维数组的遍历:


    二维数组的遍历
    10strip函数
    {strip}
        ....
    {/strip}
    

    功能及应用:去除任何位于{strip}{/strip}标记数据中记录的首尾空格和回车,这样可以保证模板容易理解且不用担心多余的空格导致问题
    11counter

    {counter start=0 skip=2 print=false}
    {counter}<br>
    {counter}<br>
    主要功能:进行计数
    
    counter

    12cycle

    <tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}"/>
    实现轮显效果
    参数说明:
    values='参数1,参数2,参数3,...参数n'
    每次循环时,第一条采用参数1,第二条采用参数2,....
    
    cycle

    六、系统自定义函数

    1、{debug}
    功能:开启调试窗口


    Paste_Image.png

    2、fetch

    {fetch file="file" assign="var"}
    功能:载入文件到当前文件,并赋值给var变量
    输出是采用{$var}
    
    fetch实例代码

    3、html_image

    {html_image file="pumplink.png"}
    参数file:文件路径
    功能:显示图片
    
    html_image

    4、html_table

    {html_table loop=$data cols=4 table_attr="border=0"}
    参数:
    loop:要遍历的数组名
    cols:每行显示多少列
    table_attr:附加属性
    
    html_table

    5、html_checkboxes

    {html_checkboxes name='cust' value=$cust_ids checked=$customer_id output=$cust_names separator="<br/>"}
    参数:
    name 复选框的名称
    values 数组元素,复选框的值
    checked 被选中的元素,数组
    output 要显示的文字效果,数组
    separator 复选框之间的分割符
    

    6、html_options

    <select name=customer_id>   
    {html_options values=$cust_ids selected=$customer_id output=$cust_names} 
    </select>
    参数:
    values 要显示的值,数组
    selected 要选中的下拉选项,数组
    output 输出的文字,数组
    

    7、html_radios

    {html_radios values=$cust_ids checked=$customer_id output=$cust_names separator="<br />"} 
    
    Paste_Image.png

    七、程序篇

    1、常量
    SMARTY_DIR
    代表包含Smarty.class.php文件的路径,也就是说哪个文件包含Smarty.class.php,那么它就会自动到该目录下寻找相应的文件夹(如plugins)。
    2、常用的变量
    <li>$template_dir</li><li>$compile_dir</li><li>$config_dir</li><li>$cache_dir</li><li>$left_delimiter</li><li>$right_delimiter</li>


    常用的变量
    $caching            缓存 bool类型的值,true默认false
    $cache_lifetime     缓存过期时间,默认单位为秒
    $debugging      开启调试
    debugging,应用在php文件中
    功能:只能调试php中的变量信息
    {debug},应用在模板文件中
    功能:无论是php分配的变量或自定义的变量都可以进行调试
    $php_handling       主要应用就是{php}{/php},在Smarty3.0版本之前,如果想使用php标签,那么必须开启php_handing=true;
    

    3、常用方法

    assign 分配变量到模板文件
    assignByRef 分配变量到模板文件(引用)
    
    Paste_Image.png Paste_Image.png
    append 追加数据到数组,过程分为两步
    第一是追加数据到数组中
    第二分配变量到模板文件中(也就不需要assign赋值了)
    appendByRef 追加元素地址到数组中
    clearAllAssign 清除所有赋值变量
    clearAssign 清除指定变量的值
    
    Paste_Image.png
    clearCache 清理缓存
    configLoad 载入配置文件
    clearConfig 清除配置文件信息
    display 执行输出并显示指定页面
    fetch 载入文件到字符串
    

    <blockquote>如何在smarty模拟静态页技术?</blockquote>


    Paste_Image.png

    templateExists 判断模板是否存在


    Paste_Image.png

    七、缓存

    1、smarty中的缓存设置

    $smarty->setCacheDir($cache_dir) 设置缓存目录,不设置默认cache文件中
    $smarty->caching=true 开启缓存机制caching=true,默认为false
    
    Paste_Image.png
    编译目录代码
    编译目录代码
    缓存目录代码
    缓存目录代码
    <blockquote>为什么说缓存要快于编译?</blockquote>因为编译文件,只是把标签替换成PHP代码,如数据库访问,而我们缓存文件,是直接把数据都结果或值放入php文件中,所以不需要去读取数据库,那么速度更快一些。
    缓存优势:
    <li>速度要更快</li><li>减少服务器I/O开销,减小服务器的压力</li><li>减小对服务器数据库的压力</li>
    <blockquote>缓存文件是从哪里来的?</blockquote>由编译文件生成的
    <blockquote>编译文件是从哪里来的?</blockquote>访问PHP,通过Smarty调用html模板生成的。
    <blockquote>缓存在什么时候会重新生成?</blockquote>1)时间过期
    2)缓存删除
    3)编译文件改变的时候
    4)模板改变
    2、缓存在smarty中的工作流程
    工作流程
    3、缓存检测
    <blockquote>我们读取数据库中的文章,如果采用以前的方法,那么每次都要重复的读取数据库。我如何通过缓存机制,来避免这个问题</blockquote>解决思路:我们可以不可以把数据库中数据缓存到我们的缓存文件中,那么下次在去访问同一页面时,将直接读取缓存文件。
    $smarty->clearCache('tpl.tpl') 清除指定模板缓存文件
    $smarty->clearAll() 清除所有缓存文件
    

    注:这两个功能不开启缓存也可以使用

    Paste_Image.png
    4、缓存的存储方式
    我们的smarty缓存是存储在服务器的
    缓存存储方式
    5、局部缓存 局部缓存原理
    使用方法:
    $smarty->assign('var','value',true)
    
    Paste_Image.png Paste_Image.png Paste_Image.png

    6、单页面多缓存
    当我们第一次访问show.php?id=1时,以后每次请求都自动获取到了id=1这条数据库记录

    $smarty->caching=true
    $smarty->display('tpl',$id)
    参数
    最后那个参数,必须是唯一的,能区别所有的连接不同
    


    7、缓存集合

    八、过滤器

    <blockquote>中国政府是一个好政府。如何把该段输出的文字中的“政府”两字换成”**”</blockquote>

    过滤器的种类有三种:
    Prefilters:预过滤器
    Postfilters:后过滤器
    Outputfilters:输出过滤器
    
    用法:
    $smarty->registerFilter($type,callback)
    $type:过滤器类型(pre,post,output)
    callback:自定义函数
    

    相关文章

      网友评论

      • 小图思:public $left_limiter = '{';
        public $right_limiter = '}';
        //大神,左右分隔符应该这样定义吧,不然html标签都不完整,无法被浏览器解析。
        十亩鱼塘:这个是自定义的,你这样的是默认就是'{ }',我写的是自定义情况’

      本文标题:(笔记)php-smarty模板引擎

      本文链接:https://www.haomeiwen.com/subject/pzfphttx.html