smarty1

Smarty就是为了让美工人员与程序开发人员更好的合作。

Html静态模板页面

Php程序是不是动态处理页面

我们是不是可以通过smarty来把这两个页面进行结合呢?

生成一个编译文件。Htm+php的便已经文件呢.形式如下

smarty1_第1张图片

test1.html.php


然后我想说,大家知道smarty怎么安装?


我们解压缩之后,是不是就有如下的这几个文件呢

 

里面是不是有一个libs文件,我们就要用到这个文件,把它直接拷贝到我们的文档根目录就可以了。

smarty1_第2张图片

大家看一下,里面是不是就有Smarty.class.php这个Smarty.class.php这个类文件呢。

$smarty=new Smarty();//实例化一个Smarty对象。

Smarty里面系统预定义了几个东西,大家知道吗?

把变量赋给smarty模板对象,大家知道怎么来做吗?


我们怎么来展示模板,生成编译文件呢?


上面两个函数就是固定的smarty函数。

 

在我们的smarty内部,有一个专门编译模板文件的函数


这个函数,用于返回生成的模板文件。来供我们调用。

其实,smarty的核心就是模板html文件里面的变量,进行字符串的替换,然后输出。

{$name}  $right_deilimiter右定界符 $left_deilimiter左定界符

当然了,定界符只要不是特别特殊,可以是其他的,比如{<$name>},这样是不是也是可以的。关于smarty的配置问题,后面我们再说。

上面就是自己实现smarty,自己看代码,代码目录是:D:\php2016\2016_11_15\smarty

下面就来说一下,当我们用官方smarty的时候,怎么用,怎么配置,关于他的用法我们就不多说了,我们都能写了,还不知道怎么用吗?

我希望大家明白,软件工程规范规定了啊,我们尽量把代码要做到优化,还有就是可能出现的情况我们必须要做到全方位的分析。大家看一下,我们加入的下面的代码的用法:

smarty1_第3张图片

下面是自己写得到一个具体的smarty模板代码:

class MiniSmarty
{
public $tpl_val=array();//接收给模板传递的变量信息
public $tpl_dir="./templates/";//模板文件目录
public $tplc_dir="./templates_c/";//编译文件目录
//声明一个方法给$tpl_val进行赋值
function assign($name,$value)
{
$this->tpl_val[$name]=$value;
}
//展示模板
function display($tpl)
{
$c_file=$this->compile($tpl);
include $c_file;//引入了编译后的文件。
}
//封装一个方法,把html模板文件引入,进行内容替换
//做编译的一个工作,把php和html代码结合
function compile($tl)
{
$tpl=$this->tpl_dir.$tl;//编译文件,找到当前文件的内容index.html->index.html.php(编译后的文件)
$tpl_c=$this->tplc_dir.$tl.".php";//编译后文件的名字
//下面我们来优化一下我们的代码
//模板文件如果修改,重新生成,模板时间大于编译文件时间,模板修改,就要重新生成编译文件
if(file_exists($tpl_c) && filemtime($tpl) < filemtime($tpl_c))//模板修改三角时间必须小于编译时间
{
//如果文件存在,直接返回这个文件
return $tpl_c;
}
$tplcont=file_get_contents($tpl);//把文件内容写入一个字符串,这个是编译文件里面的内容
//对$tplcont的内容进行替换
$tplcont=str_replace("{\$","tpl_val['",$tplcont);
$tplcont=str_replace("}","']; ?>",$tplcont);
//把替换好的字符串信息写入一个具体文件(编译文件html+php)
file_put_contents($tpl_c,$tplcont);//把内容写入文件
//echo $tplcont;
return  $tpl_c;//引入编译后的文件
}
}
?>

我们如果想配置一下,比如换定界符,比如改变模板文件存放目录的名字,编译文件存放目录名字,我们怎么来做。Smarty自己是很强大的对不对,既然别人强大,我们就不用花很多时间让自己强大,继承就可以了extends

smarty1_第4张图片

上面我们先把文件拿出来,下面我们再来讲解。先来看看官方smarty里面自己写的代码:

smarty1_第5张图片

上面是不是左定界符与右定界符。还是公有的,也就是继承了,就直接可以修改的。

smarty1_第6张图片

这里面是不是还有一个方法来设置模板目录与编译文件目录。

smarty1_第7张图片

是不是还有变量可以设置模板文件目录名字与编译目录名字

