您的位置:首页 > 其它

smarty总结

2016-07-22 19:59 363 查看
smarty语法  1.定界符 2.注释

 3.变量(1.通过assign分配过来的变量 2.保留变量,他是无需分配的直接在模板中使用(包括smarty本身的及超全局变量,其中常量是需要先定义,但无需分配) 3.配置变量 )

4.内置函数

(1.if/else  选择结构。和php中if/else几乎是一样的。唯一不同的是现在是使用smarty语句来书写的。{if},{elseif},{else}

2. foreach    重中之重   处理数组的情况最多,一维数组、二维数组、多维数组。   foreach是使用做多的。

格式有两种,如下:

ü {foreach $arrayvar as $itemvar}

ü {foreach $arrayvar as $keyvar=>$itemvar}

{foreach}还有一些属性,非常有用,有以下6个

ü @index , 当前数组索引,从0开始计算

ü @iteration,当前循环的次数,从1开始计算

ü @first,首次循环时,该值为true

ü @last,循环到最后一次时,该值为true

ü @total,总的循环次数,可在foreach内部使用,也可以在循环完成之后使用

@show,在foreach循环执行完之后,检测循环是否显示数据的判断

{foreach $arr1 as $k => $v}

<tr

{if $v@iteration is odd} class="odd" {/if}

>

<td>{$v.id}</td>

<td>{$v.name}</td>

<td>{$v['age']}</td>

</tr>

{/foreach}

3.section 也是用来循环的。只能遍历数字连续的索引数组。

<ul>{section name = 'index' start = 2 loop = $arr}

<li>{$arr[index]}</li>

{/section}</ul>

其中,name就是下标,而loop则是循环的次数。可以通过下标来访问我们的数组元素。结论:不要用section来遍历关联数组。
 
还需要注意一点,就是loop的取值可以是分配过来的数组的名字。
 
如果是关联数组,则会报错误

☞ 注意细节
ü loop 后面接的通常是 分配过来的数组,也可以直接写一个数字,如果接的是一个数组,则会计算其长度,作为其循环总次数。
ü 而item 相当于数组的索引值,即0
,1,2,这样的索引值。
ü 和foreach类似,可以使用index、iteration、first、last、total等属性,访问方式$smarty.section.name.index,其中name就是name属性的值。
 

在实际应用中,凡是能使用section的地方,都可以使用foreach,但是反之不行。所以一般我们只需要使用foreach即可。

 

 

4.变量修饰器

有的时候,我们在模板中使用数据,还需要做进一步的处理,而且只能在模板层面来处理。

比如,我们在完成无限分类的展示的时候,按照层级来进行显示。

如果有多个参数呢,只需要使用:隔开即可。
如truncate的使用

 注意细节
ü 除了smarty自带的一些调节器之外,php中的函数也是可以直接使用的
ü 可以在一个变量上使用多个变量调节器,多个之间使用 |隔开即可
ü 可以自定义变量修饰器函数
5.函数插件

作为前端开发人员,经常需要根据分配过来的变量,输出各种表现形式的html,如表单、表格等。

除了可以使用 foreach 来输出这些内容之外,smarty还 自带了一些自定义的函数插件,可以在模板内使用。

(1).单选html_radios

用于生成单选框组

(2).复选 html_checkboxes

用于生成复选框组

(3).下拉列表html_options

用于生成下拉列表

(4).cycle

用于循环交替某些值。)

5.Smarty实战

站在PHP开发人员的角度学习并使用smarty。
包括进阶安装(在项目中如何安装)、模板包含、模板继承、缓存。
1.在项目中引入smarty

[需求]:在中级项目shopcz中使用smarty。思考:我们的smarty应该放在哪儿?
是application还是framework呢?
答案是:都可以。
不同的程序员会有不同的考虑。如放到framework,把smarty作为框架的一个部分,thinkphp。
比如放到application中,将smarty作为第三方文件来引入,比如CI框架。
我们采取第二种,作为第三方的工具引入smarty。
注意保证文件夹层次的简洁性。将原来的libs更名为smarty。
具体怎么使用呢?

2.模板包含

[需求]:把商品详情页中的头部信息也显示出来
第一步,将头部的信息,单独的保存为header.html。注意,剪切的位置。
第二步,在模板页面中,使用include载入头部即可。
 
在项目中使用smarty模板引擎。
先复制smarty文件到application下的third-party下,然后在views下的home文件下建两个文件夹
  
然后在Basecontroller类文件下的构造函数中写引入smarty类文件,实例化smarty对象,注意让$smarty变成BaseController的一个属性,要不然一个函数的局部变量不能被继承,设置模板目录编译目录属性,分配变量,
然后再多分配一个index值为false(为了在IndexController中用true将index值覆盖掉,为了在header.html中区别要不要显示分类数据),然后让indexController等类文件继承BaseController类文件,然后再从模型中取数据,分配变量,最后调用smarty方法display,去引入视图目录中的模板。
模板包含:在index.html中提取出头部信息,到header.html中,然后在各模板文件中引入头部信息{include
 file= “header.html”},就是模板包含
