Smarty初学知识整理

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

extension=php_soap.dll

getDomesticCity();
    echo "
"
    var_dum($city);
?>

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

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

//自定义smarty

',$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('{','tpl_var["',$str);
    $str=str_replace('}','"];?>',$str);
    file_put_contents('./demo.html.php',$str);
    
    require("./demo.html.php");
}

封装后我们发现在类的内部不能输出类外面的变量。
解决:
定义一个私有属性用来保存变量,再定义一个共有的方法对私有的成员变量进行赋值。
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
'; $str = file_get_contents($tpl); $str=str_replace('{','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#}
{#username#}
{#pwd#} 注意: smarty将css的{解析了。 解决方法: 1.更换定界符。 2.在{后加空格 3.使用{literal}{/literal} {literal} {/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 数组是否为空

    
    {foreach $stu as $k->$v}
    {if $v@first}
    
    {elseif $v@last}
    
    {elseif $v@iteration%2==0}
    
    {else}
    
    
    {foreachelse}
    no such array;
    {/foreach}
是否是第一个元素 编号 索引 是否是最后元素
{$v@first} {$v@iteration} {$v@index} {$k} {$v} {$v@last}
判断 {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
{/for} {for $i=1 to 10 step 2} {$i} : Hello world
{/for} while循环 {assign var='i' value=1} {while $i<10} {$i++} : hello world
{/while} html_checkbox 1. 写法一 $smarty->assign('output',array('eating','play','sleep','swiming'));

hobby:{html_checkboxes output=$output values=$value selected=$selected name='hobby' separator="
"}

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

{html_checkboxes options=$options name='hobby' selected=$selected};

html_options:

{html_options options=$options name='hobby' selected=$selected multiple='multiple'};

html_radios: {html_radios options=$options name='hobby' selected=$selected_radio};
  • 把已有的HTML和Smarty结合
1.在站点下新建public文件夹,在public文件夹中新建style,js,images文件夹,将素材copy到相对应的目录;

2.更改路径








注意: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}
    
         align="center">
        {$v.0}
        {$v.1}
        {$v.2}
        {$v.3}
        {$v.4}
    
    

  • Smarty布局
一.

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


    

Head

{block name="main"}{/block} //通过名字来替换

Footer

2.在模板中的代码 {extends file="layout/template.html"} //继承布局文件 {block name="main"}举头望明月,低头思故乡.{/block} //替换 一个模板中可以由多个{block}

Head

{block name="main"}{/block} //通过名字来替换
{block name="main2"}{/block}

Footer

{extends file="layout/template.html"} //继承布局文件 {block name="main"}举头望明月,低头思故乡.{/block} //替换 {block name="main2"} 过年我要回家!!!! {/block} 二. 头,中间(左右),脚 可以把中间的部分全部替换,也可以把右边的部分替换,这样就可以实现一个布局文件用于多个模板。 1、新建模板:template.1.html

Head

Link1
Link2
Link3
{block name="right"} {/block}

Footer

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逻辑运算符 && || !

你可能感兴趣的:(Smarty初学知识整理)