compile_dir

template_dir

所以说,设置模板存放目录名字与编译文件目录名字,我们就有两个方法,一个是

$smarty->setTemplateDir(“./view”);

$smarty->setCompileDir(“./view_c”);

 

$smarty->template_dir=”./view”;

$smarty->compile_dir=”./view_c”

smarty官方里面,当编译文件目录不存在的时候,是可以创建的,如果自己没有设置,就以官方创建的为基准,如果自己设置了,就以自己创建的为基准。

这里是不是回延伸出一个问题,就是说,当我们用{}作为定界符的时候,如果HTML里面写的有javascript代码,或者有其他类似的有花括号的代码,是不是就会把javascript里面的连个括号进行解析呢,我在这说明一下,当没有写在一行的时候,smarty非常的智能,并不会进行解析,当写在一行的时候,smarty就是一个蠢货,就会进行解析。处理方法。

 

加上{/literal}这个标签,里面的代码就不会被smarty解析了。

我们要知道,当我们继承了父类的smarty ,我们需要在当前类里面,实现父类的构造方法。

parent::__construct;,这个就是实现父类的构造方法。

然后在封装我们配置的变量信息。

我还想说明一点,就是说,smarty考虑使用变量的时候,一定要考虑定界符知道吗。

Smarty可以使用那些变量?

1.使用smartyassignappend分配的一个变量

2.使用配置文件中的变量,我们学习smarty就要考虑定界符呢

3.使用{$smarty中的保留变量}

{$smarty.now}显示当前系统的时间戳

{$smarty.template}返回当前的模板名称

{$smarty.template_object}返回当前的模板对象

{$smarty.current_dir}返回当前模板目录名称

{$smarty.version}返回$smarty的版本信息

{$smarty.ldelim}返回的是左边定界符

{$smarty.rdelim}返回的是右定界符

4.还可以使用常量

常量怎么访问?

php页面是不是如下定义一个常量。

define(“AGE1”,”25”);

HTML页面怎么接受这个值,美工设计好的要用,怎么才能用到呢?

{$smarty.const.AGE1} //25

当然了,超全局数组是不是类似呢?

{$smarty.get.变量名}这个就可以获取超全局数组get穿传递过来的变量。

Ok.大家应该明白

大家知道配置文件变量怎么用?

配置文件的作用,就类似于你上百度,你不想要这个主题,你想换一个主题,就要用到配置文件,给我感觉配置文件的作用就”是局部影响整体”,也可以通俗的说,一地震,毁了一座城市。

怎么使用?

在头部使用如下方式

{config_load file=”配置文件名字不加路径”}

不加路径啊,因为smarty非常的智能,他会去解析这个路径,然后得到我们想要的文件

而且,我还想说,配置变量的调用与普通变量不一样,配置变量要多加两个#

