• smarty模板及其应用


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

    一、安装

    下载最新版本的Smarty。解压下载的文件。

    安装实例:

    (1) 在根目录下建立新的目录Project/,将刚才解压缩出来的目录的libs/拷贝到Project/里,再在Project/里新建cache/,templates/,templates_c/, configs/,plugins/。

    (2)在Project目录下新建init.inc.php文件作为配置文件,代码如下:

    <?php
    //配置文件,只要放在项目里面即可
    define("ROOT",str_replace("\","/",dirname(__FILE__)).'/'); //常量ROOT中指定项目根目录  //将反斜杠替换成正斜杠
    //__FILE__是指当前文件的绝对路径
    //echo str_replace("\","/",dirname(__FILE__))."/";
    
    require ROOT.'libs/Smarty.class.php'; //加载Smarty类文件
    
    $smarty = new Smarty(); //实例化Smarty对象<br>
    
    
    //$smarty -> auto_literal = false; //就可以让定界符号使用空格
    $smarty->setTemplateDir(ROOT.'templates/'); //设置所有模板文件存放位置
    //$smarty->addTemplateDir(ROOT.'templates2/'); //添加一个模板文件夹
    $smarty->setCompileDir(ROOT.'templates_c/'); //设置编译过的模板存放的目录
    $smarty->addPluginsDir(ROOT.'plugins/'); //设置为模板扩充插件存放目录
    $smarty->setCacheDir(ROOT.'cache/'); //设置缓存文件存放目录
    $smarty->setConfigDir(ROOT.'configs/'); //设置模板配置文件存放目录
    
    $smarty->caching = false; //设置Smarty缓存开关功能
    $smarty->cache_lifetime = 60*60*24; //设置缓存模板有效时间一天
    $smarty->left_delimiter = '<{'; //设置模板语言中的左结束符
    $smarty->right_delimiter = '}>'; //设置模板语言中的右结束符
    View Code

    二、应用示例

    在使用smarty模板时,只需将init.inc.php配置文件引入即可。因为在配置文件中已经有smarty实例化的对象,所以可以直接拿来用。

    请求smarty页面(不用显示,所以是纯php页面):

    <?php
    //请求smarty页面
    //先将配置文件引入,省的重新配置
    include("../init.inc.php");
    
    //注册变量,任何数据类型都可以
    $name = "张三";//字符串
    $age = 24;    //数字
    
    //$attr = array("淄博","张店"); //数组
    $attr = array("shi"=>"淄博","qu"=>"张店");
    class Ren     //
    {
        public $name = "王五";    
    }
    $r= new Ren();
    
    $smarty->assign("name",$name);
    $smarty->assign("age",$age);
    $smarty->assign("dizhi",$attr);
    $smarty->assign("ren",$r);
    $smarty->display("main.html");//显示模板页面,只需写文件名即可,samrty会根据模板文件存放位置(即templates文件夹)找到相应文件显示在请求页面
    View Code

    显示模板页面:

    <html>
    <head>
    <meta charset="utf-8" />
    </head>
    <body>
    <h1 >这是主页面</h1>
    <div>登陆者是:<span style="color:red"><{$name}></span></div>
    <div>年龄是:<{$age}></div>
    <!--<div>地址是:<{$dizhi[0]}></div>      可以取索引-->
    <!--<div>地址是:<{$dizhi['shi']}></div>  可以用关联数组-->
    <div>地址是:<{$dizhi.qu}></div>          <!--可以用"."点出来-->
    
    <div>好友:<{$ren->name}></div>
    </body>
    </html>
    View Code

    注意:1.注册变量用assign()方法,显示模板用display()方法,这都需要用对象去调用,而且没有提示,只能手写。

    2.用于显示的模板放在templates目录下,调用smarty时写在分界符<{ }>里面

     三、例题

    用smarty实现试题题目的显示和数据的增删改查

    创建页面:

    主页面(timu.php)

    <?php
    include("../init.inc.php");
    include("../DB.class.php");
    $db = new DB();
    include("../Page.class.php");
    
    //造查询条件   //千万注意空格
    $tj1 = " 1=1 ";//代表名称
    $tj2 = " 1=1 ";//代表科目
    if(!empty($_GET["name"]))
    {
        $tj1 = " name like '%{$_GET['name']}%' ";
    }
    if(!empty($_GET["kemu"]))
    {
        $tj2 = " kemu = '{$_GET['kemu']}' ";    
    }
    $ftj = " where".$tj1."and".$tj2;
    
    //查询总条数
    $sqlt = "select count(*) from timu".$ftj;
    $total = $db->StrQuery($sqlt);
    $page = new Page($total,3);
    
    //SQL语句查询timu表所有信息并分页显示
    $sql = "select * from timu ".$ftj.$page->limit;
    $attr = $db->Query($sql);
    
    //调用分页信息方法
    $fpage = $page->fpage();
    
    //查科目
    $sqlk = "select * from kemu";
    $attrk = $db->Query($sqlk);
    //注册变量
    $smarty->assign("fpage",$fpage);
    $smarty->assign("kemu",$attrk);
    $smarty->assign("shuju",$attr);
    //显示模板
    $smarty->display("timu.html");
    View Code

    主页面显示模板页面(timu.html)

    <h1>主页面</h1>
    <!--模板页面要查询数据库只能在后台php页面查询,然后注册smarty变量,然后才能在模板页面调用 -->
    <form action="timu.php" method="get">
        <div>
            请输入题目名称:<input type="text" name="name" /> &nbsp;
            所属科目:<select name="kemu">  
                        <{foreach $kemu as $vk}>      
                        <option value="<{$vk[0]}>"><{$vk[1]}></option>
                        <{/foreach}>
                    </select>&nbsp;
              <input type="submit" value="查询" />
        </div><br />
    </form>
    
    <table width="800" border="1" cellpadding="0" cellspacing="0">
        <tr>
            <td>题目名称</td>
            <td>答案</td>
            <td>所属科目</td>
            <td>难度</td>
            <td>类型</td>
            <td>操作</td>
        </tr>
        <!--smarty循环遍历数组,注意foreach是成对标签 -->
        <{foreach $shuju as $v}>
        <tr>
            <td><{$v[1]|truncate:15}></td><!--调用变量调节器截取字符串 -->
            <td><{$v[2]|fontcolor}></td>  <!--调用自定义变量调节器改变字体颜色 -->
            <td><{$v[3]|kmname|fontcolor:red}></td>     <!--调用自定义变量调节器转换科目代号为科目名称并改变字体颜色 -->
            <td><{$v[4]|nandu}></td>      <!--调用自定义变量调节器转换难度代号为难度名称 -->
            <td><{typename code=$v[5]}></td><!--调用自定义函数转换类型代号为类型名称 -->
            <td><a href="delete.php?code=<{$v[0]}>">删除</a> <!--注意smarty外面没有引号 -->
                <a href="update.php?code=<{$v[0]}>">修改</a>
            </td>
        </tr>    
        <{/foreach}>
    </table>
    <{$fpage}>
    <a href="add.php">添加数据</a>
    View Code

    添加数据页面(add.php)

    <?php
    include("../init.inc.php");
    include("../DB.class.php");
    $db = new DB();
    
    $sqlk = "select * from kemu";
    $attrk = $db->Query($sqlk);
    
    $sqln = "select * from timunandu";
    $attrn = $db->Query($sqln);
    
    $sqlt = "select * from timuleixing";
    $attrt = $db->Query($sqlt);
    
    $smarty->assign("kemu",$attrk);
    $smarty->assign("nandu",$attrn);
    $smarty->assign("type",$attrt);
    
    $smarty->display("add.html");
    View Code

    添加数据显示模板页面(add.html)

    <h1>添加数据</h1>
    <form action="addchuli.php" method="post">
        <div>请输入题目名称:<input type="text" name="name" /></div><br />
        <div>请输入选项A:&nbsp;&nbsp;&nbsp;<input type="text" name="a" /></div><br />
        <div>请输入选项B:&nbsp;&nbsp;&nbsp;<input type="text" name="b" /></div><br />
        <div>请输入选项C:&nbsp;&nbsp;&nbsp;<input type="text" name="c" /></div><br />
        <div>请输入选项D:&nbsp;&nbsp;&nbsp;<input type="text" name="d" /></div><br />
        <div>请输入答案:&nbsp;&nbsp;&nbsp; <input type="text" name="daan" /></div><br />
        <div>请输入科目:&nbsp;&nbsp;&nbsp; 
            <select name="kemu">
                <{foreach $kemu as $vk }>
                <option value="<{$vk[0]}>"><{$vk[1]}></option>
                <{/foreach}>
            </select>
        </div><br />
        <div>请输入题目难度:
        <select name="nandu">
                <{foreach $nandu as $vn }>
                <option value="<{$vn[0]}>"><{$vn[1]}></option>
                <{/foreach}>
            </select>
        </div><br />
        <div>请输入题目类型:
        <select name="type">
                <{foreach $type as $vt }>
                <option value="<{$vt[0]}>"><{$vt[1]}></option>
                <{/foreach}>
            </select>
        </div><br />
        <div><input type="submit" value="添加" /> &nbsp;<a href="timu.php"><input type="button" value="返回" /></a></div>   
    </form>
    View Code

    添加数据处理页面(addchuli.php) 

    <?php
    include("../DB.class.php");
    $db = new DB();
    $name = $_POST["name"];
    $daan = $_POST["daan"];
    $kemu = $_POST["kemu"];
    $nandu = $_POST["nandu"];
    $type = $_POST["type"];
    
    $a = $_POST["a"];
    $b = $_POST["b"];
    $c = $_POST["c"];
    $d = $_POST["d"];
    //添加题目  //所有值都不能为空
    if(!(empty($name) || empty($daan)))
    {
        $sql = "insert into timu values('','{$name}','{$daan}','{$kemu}','{$nandu}','{$type}')";
        //echo $sql;
            
    
        if($db->Query($sql,1))
        {
            //添加选项
            $id = $db->conn->insert_id;//取上一次添加的主键值  //主键值是自增长,必须通过对象去调用
            if(empty($a))
            {            
            }
            else
            {
                $sqla = "insert into xuanxiang values('','{$a}','A','{$id}')";
                $db->Query($sqla,1);
                if(empty($b))
                {}
                else
                {
                    $sqlb = "insert into xuanxiang values('','{$b}','B','{$id}')";
                    $db->Query($sqlb,1);
                    if(empty($c))
                    {}
                    else
                    {
                        $sqlc = "insert into xuanxiang values('','{$c}','C','{$id}')";
                        $db->Query($sqlc,1);
                        if(empty($d))
                        {}
                        else
                        {
                            $sqld = "insert into xuanxiang values('','{$d}','D','{$id}')";
                            $db->Query($sqld,1);
                        }
                    }
                }            
            }
            
            
            
            header("location:add.php");
        }
    }
    else
    {
        echo "添加失败!";    
    }
    View Code

    删除数据页面(delete.php)

    <?php
    include("../DB.class.php");
    $db = new DB();
    $code = $_GET["code"];
    //echo $code;
    //先删除选项
    $sqlx = "delete from xuanxiang where timu = '{$code}'";
    //echo $sqlx;
    $db->Query($sqlx,1);
    //再删除题目
    $sqlt = "delete from timu where code = '{$code}'";
    $db->Query($sqlt,1);
    header("location:timu.php");
    View Code

    修改数据页面(update.php)

    <?php
    include("../init.inc.php");
    include("../DB.class.php");
    $db = new DB();
    $code = $_GET["code"];
    $sqlt = "select * from timu where code = '{$code}'";
    $attrt = $db->Query($sqlt);
    
    $sqlx = "select * from xuanxiang where timu = '{$code}'";
    $attrx = $db->Query($sqlx);
    //var_dump($attrx);
    //因为要用下拉列表显示,所以要查询所有信息
    $sqlk = "select * from kemu";
    $attrk = $db->Query($sqlk);
    
    $sqln = "select * from timunandu";
    $attrn = $db->Query($sqln);
    
    $sqll = "select * from timuleixing";
    $attrl = $db->Query($sqll);
    
    //注册变量
    $smarty->assign("timu",$attrt);//题目
    $smarty->assign("xuanxiang",$attrx);//选项
    $smarty->assign("kemu",$attrk);//科目
    $smarty->assign("nandu",$attrn);//难度
    $smarty->assign("type",$attrl);//类型
    
    $smarty->display("update.html");
    View Code

    修改数据显示模板页面(update.html)

    <h1>修改数据</h1>
    
    <form action="updatechuli.php" method="post">
        <div><input type="hidden" name="code" value="<{$timu[0][0]}>" /></div><!--将timu表主键值传过去 -->
        <div>请输入题目名称:<input type="text" name="name" value="<{$timu[0][1]}>" /></div><br />
        
        <{foreach $xuanxiang as $vx}>
            <div><input type="hidden" name="id[]" value="<{$vx[0]}>" /></div><!--将xuanxiang表主键值传过去 -->
            <div>请输入选项<{$vx[2]}>&nbsp;&nbsp;&nbsp;<input type="text" value="<{$vx[1]}>" name="xx[]" /></div><br />
        <{/foreach}>
       
        <div>请输入答案:&nbsp;&nbsp;&nbsp; <input type="text" name="daan" value="<{$timu[0][2]}>" /></div><br />
        
        <div>请输入科目:&nbsp;&nbsp;&nbsp; 
            <select name="kemu">
                <{foreach $kemu as $vk }>
                    <{if $timu[0][3]==$vk[0]}><!--if是成对标签 -->
                        <option selected="selected" value="<{$vk[0]}>"><{$vk[1]}></option>
                    <{else}>
                        <option value="<{$vk[0]}>"><{$vk[1]}></option>
                    <{/if}>                
                <{/foreach}>
            </select>
        </div><br />
        <div>请输入题目难度:
        <select name="nandu">
                <{foreach $nandu as $vn }>
                    <{if $timu[0][4]==$vn[0]}>
                        <option selected="selected" value="<{$vn[0]}>"><{$vn[1]}></option>
                    <{else}>
                        <option value="<{$vn[0]}>"><{$vn[1]}></option>
                    <{/if}>
                <{/foreach}>
            </select>
        </div><br />
        <div>请输入题目类型:
        <select name="type">
                <{foreach $type as $vt }>
                     <{if $timu[0][5]==$vt[0]}>
                        <option selected="selected" value="<{$vt[0]}>"><{$vt[1]}></option>
                    <{else}>
                        <option value="<{$vt[0]}>"><{$vt[1]}></option>
                    <{/if}>
                <{/foreach}>
            </select>
        </div><br />
        <div><input type="submit" value="修改" /> &nbsp;<a href="timu.php"><input type="button" value="返回" /></a></div>   
    </form>
    View Code

    修改数据处理页面(updatechuli.php)

    传递主键值过来,根据主键值来修改数据

    <?php
    
    include("../init.inc.php");
    include("../DB.class.php");
    $db = new DB();
    $code = $_POST["code"];
    $name = $_POST["name"];
    $daan = $_POST["daan"];
    $kemu = $_POST["kemu"];
    $nandu = $_POST["nandu"];
    $type = $_POST["type"];
    $id = $_POST["id"];
    //var_dump($xuan);
    $xx = $_POST["xx"];
    //var_dump($xx);
    
    //修改题目
    $sql = "update timu set name='{$name}',daan='{$daan}',kemu='{$kemu}',nandu='{$nandu}',type='{$type}' where code = '{$code}'";
    
    if($db->Query($sql,1))
    {
        //修改选项
        for($i=0;$i<count($xx);$i++)
        {
        
            $sqlx = "update xuanxiang set name = '{$xx[$i]}' where code = '{$id[$i]}'";
            $db->Query($sqlx,1);
        
        }
        header("location:timu.php");
    }
    else
    {
        echo "修改失败!";    
    }
    View Code

     注意:1.分页时SQL语句一定要注意前后空格

    2.删除数据时先删除选项,再删除题目

    3.smarty模板前台显示需要查询数据库时,要在后台php页面查询,再注册smarty变量存储查询信息,然后前台再去调用smarty变量。

     四、smarty变量调节器与函数

    在主页面显示模板页面用到了几个smarty变量调节器与函数,有些是smarty自带的(在Project/libs/plugins/目录下),有些是自定义的(Project/plugins/目录下)

    下面是自定义的几个:

    1.自定义变量调节器改变字体颜色(modifier.fontcolor.php):

    <?php
    //用自定义变量调节器改变字体颜色
    function smarty_modifier_fontcolor($str,$color='green')//$str参数为前面的字符串
    {
        return "<span style='color:{$color}'>{$str}</span>";//返回一个替换了颜色的字符串
    }

    2.自定义变量调节器将科目代号转换为科目名称(modifier.kmname.php)

    <?php
    //用自定义变量调节器将科目代号转化为科目名称    
    function smarty_modifier_kmname($str)
    {
        //无法引用数据库类文件,只能自己写
        $conn= new MySQLi("localhost","root","xiao8888","mydb");    
        $sql = "select Name from kemu where code = '{$str}'";
        $result = $conn->query($sql);
        $attr = $result->fetch_row();
        return $attr[0];
    }

    3.自定义变量调节器将难度代号转换为难度名称(modifier.nandu.php)

    <?php
    //用自定义变量调节器将难度代号转换为难度名称
    function smarty_modifier_nandu($str)
    {
        $conn= new MySQLi("localhost","root","xiao8888","mydb");
        
        $sql = "select nandu from timunandu where code = '{$str}'";
        $result = $conn->query($sql);
        $attr = $result->fetch_row();
        return $attr[0];
    }

    4.自定义函数将题目类型代号转化为类型名称(modifier.typename.php)

    <?php
    //用自定义函数将题目类型代号转化为类型名称
    function smarty_function_typename($args)//传过来的数据以关联数组的形式存放在$args中
    {
        $conn= new MySQLi("localhost","root","xiao8888","mydb");
        $code = $args["code"];//根据关联索引取值
        $sql = "select type from timuleixing where code = '{$code}'";
        $result = $conn->query($sql);
        $attr = $result->fetch_row();
        return $attr[0];    
    }

    自定义的都存在Project/plugins/目录下,一定要注意书写格式,必须严格按照smarty自带的变量调节器与函数书写格式来写文件名称与方法。

  • 相关阅读:
    ajax 中$.each(json,function(index,item){ }); 中的2个参数表示什么意思?
    后台传list到前台,前台怎么解析,怎么将解析的数据填充到已经存在列名table中
    mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集
    虚拟机突然无法 联网,最简单及最可能的原因
    windows10,nodejs安装步骤
    Windows下Git与Node.js的安装
    Windows10下安装Git的详细教程
    django-admin.py startproject testdj 失败 没有工程文件夹
    在Pythonfor循环中如何获取循环次数?
    Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法
  • 原文地址:https://www.cnblogs.com/xinghun/p/5560603.html
Copyright © 2020-2023  润新知