Smarty初学知识整理

  • web服务
web服务用的是SOAP(简单对象访问协议):是web服务的通信协议,用来定义返回消息的XML格式的规范
wsdl:web服务描述语言,包括一系列web服务的定义。
注意:PHP默认是不支持soap协议的,要开启soap协议

extension=php_soap.dll

<?php 
    $client = new SoapClient("http://webserver.com");
    $city=$client->getDomesticCity();
    echo "<pre>"
    var_dum($city);
?>

  • Smarty:用来将显示和内容相分离的框架

PHP代码 + HTML代码-->经过smarty将HTML中的定界符转换成PHP的定界符-->混编文件

//自定义smarty

<?php 
    $title = "静夜思";
    $content = "床前明月光,疑似地上霜,举头望明月,低头思故乡.";
    
    $str = file_get_contents('./demo.html');
    $str=str_replace('{','<?php echo $',$str);
    $str=str_replace('}',';?>',$str);
    file_put_contents('./demo.html.php',$str);
    
    require("./demo.html.php");
?>


优化smarty

上面例题中替换定界符的代码在每个PHP页面中都要出现,这样的代码不健壮,
解决:
将公共的代码封装到Smarty的compile()方法中

public function compile(){
    $str = file_get_contents('./demo.html');
    $str=str_replace('{','<?php echo $this->tpl_var["',$str);
    $str=str_replace('}','"];?>',$str);
    file_put_contents('./demo.html.php',$str);
    
    require("./demo.html.php");
}

封装后我们发现在类的内部不能输出类外面的变量。
解决:
定义一个私有属性用来保存变量,再定义一个共有的方法对私有的成员变量进行赋值。
<?php
    class Smarty{
        private $tpl_var=array();
        public function assign($k,$v){
            $this->tpl_var[$k] = $v;
        }
    }
?>

优化Smarty(二)
上面的缺点:每次执行页面,compile中替换字符串的代码都要执行,这样影响执行效率,
解决:
如果混编文件存在,并且混编文件的修改时间大于模板修改时间,则直接引入。否则重新生成。

public function compile(){
$compile_path=$tpl.'.php';
if(file_exists($compile_path) && filetime($compile_path) > filetime($tpl)){
    require $compile_path;
}else {
    echo 'create<br/>';
    $str = file_get_contents($tpl);
    $str=str_replace('{','<?php echo $this->tpl_var["',$str);
    $str=str_replace('}','"];?>',$str);
    file_put_contents($compile_path,$str);
    
    require($compile_path);
}
    
}

优化Smarty(三)
上面的缺点:所有的模板和混编文件都放在一起,不便于管理
解决:
新建一个模板文件夹(view,template),和编译文件夹(view_c,template_c),用来存放对应的文件



使用smarty

Smarty.class.php

templates:默认存放模板文件夹
templates_c:默认存放混编文件的文件夹
cache:存放缓存
configs:存放配置文件



注释
{*这是注释*}

  • smarty 的基础
普通变量
1、第一种声明方法:

require './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->assign("name","李白");
$smarty->display("demo.html");


2、第二种声明方法:
在模板文件中声明

{assign var="变量名" value="值"}

3.取值(不管声明的方法如何,取值方法一样)
{$name}
{$sex}

保留变量
在Smarty中有一个特殊的变量“smarty”,这个变量是保留变量,用来访问用户请求的信息,系统环境变量,常亮,类似于PHP中的超全局变量。
1.  获得get提交的值:例如:{$smarty.get.name}       $_GET
2.  获得post提交的值      {$smarty.post.变量名}    $_POST
3.  万能的获得值的方法      {$smarty.request.变量名}  $_REQUEST
4.  获取会话:               
在PHP中定义一个会话
$_SESSION["country"] = "China";
 
在模板中获取会话
{$smarty.session.country}
5、获取cookie
setCookie("school","peking university");
 
{$smarty.cookies.school}
6、显示常量
 define("city","shenzhen");
 
{$smarty.const.city}
7、取出服务器信息
{$smarty.server.REMOTE_ADDR}
8、取出当前时间
{$smarty.now}
9、其他的一些变量
{$smarty.version}
{$smarty.ldelim}
{$smarty.rdelim}

配置变量
1、在站点下新建configs文件夹,在文件夹中新建smarty.conf文件,代码如下:
 host=127.0.0.1
 username=root
 pwd=aaa
2、在模板文件中导入配置文件,并取值
 {config_load file="smarty.conf"}
 {#host#}<br>
 {#username#}<br>
 {#pwd#}
 
注意:
smarty将css的{解析了。
解决方法:
    1.更换定界符。
    2.在{后加空格
    3.使用{literal}{/literal}
    {literal}
        <style>
            div{...}
        </style>
    {/literal}


3、配置文件中的章节
[style1]  //定义章节
width="300px"
height="400px"
border="1 solid #F00"
backgroundcolor="#555";

调用章节中配置的变量
{config_load file="smarty.conf" section="style1"}

配置变量的注意:
(1)配置文件中的注释是“#”
(2)中括号表示节
(3)节定义的相当于局部变量
数组
smarty对数组的访问
1.  数组[下标]
2.  数组.下标
例如:
$smarty->assign("stu",array("tom","berry","ketty"));
$smarty->assign("emp",array("name"=>"libai","gender"=>"male"));

$smarty->assign('teacher',array(array("name"=>"libai","gender"=>"male"),array("name"=>"dufu","gender"=>"female")));

//访问
{$stu[0]}   {$stu.0}
{$emp.name}  {$emp["name"]}
{$teacher[0]["name"]}
{$teacher.0.["name"]}
{$teacher.0["name"]}
{$teacher[0].name}


foreach
如果不存在遍历的数组则执行{foreachelse}部分

{foreach $stu as $k=>$v}
{$k}:{$v}
{foreachelse}
{/foreach}

foreach内部关键字

语法 描述
值变量@iteration 从1开始的序号
值变量@index 从0开始的索引
值变量@first 判断是否是第一个元素
值变量@last 判断是否是最后一个元素
值变量@total 数组的长度
值变量@show 数组是否为空
<table>
    <tr>
        <th>是否是第一个元素</th>
        <th>编号</th>
        <th>索引</th>
        <th>键</th>
        <th>值</th>
        <th>是否是最后元素</th>
    </tr>
    
    {foreach $stu as $k->$v}
    {if $v@first}
    <tr class="first">
    {elseif $v@last}
    <tr class="last">
    {elseif $v@iteration%2==0}
    <tr class="even">
    {else}
    <tr>
    </if>
    
    <td>{$v@first}</td>
    <td>{$v@iteration}</td>
    <td>{$v@index}</td>
    <td>{$k}</td>
    <td>{$v}</td>
    <td>{$v@last}</td>
    
    {foreachelse}
    no such array;
    {/foreach}
</table>


判断
{if  条件}

{elseif  条件}

{else}

{/if}


section循环
只支持索引数组,不支持关联数组。
{section  name='自定义变量名'  loop='被遍历的数组'}
    {数组['自定义变量名']}
{/section}

section内置的关键字
{$smarty.section.自定义变量名.iteration}
{$smarty.section.自定义变量名.index}
{$smarty.section.自定义变量名.first}
{$smarty.section.自定义变量名.last}

{section name=s loop=$stu}
    {$stu[s]}-{$smarty.section.s.iteration}-{$smarty.section.s.index}
{/section}


for循环
{for $i=1 to 10}
    {$i}: Hello world<br>
{/for}

{for $i=1 to 10 step 2}
    {$i} : Hello world<br>
{/for}


while循环
{assign var='i' value=1}
{while $i<10}
    {$i++} : hello world<br>
{/while}


html_checkbox

1.
写法一
$smarty->assign('output',array('eating','play','sleep','swiming'));

<p>
    hobby:{html_checkboxes output=$output values=$value selected=$selected name='hobby' separator="<br>"}
</p>


2.写法二
$smarty->assign('options',array('a'=>'eating','b'=>'play','c'=>'sleep','d'=>'swiming'));

$smarty->assign('selected',array('a','c'));

<p>
    {html_checkboxes options=$options name='hobby' selected=$selected};
</p>


html_options:
<p>
{html_options options=$options name='hobby' selected=$selected multiple='multiple'};
</p>


html_radios:
{html_radios options=$options name='hobby' selected=$selected_radio};

  • 把已有的HTML和Smarty结合
1.在站点下新建public文件夹,在public文件夹中新建style,js,images文件夹,将素材copy到相对应的目录;

2.更改路径

<link href="//www.greatytc.com/public/style/style.css" rel="stylesheet" type="text/css">

<script src="/public/js/jquery.js">

</script>
<script src="/public/js/my.js">

</script>

<style>
    p{background:url(../imges.third_03.jpg) over;}
</style>

注意:HTML页面中素材的路径从根开始匹配,CSS中按当前路径开始匹配。


3.PHP代码
require './Smarty/Smarty.class.php';

$smarty = new $smarty();

$ticket = array(
    array('世界',100,23,'电子/纸质','>90人');
    array('世界',120,21,'电子/纸质','>90人');
    array('世界',150,24,'电子/纸质','>90人');
    array('世界',1060,2,'电子/纸质','>90人');
);

$smarty->assign('ticket',$ticket);
$smarty->display('index.html');


4.html模板代码
{foreach $ticket as $v}
    <tr>
        <td height="25"> align="center"><input name="checkbox" value=""></td>
        <td align="center">{$v.0}</td>
        <td align="center">{$v.1}</td>
        <td align="center">{$v.2}</td>
        <td align="center">{$v.3}</td>
        <td align="center">{$v.4}</td>
    
    </tr>

</foreach}

  • Smarty布局
一.

1.在站点下新建文件夹layout,在文件夹中新建一个template.html模板

<body>
    <h2>Head</h2>
    {block name="main"}{/block}   //通过名字来替换
    <h3>Footer</h3>
</body>

2.在模板中的代码
{extends file="layout/template.html"}  //继承布局文件

{block name="main"}<strong>举头望明月,低头思故乡.</strong>{/block}   //替换


一个模板中可以由多个{block}
<body>
    <h2>Head</h2>
    {block name="main"}{/block}   //通过名字来替换
    <hr/>
    {block name="main2"}{/block}
    <h3>Footer</h3>
</body>



{extends file="layout/template.html"}  //继承布局文件

{block name="main"}<strong>举头望明月,低头思故乡.</strong>{/block}   //替换

{block name="main2"}
    过年我要回家!!!!
{/block}



二.

头,中间(左右),脚

可以把中间的部分全部替换,也可以把右边的部分替换,这样就可以实现一个布局文件用于多个模板。
1、新建模板:template.1.html
<body>
    <h2>Head</h2>
<block name="main">
    <div id="main">
        <div id="left">
            Link1<br>
            Link2<br>
            Link3<br>
        </div>
        {block name="right"}
            <div id="right"></div>
        {/block}
    </div>
</block>
<h3>Footer</h3> 
</body>


2.替换main

{extends file="layout/template.1.html"}
{block name="main"}
    床前明月光,疑是地上霜.举头望明月,低头思故乡.
{/block}

替换right
{extends file="layout/template.1.html"}
{block name="right"}
    床前明月光,疑是地上霜.举头望明月,低头思故乡.
{/block}

包含文件
{include file='文件的路径'}

如果公共部分多:用布局文件
如果公共部分少,用包含文件。
变量修饰器

在用“truncate”截取字符串的时候,默认情况下用utf8编码,一个中文在utf8下占用3个字节,所以容易出现乱码。
解决方法:

开启 extension=php_mbstring.dll;



缓存

require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->caching=1;  //开启

$smarty->caching=1 |  true;开启smarty缓存,调用display()的时候,如有有缓存就从缓存中读取。
缓存文件的更新
1、删除对应的缓存
2、强制更新  $smarty->force_cache
3、更新模板,布局文件、包含文件。
4、设置缓存的生命周期。

$smarty->cache_lifetime=5;  //5秒

运算符
1、算术运算符
    一元运算符
        ++
        --
        -   一元减(负号)
    二元运算符
        +
        -
        *
        /
        %
    三元运算符
        条件?值1:值2

2、关系运算符
>
>=
<
<=
==
!=

3逻辑运算符

&&
||
!



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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,061评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,092评论 4 62
  • 伏天到,知了叫。 热气呶呶枝头绕。 古树难鸣荫太少, 孤芳自赏和声俏。 伏天到,知了叫 。 嗡嘤嗡嘤太阳高。 顶着...
    不惑而歌阅读 506评论 30 9
  • 2017.7月上旬 2017.7.同一天 2017.7.说实在话我也忘了是哪一天 2017.7.23456的日子 ...
    于凯的小迷弟阅读 765评论 0 0
  • 其实是要写10号的事情。但是十号太忙了。 上午特别困打算第一节课翘了,去上二三四节。结果一觉睡到十一点。什么课也不...
    BadNight阅读 193评论 0 0