{#配置变量名字#}

{$smarty.config.配置变量名字}//这样也可以访问配置文件当中的配置变量

在配置文件里面,配置变量是不你加入$符号的。

下面我给大家非常深入的讲解一下配置变量的使用。

smarty1_第8张图片

在HTML文件里面我们你引入了这个配置文件

smarty1_第9张图片

上面每一个部分我理解为一个快。当谁的块在下面的时候,谁在模板文件里面就被调用了。我们不可能一到需要调用的时候,我们就手动去把这个块移上移下吧。下面我给大家说一下处理方法.

那么我们就要用到块标记:

smarty1_第10张图片

那么块标记怎么引用呢?

就是通过加载配置文件的时候,引入一个section属性:


通过这个section这个属性,让其配置块灵活的在模板中显示。

 

你想显示什块的样式就可以显示什么块的样式。

 

而且,我想给大家说明一点一般来说,这个快标记这些特殊的东西,我们都是从数据库里面访问得到的。

这里我们没有牵扯到数据库,下面我们来模拟一下数据库。


然后在我们是不是就要从模板文件中,进行一个动态修改,把section这块,变成这个我们从数据库得到的配置变量。


上面这个$smarty能用的变量就说完了.

下面我们进入下一个课题。还是关于变量传递的问题:

大家现在应该只知道assign()这个函数来分配变量对不对。Ok那么如果相同的变量会出现什么情况?


很明显,通assign传递的相同变量,会出现覆盖的情况。

那么下面再给大家说一个传递变量的方法 append()

如果通过append来传递变量,如果直接打印,就是一个array,所以,你们应该通过数组的形式来进行访问。


Ok,这个是关键了,面试可能会问到,就是通过assign传递变量与append来传递变量,有什么区别?

Assign是把变量信息放到一个具体的对象中使用,传递相同的变量有覆盖的情况。

Appen可以把变量信息放到一个数组里面,然后在模板文件中,通过下标去访问。

>>模板中数组和对象的使用

传递索引数组,我们可以通过,下标值比如0,1..来进行访问,那么关联数组当然就不可以了。

而关联数组我们可以通过关联的索引值来进行访问。

下面是数组传递的一个实例

$iphone=array("苹果","三星","华为");

$clothes=array("nike"=>"耐克","adidas"=>"阿迪达斯");

$smarty1=new MySmarty();

$smarty1->assign('iphone',$iphone);

$smarty1->assign('clothes',$clothes);

在模板页面我们接收并且打印出来

{$iphone.0} {$iphone.1} {$iphone[2]}

{$clothes['nike']} {$clothes.adidas}

其实,关联数组我们这里有两种方法可以去进行访问,方法如下:

smarty1_第11张图片

索引数组也可以啊。

下面我们看看传递对象怎么处理?

smarty1_第12张图片

上面我们很做了一个对象,并且传递了一个对象

下面我们到我们的模板页面当中去看看

smarty1_第13张图片


模板页面通过箭头去调用就可以了。

下面穿插一个关于php面向对象的知识点:

>>也就是php中静态方法与静态属性的调用

静态属性与静态方法是先于对象存在的。他们是存在在内存堆区的。这个测试代码,放到php2016/2016_11_15/demo1里面

smarty1_第14张图片

上面代码一看就清楚了。

静态属性与静态方法,在类的外部可以通过类名::与对象名双引号来进行访问。因为他是存在于全局区的,不能用箭头访问。

而且,静态方法不能调用非静态方法。因为静态方法是先与对象存在,当对象不存在的时候,非静态方法是不存在的。

>>下面给大家讲解一下smartyforeach数组的遍历

关于数组的遍历,有下面几个关键字需要大家记住,注意加上@

@first 找出第一个元素

@last 找出最后一个元素

@iteration给每个元素设置一个序号(从1开始)

@total查看当前数组一共几个元素

@index 显示每一个元素的索引。

@show 查看当前数组是不是有元素

注意上面这些元素的使用,前面都要加上一个单独的值变量比如下面这种形式

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

{$v@first}这样来使用。

下面看一下具体的代码:

注意:smarty模板遍历里面的代码是不需要加分号的。

还需要注意一点的就是,大家知道smarty的注释应该怎么写?

{*.......*}

smarty1_第15张图片

下面还可以通过if条件来对数组做一个判定

smarty1_第16张图片

当然了,我们还可以通过与上面关键字结合,与breakcontinue结合,来实现找到某个元素跳出,或者不显示某个元素

比如我们不想遍历出索引为2的元素,那么代码就应该如下来写:

smarty1_第17张图片

>>下面来说说二维数组的遍历方法

smarty1_第18张图片

smarty1_第19张图片

上面用到了foreach嵌套使用来遍历二维数组

下面我们来看另外一个foreach遍历二维数组:

smarty1_第20张图片

我更倾向于下面这种方法。

>>下面来说说section遍历索引数组了,注意section只能遍历索引数组

这就有一个固定的样式:

{section name=”当前遍历的名称” loop=’被遍历的变量’}

上面是两个必备的变量,其中name的值是我们自己起的

smarty1_第21张图片

我们在这里可以把中的值看成下标处理

下面我们把上面的代码升级一下:

我们怎么查看当前第几个元素被遍历了?

再次之前,我先来说一下。基本上foreach能用的变量输出信息关键字与section一样,只不过section的访问方式是$smarty.section.name.关键字的新式来访问。

这里还是要提一点,name是很重要的。

这里的name就算是我们自己取的一个索引名字吧


上面是不是就看到了每条信息的索引与序号。

>>下面来讲解一下for循环这个东西

smarty1_第22张图片

如上就是一个简单的从110的一个for循环

当然了,他是有两个可选的属性

smarty1_第23张图片

供我们选择的,一个是max,一个就是step.

Max就是最大显示的信息数,step就是步值

smarty1_第24张图片

上面就会显示16.

 

上面的值就会从100 99 98 97 96 95 94 93 92 91 90

>>下面来说一下分支结构


php页面传了一个变量到模板文件页面,我们在模板文件页面来做一个判断。

smarty1_第25张图片

我们还可以做更多的分支判断:

smarty1_第26张图片

下面还可以做一个特殊的判断:

smarty1_第27张图片

而这个is div by就是语法。能够被某一个数整除的意思。

这里我给大家插入一个问题?怎么得到客户端的ip地址?怎么得到服务器的ipgethostbyname()这个函数可以通过域名找到他所对应的ip地址

$_SERVER[‘REMOTE_ADDR’]->客户端的ip

$_SERVER[‘SERVER_ADDR’]->服务端的ip

在做复选框之前,再来说明一个问题

就是说,html怎么让input的文本框只读不可编辑?

我们可以在input框后面加上readonlydisabled这两个属性中的其中一个,那么这个框就是只读的框,不可以改写。

下面就是利用smarty做了一个简单的复选框


Values是一个数组,就是value里面的值,ouptput也是一个数组,就是给人们显示选择的数据,上面的这个代码展示如下。


上面是通过php页面传入了数据,下面就是数据在网页上的展现。


我们还可以把上面的复选框做的更加高级一点,加上默认选择,还有换行。



模板文件的代码如下:

smarty1_第28张图片

大家注意到没有,如果我们用valuesoutput来做复选框,要想默认选中什么框,是通过value里面的值来的。

当然了,我们还可以通过options来创建,原理与上面一样,只不过value就是从下标0开始了。

我想给大家多说一点,单选框与复选框,最好name都相同,然后value不同,这样我们才好获取值,还有就是,复选框的name,必须做成一个数组,大概形式如下。


下面我们来说一下,如何做一个下拉列表

与复选框的语法几乎一样,只不过下拉列表的关键字是{html_options}他也可以用两种方法来进行创建,第一种是options 第二种是valuesoutput的一个组合来创建。

注意option可以形成一个关联数组,键是value值,值是默认最开始显示的值。



smarty1_第29张图片

我们用实例来进行说明,也就是一个网站的分析,大家分析一下家教模板里面,我们打开看看,是不是头部后尾部的内容都是一样的呢?如下:


smarty1_第30张图片


 

我们用实例来进行说明,也就是一个网站的分析,大家分析一下家教模板里面,我们打开看看,是不是头部后尾部的内容都是一样的呢?如下:


大家想,如果页面彼此独立,那么当我们,需要修改一下头部或者尾部的时候,我们怎么玩呢?难道要一个页面一个页面进行修改吗?

我们要理解一个变换思想:

就是减少代码的重用。减少必要的重复工作

思路,就是改一次头部和脚部就会影响整体呢。

我们这里的想法就是把头部和脚部做成一个公共的,当我们修改一次,是不是每一个页面对应的头部与脚部都修改了。

上面这种做法,在smarty模板里面叫做继承

而在其他框架,比如thinkphpyii,cake)里边叫做布局

这里我们的代码还是放到2016_11_15/smarty2下面

我们来模拟一下解决过程:

其实就是去继承公共页面。

注意关键是{extends file=”文件名”}

{block name=”名字”}//name里面的名字就是说我要继承页面中的什么位置中去

这个标签里面的东西就代表是具体的内容,可以是默认的,也可以是继承过来的

{/block}

当这个块放到公共主体页面的时候,里面的内容就是主体页面默认现实的内容,也就是当你没有向这个里面写内容的时候,默认的显示内容。

而且,大家想一下,软件开发,必须有规范,文件不能随随便便就放到一个位置,每一个文件你都有他自己的文件夹。那么这里,公共页面是不是应该放到公共文件件里面呢?

我们这里把它设置成为public,你又想,既然大家都要用到这个页面,我们是不是应该给它取一个比较特殊的名字呢。

这里我把它取名为布局页面。layout.html而且这个文件是放到public文件夹里面的。

下面是代码分析:layout.html

这个是头部页面

这个就是主体页面默认显示的内容

这个是尾部页面

下面是我们需要去继承他的一个展示页面

{extends file="public/layout.html"}

{block name="left"}

我们都爱生活






 

我们用实例来进行说明,也就是一个网站的分析,大家分析一下家教模板里面,我们打开看看,是不是头部后尾部的内容都是一样的呢?如下:

你可能感兴趣的:(windows,IT,编程,php,smarty,smarty模板技术)