PHP模板引擎smarty详细介绍

一、什么是smarty?

smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。

二、smarty优点:

1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。

2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)

3. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定smarty的cache属性为true时,在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。

4. 插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。

5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。

三、不适合使用smarty的地方:

1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。

2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用smarty会丧失php开发迅速的优点。

四、smarty目录结构及版本

打开smarty的官方网站,www.smarty.net/download.php。下载Smarty 3.1.12。有tar.gz和zip分别适用于linux和windows版本。

下载好后Smarty-stable-3.1.12解压缩会得到一个 Smarty-3.1.12 文件夹,里面有两个主要文件夹demo和libs

demo文件夹为示例文件夹,里面包含默认文件夹结构,是我们要进行编写程序代码的主要文件夹。demo里文件夹的名称都是smarty默认的目录结构名称,可以通过改smarty对应属性值,再把文件夹名改成我们想要的名称。 libs为smarty代码源文件夹,一般不动。

/libs/Smarty.class.php #主文件

/libs/sysplugins/ #内部plugin

/libs /plugins/ #外部plugin,可自由扩充

/demo/cahce/ #放置缓存文件

/demo/configs / #放置可以载入的配置文件

/demo/templates/ #放置模板文件

/demo/templates_c/ #放置对模板编译后的文件

可以把解压得到的 Smarty-3.1.12 文件夹名改成我们想要的项目名,demo也可以改成我们想要的具体存放编码的文件夹的名称

2、调试Smarty-3.1.12

创建自己的文件,在demo文件夹下创建index.php。 在templates目录中创建模板index.tpl (几乎可以是任何文本文件的扩展名,常用的是tpl,php,html,不建议使用后两者,因为可以从浏览器直接访问而不安全。可以对apache的httpd.conf进行设置,禁止直接访问.tpl文件。或者将templats目录放在网站文档树之外。)

*/

//index.php代码 require('../libs/Smarty.class.php'); $smarty = new Smarty; //在调用的模板里可以通过{$name}来输出name的值zhang,{}为这里的smarty分界符 $smarty->assign('name','zhang'); //调用模板tpl文件里不能执行PHP语句块 $smarty->display('templates/index.tpl');

/* index.tpl页面内容

你好, {$name}

*/

/* Smarty编译时的处理过程是源php文件->模板文件(可能调用多个或多次)->源php文件。。。 也就是说不影响原php文件的其他处理和输出。所以smarty模板文件可以是完整的html,也可以是其中一部分。

smarty处理过程

smarty将php源文件,首先编译成中间文件(也是php),如果启用缓存,再根据编译文件生成缓存文件(也是php),需要缓存的部分全部是硬编码。 之后的每次访问都会访问编译文件(如果编译文件已经存在),一次编译多次调用(可以是单文件的多次,也可以是多文件的多次),如果启用缓存且有缓存文件而且没有过期,则直接访问缓存文件,跳过编译文件。 编译文件一经生成,就不会被自动更新,除非模板文件或者配置文件更改。源php文件修改是不会引发重新编译的。一旦编译文件重新生成,缓存文件也必然重新生成。 */

//Smarty允许有两种特殊的编译设置存在:

//1、 任何时候都不自动重新编译(上线阶段):只有没有该文件的编译文件时才生成,模板文件或者配置文件的更改,不会引发重新编译。 $smarty->setCompile_check(false);//默认为true,false表示任何时候都不在文件发生变更的情况下生成编译文件,除了无编译文件。 $smarty->getCompile_check();//获得当前编译检查的设置 //2、任何时候都重新编译(调试阶段):任何时候都重新编译。 $smarty->setForce_compile(true);//默认为false,true表示每次都重新编译(启用缓存的话,每次都重新缓存) $smarty->getForce_compile();//获得当前强制编译的设置

//开启缓存

$smarty->setCaching(true); $smarty->getCaching();//获取当前缓存状态,默认是false关闭的 $smarty->setcache_lifetime(60);//设置缓存时间单位秒 //{*模版文件*} //{nocache} //{$name} //{/nocache} //{*如果开启缓存的话放在nocache标签内的变量不会缓存,每次读取PHP源文件的值*}

/*

smarty分界符

在模板文件中,区分普通html代码和smarty代码靠的是分界符。默认是 {} ,但可能会与js和css相冲突。可以进行变更。 在3.0中模板标签将不支持空格,如{ $abc }在Smarty2中可以识别的,但是3.0里头就不行了,必须这样{$abc},这样是为了能够更好的支持javascript和css。 */ $smarty->left_delimiter = "{"; //左分界符,2.0属性,3.0沿用 $smarty->right_delimiter = "}"; /* 分界符就相当于PHP的echo,分界符中的值都将输出,除非赋值等操作 smarty tpl文件中分界符中两个**之间的内容为注释内容如 tpl文件: {*这是模板注释内容*} */

//设置缓存目录路径,不设默认"cache" $smarty->setCacheDir("cache"); //获取缓存目录路径 $smarty->getCacheDir();

//设置配置目录路径,不设默认"configs" $smarty->setConfigDir("configs"); //添加配置目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找 $smarty->addConfigDir("configs/test"); //获取配置目录路径的数组 $smarty->getConfigDir();

//设置插件目录路径,不设默认"plugins" $smarty->setPluginsDir("plugins"); //添加插件目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找,plugins文件夹里放的就是可以在前台或后台按不同规则调用的函数的存储文件,文件名及函数名的命名按不同调用规则有不同写法要求 $smarty->addPluginsDir("plugins/test"); //获取插件目录路径的数组 $smarty->getPluginsDir();

//设置模板目录路径,不设默认"templates" $smarty->setTemplateDir("templates"); //添加模板目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找 $smarty->addTemplateDir("templates/test"); //获取模板目录路径的数组 $smarty->getTemplateDir();

//设置编译目录路径,不设默认"templates_c" $smarty->setCompileDir("templates_c"); //获取编译目录路径 $smarty->getCompileDir(); /* 我们可以建不同的php源文件文件夹,把编写的php文件按一定的分类放在不同的文件夹中。 然后在每个文件夹中都创建一个自定义的config文件,在config文件中创建一个新的$smarty = new Smarty 对象 然后把所有不同的文件夹的php文件的缓存,配置文件,插件,模版,编译目录都设置到同一个缓存,配置文件,插件,模版,编译目录 让该文件夹下所有PHP源文件都引用该配置文件即可获取相同配置 */

//模版变量

$arr = array(array("zhang","li"),'a'=>array("liu","wang"),array("ming","yi")); $smarty->assign("testArr",$arr); //设置模版变量,为将要调用的模版提供变量,在接下来调用的模版中可以通过{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}来访问具体某数组元素 //在模版中可以直接通过 {$testArr = "testValue" scope="global"} 来更改传过来的模板变量的值(如果不存在则在模板中创建并设置该模版变量),scope属性是标注模板变量使用范围的可不写 //在模版中更改或创建成其他数组 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其他类似PHP中

创建数组方式

//php源文件可通过 $smarty->getTemplateVars("testArr") 获取指定模版变量,如要获取模板中改变或创建的模版变量,在模板中创建或更改其值时必须加上scope属性并把值设置为scope="global"或scope="parent"

class A{ function aa($nam){ echo $nam; } } $smarty->assign("obj",new A); //设置的模版变量是对象时在模版页可以如下这样调用,给模版传类对象时也是传址 //{$obj->aa('my name is y')}

//Smarty可以识别嵌入在双引号中的模版变量,只要此变量只包含数字、字母、下划线。但貌似只支持能直接转换成字符串的模版变量 $smarty->assign("testStr","this is testStr"); //模板中可通过{"$testStr OK !"}来访问

/*

tpl模板包含模板

模板文件: {include file="header.tpl"} header.tpl内容: 这是顶部内容!!,欢迎你,{$name}

模板包含模板也可以是这样格式 {include file="header.tpl" testVar="这是顶部内容!!!"} header.tpl则可以通过{$testVar}使用调用页包含时传来的模板变量 header.tpl内容: {$testVar},欢迎你,{$name}


*/

/* 可以预先规定一系列的变量与值的对应,并放在配置文件中,在使用时载入。 配置文件默认放在configs文件夹中,可以自定义修改文件夹名。 */

/* #模板test.conf文件: #键对应的值可以不用引号括起来 title = Welcome to Smarty!! cutoff_size = 40

[china] language = chinese

[england] language = english

#[china],[england]为标签,未设置标签的键值为全局的只要调用该配置文件就可以在模版中使用,设置了标签的键值只有在调用配置文件时指定了对应标签才可以使用 #在PHP源文件调用配置文件语句$smarty->configLoad('test.conf',$sections = 'england');该语句下面调用的模版才可以使用该配置文件,通过$sections属性指定使用哪个标签下的键和值 #$sections参数可以不写,默认值为null,$smarty->configLoad('test.conf')则只使用全局的键值,而不能使用标签下的键值 #在模版下通过{config_load file="test.conf" section="china" scope="global"}语句调用配置文件 #section属性可以不写,默认是null,scope属性必须写{config_load file="test.conf" scope="global"} #section属性可赋三种值 #local 只有当前模版可以使用该配置文件 #parent 只有当前模版引入该配置文件语句后包含的模版中,或在php源文件中smarty对象调用该配置文件后调用的模版中可以使用该配置文件中的键值 #global 测试效果和parent相同 #在模版中通过{#language#}来使用键值,也可以通过{$smarty.config.language}来访问配置文件键值 #PHP源文件中可以使用$smarty->getConfigVars('language')或$smarty->getConfigVariable('language')来获取键值,$smarty->getConfigVars('language')获取的还可能是数组 */

/*

tpl文件中常用函数

tpl文件: {capture name="testCapture"} {include file="f1.tpl"} {/capture}

{if true} {$smarty.capture.testCapture} {/if}

{if $name == "wang"}

Welcome wang.

{elseif $name == "zhang"}

Welcome zhang.

{else}

Welcome,whatever you are.

{/if} {*操作符可以是 ==,>= 等也可以是 eq,ne等*}

{for $x=0; $x

{$x=0} {while $x

{foreach name="testForeach" from=$testArr key=arId item=arVal} {$arId}对应的值为:{$arVal}
{$smarty.foreach.testForeach.index}

{$smarty.foreach.testForeach.iteration}

{$smarty.foreach.testForeach.first}

{$smarty.foreach.testForeach.last}

{$smarty.foreach.testForeach.total}
{foreachelse} $testArr is null {/foreach}

{*也可以如下两种类PHP格式*} {foreach $testArr as $n} {$n} {/foreach}

{foreach $testArr as $key=>$n} {$key} {/foreach}

{$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]} {section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true}

{$smarty.section.testSection.index}- {$sectionArr[testSection]}- {$smarty.section.testSection.iteration}-

{sectionelse} $sectionArr is null {/section}

*/

/* tpl模板文件: {literal}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。