在视图模板中通过smarty的定界符,内置函数,传过来的变量来输出数据
3.模板继承

先回忆一下php中的机制:

ü 首先,需要定义一个基类(父类),在父类中定义通用的属性或方法。

ü 其次,子类要通过extends来继承父类,父类中非私有的属性和方法都可以被继承过来。

ü 如果在子类中定义了一个和父类相同的方法时,则会覆盖父类的。

注意事项:

ü 布局页面可以有许多block,子级页面也可以有许多block,通过name属性进行关联。

ü 子级页面除了extends和block其他内容不予显示

ü 布局页面的block可以有默认内容,子级页面不实现就直接显示,实现就覆盖。

ü 布局页面的block可以彼此嵌套,子级实现可以有针对性实现。

ü {$smarty.block.child}布局可以调用子级的内容,{$smarty.block.parent}子级页面可以调用父级页面内容

 
我们如何来选择使用模板包含和模板继承?
ü 如果页面的公共部分比较少的时候,用包含就可以了。

ü 如果页面的公共部分比较多的时候,使用继承会好一些。

4.插件扩展

在smarty中,有这么几种函数,内置函数、变量修饰器、插件函数。通常内置函数不用扩展。扩展较多的是变量修饰器。
有时候,我们在页面中输出的时候,发现smarty提供的变量修饰器以及php函数都不能满足我们的需求,此时就扩展。
扩展写在什么地方?在plugins
五.Smarty缓存
常见的缓存形式有哪些?
数据缓存,站在数据库的角度(mysql),有些数据不是经常变化的,我们就可以把它缓存起来,下次再访问的时候,就直接访问缓存,极大了提升了效率。Memcached
文件缓存,也称页面缓存,有些页面,一旦生成,就不再变化,我们可以将这些页面缓存起来,就是直接将其转成静态页面,后续的访问就直接访问静态页面,极大了提升访问的效率。
页面静态化技术。
我们的smarty也实现了缓存,实现的是文件缓存
什么情况下缓存会失效呢?
已经过了有效期cache_lifetime的设置值.    缓存文件被删除.    模板文件被修改、
2.局部不缓存

一旦页面使用了缓存之后,那整个页面的内容就不会变化。
但实际上,在某些页面,需要动态的展示信息,比如时间、用户的状态。
意味着在我们的页面中, 有一小块内容是不缓存。
Smarty提供了一个局部不缓存的用法。
有三种方式:标签的缓存控制,即在标签中使用 nocache属性,适用于单个标签
ü 变量的缓存控制,即在分配变量时设置第三个参数为 true,适用于单个变量
ü 模板区域缓存控制,即在模板页面中使用{nocache} {/nocache},适用于一块
3.单模板多缓存

[需求]:在我们的商品详情页中使用缓存
原因:所有的商品都共享一个模板页面,所以就都使用了同一个缓存文件
需要将每个商品单独的生成一个缓存文件,这个就是单模板多缓存
实现很简单,只需要在display的时候,传递第二个参数,用来标识当前的内容。
4.缓存组

[需求]:对我们的列表页实现缓存    载入我们的列表页
还是可以使用缓存的。该怎么缓存呢?---smarty提供了缓存组的用法,实际上它是单模板多缓存的一种更为精细的用法。
 
自定义模板引擎
首先是模板类中属性有: //保存变量的数组属性
private $tpl_vars = array();
//模板目录
public $template_dir = "templates";
//编译目录
public $compile_dir = "templates_c";
方法://分配变量方法
public function assign($name,$value)作用:将变量的值存到模板类的数组属性中,
//载入模板方法
public function display($file)
display只是把模板文件内容取出来$content = file_get_content($file),经过引入解析类Parse,做了替换处理,此时的模板文件中的$title已经变成了<?php
echo $this->tpl_vars[‘title’];?>,再将此时的$content放到编译文件了file_put_contents($compileFile, $content);,然后再载入编译文件,此时的编译文件就是php文件了。也就是编译文件与index.php文件在一个页面中
 
模板引擎就是把php代码和html代码分开,php中的变量值怎样到html中呢,通过模板引擎解决.
  php中的变量值没有传到html中,只是保存到自己的数组属性了,然后在编译文件中要输出的变量值替换成了<?php echo $this->tpl_vars[‘title’];?>这种格式,所以就在视图层输出了php的变量值
就是运用了正则表达式匹配,字符串的搜索和替换preg_match(),preg_replace(),将模板文件变成了html与php混编格式的编译文件
display方法就是把模板文件拿到php文件中来,在display方法中引入解析类parse,调用解析方法parse,解析方法中调用了解析if,foreach,而且返回值是变量值

在php中如何来使用正则
使用正则的时候,注意两个小的细节:
ü 正则表达式应该放在//之间
ü 使用单引号引用

(4).正则表达式

http://deerchao.net/tutorials/regex/regex.htm
 
 
 
 
 
 
 
 
 

 
 

 

 
 
 

 
 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: