Smarty学习(上)

什么是Smarty?

Smarty是模板(html+css)引擎技术之一,可以使得“php代码” 与 “html代码” 分离的技术都称为模板引擎技术。(原来的公司的php代码使用了原生的php,网页展示是由html和php混合在一起开发的,根本不好看。后来使用thinkphp框架,才使的html和php代码分开,很清晰),除了smarty外还有其他的模板引擎技术:smarty、Template Lite、 TinyButStrong 、XTemplate 、Savant、 phemplate 、Dwoo、Sugar等。

为什么要有模板引擎技术

比如下面的代码,是php和html混合编程的例子,html代码和php混合在一起了,如果工程中出现过多这样代码非常不好,html部分应该是前端负责的部分,这样的话前端必须懂php,而且php工程师必须熟悉js,html,不利于分工合作,因为功能没有完全分离,而是紧密的联系在一起了,再有一点,html文件php语法是没有提示的,各种符号混在一起,经常容易出错。下面的两个案例php把js的工作给做了,是不合适的。

<div><?php echo "<span style='red'>".$title."</span>"; ?></div>
<td class="labels">
    <!--遍历学生个性标签并展示-->
        <?php
            foreach($labels as $v){
                //定义数组保存标签块展示颜色
                $class_name = array('blue','red','yellow','green');
                $index = array_rand($class_name);
                echo '<span class="'.$class_name[$index].'">'.$v.'</span>';
            }
        ?>
</td>

问题的关键是html中包含太多的php语法,可以通过事先的约定简化php变量在html的表示,然后在真正运行时候按照固定的模板将自定义的变量替换成需要的php语法就可以了。php加载html文件的顺序变成了:
php->html模板文件->模板引擎解析标签->php和html混合文件

如下是一个自己实现的微小的模板引擎。

smarty工程目录.png

index.php 中先用模板引擎将模板翻译成需要的html和php混编文件

 $name = 'zhangsan';
 $age = 10;
 require '../MiniSmarty.php';
 $smarty = new MiniSmarty();
 $smarty->assign('name',$name);//传递变量的值和属性,用于展示
 $smarty->assign('age',$age);
 $smarty->translate('../view/index.html');//翻译对应的模板
 require "../phtml/index.html.php";

模板引擎根据规则替换变量,并且将替换的内容保存到混编文件。

class MiniSmarty
{
    private $vars;
    function __construct()
    {
       $this->vars = array();
    }
    function get($varname){
        return $this->vars[$varname];
    }
    function assign($varname = 'null',$varval = 0){
        $this->vars[$varname] = $varval;
    }
    function translate($tp_file){
        //比如 {$var} 应该翻译为 <?php echo $var >
        $compf =  "../phtml/".basename($tp_file).".php";
        if(file_exists($compf)&&filemtime($compf)<filemtime($tp_file)) {
            require $compf;
            return;
        }
        $content = file_get_contents($tp_file);
        $content = preg_replace('#{\$([a-zA-Z][a-zA-Z0-9]*)}#',"<?php echo ".'$this->vars['.'"$1"'.']'."?>",$content);
        //替换完成后保存为html+php混编文件
        file_put_contents($compf,$content);
        require $compf;
    }
}

实际应用中规则肯定很多,绝对不仅仅只有上面这些。比如引用全局变量,if,for语句等等,所以Smarty引擎可以提供强大的模板替换功能。

学习使用Smarty

** 使用的smarty版本为3.1.16**
讲smarty的lib文件夹加入工程,打开smarty.class.php 查看模板和混编文件的目录,可以根据需求改变.

模板文件目录.png

还有其他的设置,比如分隔符标记,left_delimiter,right_delimiter 分别是{,};

使用smarty后生成的混编文件可以看到,和上面自己实现替换的方式类似

    <div>姓名:<?php echo $_smarty_tpl->tpl_vars['name']->value;?>
</div>
    <div>年龄:<?php echo $_smarty_tpl->tpl_vars['age']->value;?>
</

自定义变量assign

自定义的变量可以直接通过assign方式同上面那样在模板中调用.
<tr><td>assign变量</td><td>{$name}</td></tr>

全局保留变量

全局变量比如_GET,_POST,_SESSION等等通过如下方式调用
$smarty.xxx.variables

<tr><td>保留变量[_GET|_POST..]</td><td>{$smarty.get.getsvar}</td></tr>

配置变量

网上有些比较简单的变量信息,美工人员可以自己调用,不需要程序员,工作比较独立,可以实现通过配置文件实现配置变量信息。默认的配置目录是configs,所以在工程目录下建立configs,然后建立配置文件如configs,内容格式 变量名=变量值,比如:

COMPANY = 'beijing hskaoyan'
AUTHOR = 'ALL PROGRAMER'
TIME = '2017-3-10'

在模板文件首先应该引入改文件

{config_load file = "configs"}

然后采用下面方式调用

{#variable#}或者{$smarty.config.variable}
<tr><td>本地配置文件</td><td>{#COMPANY#}-{$smarty.config.AUTHOR}</td></tr>
  • 实用案例:通过配置文件改变样式

遇到问题,smarty语法和style的语法冲突

  1. 可以通过在style的{,}内部左右加空格。
    2.把smarty的标记{}更改为其他的标记。
    3.设置literal标记,内部内容不通过smarty解析。{literal}..{/literal}

配置文件:first、second、thrid 分别是节

[FIRST]
BC=yellow
TC=red
LH=30px
[SECOND]
BC=red
TC=yellow
LH=30px
[THRID]
BC=black
TC=yellow
LH=30px

在html可以指定配置文件的section,读取不同的内容。


{config_load file = "configs" section=$style}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div { color:{#TC#};background-color:{#BC#};line-height:{#LH#};margin: 0 auto }
    </style>
</head>
<body>
    <div>这是行内标签.根据不同的配置颜色不同</div>
</body>
</html>

数组遍历

1.foreach

{foreach  数组 as 下标变量  =>  值变量}
{foreach  数组 as 值变量}
    做具体数组遍历
{foreachelse}
    数组没有任何元素信息
{/foreach}

如下:

        {foreach $books as $key => $value}
        <tr><td>数组循环,索引{$value@index}</td><td>{$key}{$value}</td></tr>
        {foreachelse}
        <tr><td>数组循环</td><td>没有元素</td></tr>
        {/foreach}
  • foreach遍历数组内部关键字:
    值变量@iteration----------> 从1开始的序号信息
    值变量@index--------------> 从0开始的序号信息
    值变量@first--------------> 判断第一个元素,返回boolean
    值变量@last---------------> 判断最后一个元素,返回boolean
    值变量@total--------------> 获得数组元素长度(个数)
    值变量@show---------------> 判断当前数组是否有遍历元素出来, 返回boolean

  • section
    只遍历“索引”数组

{section  name=”自定义名称”  loop=”被遍历数组”}
      {$数组[名称]}  获得被遍历出来的元素的值
        关键字使用:
        {$smarty.section.名称.iteration}
              {$smarty.section.名称.index}
              {$smarty.section.名称.first}
              {$smarty.section.名称.last}
{/section}

分支结构

  1. 单路分支
    {if 条件} 代码 {/if}
  2. 双路分支
    {if 条件}{else}{/if}
  3. 多路分支
    {if 条件}{elseif 条件}{elseif 条件}...{/if}

html标签使用距离

$smarty->assign('sexs',array(0 =>'男',1 =>'女', 2 =>'保密'));
$smarty->assign('sex_select',1);
$smarty->assign('schools',array(0 =>'请选择',1 =>'小学', 2 =>'初中',3 =>'高中',4=>'大学'));
$smarty->assign('school_select',0);
$smarty->assign('hobbys',array(0 =>'篮球',1 =>'足球', 2 =>'羽毛球'));
$smarty->assign('hobbys_selects',array(0,1));
{html_radios name="user_sex" options=$sexs selected=$sex_select}
{html_checkboxes name="user_hobbys" options=$hobbys selected=$hobbys_selects}
{html_options name="user_school" options=$schools selected=school_select}

更多可以查看手册

已有模板和smarty结合

  1. 模板文件引入css、js、img文件路径相对“入口程序”文件设置
  2. 设置css样式文件本身的图片路径路径相对css文件本身设置


    模板和html结合路径设置.png

通过上图可以看出来,css文件本身的图片路径必须相对于css文件本身设置。
结合具体步骤:
把模板复制到View目录,复制js、css、img静态资源文件到public指定目录,在模板文件中设置路径引入静态资源(js/css/img)文件,路径相对入口文件设置css文件本身有引入img图片,其路径相对css文件设置,在入口php文件获得变量信息用于模板显示。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • PHP 学习目录 ├─PHP视频教程 1 LAMP网站构建 │ ├─PHP教程 1.1.1 新版视频形式介绍│ ...
    曹渊说创业阅读 16,147评论 29 417
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 知的定义 荀子给“知”下了一个准定义: “凡以知,人之性也;可以知,物之理也。”(《解蔽》) 这个知不是所谓知识,...
    徐红钢阅读 1,346评论 0 0
  • 初次知道镇远和凯里是大二,一次在北校图书馆的某本杂志上。这两个隐匿在黔东南的小城,名字里也隐约透露着些诗情画意。吸...
    木木木姝子xz阅读 317评论 0 0