Smarty3配置及入门语法


Posted in PHP onFebruary 22, 2017

一.Smarty3配置

下载Smarty文件

在Smarty的官方网站下载Smarty文件,解压下载到的Smarty文件,Smarty的库文件就在libs文件夹中。

我使用的PHP调试环境的程序集成包是phpstudy,默认在D盘会有一个WWW的文件夹,在WWW文件夹中创建一个testSmarty的文件夹,testSmarty文件夹就是本次练习Smarty的项目根目录。在testSmarty中创建一个smarty的文件夹,并将libs中的文件复制到这个smarty文件夹中。目录结构如下:

Smarty3配置及入门语法

Smarty配置

在testSmarty文件夹中创建一个test文件夹,在这个文件夹中创建一个config.php文件,内容如下:

<?php
header("content-type:text/html;charset=utf-8");
//引入核心文件并实例化
require ('/WWW/testSmarty/smarty/Smarty.class.php');
$smarty = new Smarty();
//配置
//模板文件的路径
$smarty->template_dir = '/WWW/testSmarty/test/tpl';
//模板文件编译后得到的文件的路径
$smarty->compile_dir = '/WWW/testSmarty/test/template_c';
//缓冲文件的路径
$smarty->cache_dir = '/WWW/testSmarty/test/cache';
//开启缓冲,缓冲默认是关闭的
$smarty->caching = true;
//缓冲的保留时间
$smarty->cache_lifetime = 120;
?>

在设置路径的时候我使用的是绝对路径,也能使用相对路径。依据设置的路径,还要在test文件夹中创建tpl,template_c和cache文件夹。

目录如下:

Smarty3配置及入门语法

检验smarty是否配置成功:

在test文件夹下创建一个start.php文件,文件内容如下:

<?php
//引入配置文件
require ('config.php');
//向模板文件中传递值
$smarty->assign('text','hello Smarty');
//渲染模板
$smarty->display('start.tpl');
?>

在tpl文件中创建一个start.tpl文件,内容如下:

{$text}

模板文件的后缀并不是非得是tpl

在浏览器中输入localhost:800/testSmarty/test/start.php

注意:在我这儿Apache是800端口

如果浏览器中能够显示出hello Smarty,则说明Smarty配置成功。

二.入门语法

界定符

Smarty的标签是位于界定符之间,默认界定符是{和},界定符是可以改变的。在配置文件中对界定符进行修改,如下:

//将左界定符改为#

$smarty->left_delimiter = '#';
//将右界定符改为#
$smarty->right_delimiter = '#';

当Smarty读取到界定符之间的内容会试图解析它,并输出结果。在界定符之外的内容都是静态。

注释

注释是以*开头*结尾的,外面包着界定符,如下:

{* 这儿是注释 *}

输出变量

//向要渲染的模板传递值
$smarty->assign('变量名',值)

传递的值可以是字符串,数组也能是对象。

当变量是字符串时,{$变量名}表示输出变量。

当变量是数组时,输出变量的方式有两种,分别为:

a.{$arr.key}

b.{$arr['key']}

当是一个对象时,可以直接通过obj->method(),调用对象的方法

条件判断

条件判断的基本句式如下:

{if $variable 条件修饰符 value1}
 //some
{elseif $variable 条件修饰符 value2}
 //some
{else}
 //some
{/if}

基本的条件修饰符有:eq(等于),neq(不等于),gt(大于),lt(小于),lte(小于等于),gte(大于等于)。修饰符前后要有空格

循环

Smarty中有两种循环,分别是foreach,section,for和while

section循环

section不能循环遍历关联数组,它只能循环遍历连续数字下标的数组,如果要循环关联数组使用foreach

section可以接受name,loop,step,start,max,show,其中name和loop是必须的。name是每一次循环得到的下标,loop是??循环的值,step循环的步长,默认为1,max是最大循环的次数,start开始循环的下标,默认为0,如果start为负数,就从数组末尾开始循环,show表示是否显示循环的内容,默认是true

如下:

在test文件夹下创建section.php文件,内容如下:

<?php
require ('config.php');
$article = array(
 array(
  'title'=>'第一章',
  'name'=>'QxQstar',
  'content'=>'Smarty section循环第一章'
 ),
 array(
  'title'=>'第二章',
  'name'=>'QxQstar',
  'content'=>'Smarty section循环第二章'
 )
);
$smarty->assign('article',$article);
$smarty->display('section.tpl');
?>

在tpl文件夹下创建section.tpl文件,内容如下:

<ul>
 {section name=item loop=$article}
  <li>
   {$article[item].title}
   <p>作者:{$article[item].name}</p>
   <p>内容:{$article[item].content}</p>
  </li>
 {sectionelse}
  没有文章
 {/section}
</ul>

foreach循环

foreach循环比section循环要简单,foreach的语法与php中foreach的语法很像,foreach可以做到任何section做到的功能,并且foreach更简单

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

例子如下:

在test文件夹中创建foreach.php文件,文件内容如下:

<?php
require ('config.php');
$articles = array(
 array(
  'title'=>'第一章',
  'name'=>'QxQstar',
  'content'=>'Smarty foreach循环第一章'
 ),
 array(
  'title'=>'第二章',
  'name'=>'QxQstar',
  'content'=>'Smarty foreach循环第二章'
 )
);
$smarty->assign('articles',$articles);
$smarty->display('foreach.tpl');
?>

在tpl文件夹中创建foreach.tpl文件,内容如下:

<ul>
 {foreach $articles as $article}
  <li>
   {$article.title}
   <p>{$article.name}</p>
   <p>{$article.content}</p>
  </li>
  {foreachelse}
  <p>没有文章</p>
 {/foreach}
</ul>

for循环

for循环用于创建一个简单的循环,语法如下:

{for $variable = $startValue to $entValue step $step}

{for $i = 0 to 10 step 2}
 {$i}
{foreach}
不能进行循环
{/for}

step可以不指定,默认循环的步长是1。for还可以指定一个max属性,max属性用于指定循环的次数

与foreach循环类似,for循环也有一个forelse。{forelse}在循环不能遍历的时候执行

while循环

Smarty的while循环与php中的while循环类似,语法如下:

{while $variable > 0}
//some
{/while}

在循环中使用{break}可以停止循环,{continue}退出当前循环进入下一次循环

插件

Smarty插件的实质是函数,插件的类型有三种,分别是function插件,modifier插件(变量调节插件),block插件

使用插件

function插件的使用:{funcName param1 = value...}

modifier插件的使用:{$variable | modifierName:param1...}

block插件的使用:

{blockName param1 = value...}
{$content}
{/blockName}

如:

//function插件的使用
{include file='header.tpl'}
//modifier插件的使用
{'abc'|cat:'d'}
//block插件的使用
{textformat wrap = 10}
abc def
ghikj lmn
{/textformat}

制作插件

制作插件的方式有三种

1.使用registerPlugin函数注册写好的自定义函数

2.将写好的插件放在smarty目录中的Plugins目录里

3.PHP内置函数可以自动的以修饰插件(变量调节插件)的形式在模板中使用

使用registerPlugin函数注册自定义插件,例子如下

在test文件夹下创建defineFunc.php文件,内容如下:

<?php
require ('config.php');
function test($params){
 $p1 = $params['p1'];
 $p2 = $params['p2'];
 return $p1.$p2;
}
$smarty->registerPlugin('function','f_test','test');
$smarty->display('definedFunc.tpl');
?>

在tpl文件夹下创建一个defineFunc.tpl文件,内容如下:

{f_test p1='learn' p2=' Smarty'}

registerPlugin函数的第一个参数说明注册的这段程序的类型,在这里是function说明注册的是一个function插件,还可以取得值有block和modifier,第二个参数指注册的Smarty function插件名,第三个参数指自定义函数名,第二个参数和第三个参数可以相同。

在Smarty中当执行到{f_test p1='learn' p2=' Smarty'}时,p1和p2会被打包成一个数组传递到我们定义的test函数中去。

通过网Plugins文件夹中添加文件的方式制作插件

1.制作function插件

在Plugins文件夹下创建一个function.test.php文件(function表示这个一个function插件,test表示插件名),内容如下:

function smarty_function_test($params){
 //$params是一个关联数组
 $w = $params['w'];
 $h = $params['h'];
 return $w * $h;
}
?>

在模板中直接使用test function插件

{test h = 3 w = 5}

这两个参数会被打包成一个数组传递到smarty_function_test函数中

2.制作modifier插件

在Plugins文件夹下创建一个modifier.test2.php文件(modifier表示这个一个modifier插件,test2表示插件名),内容如下:

function smarty_modifier_test2($utime,$formate){
 return date($formate,$utime);
}

在模板中使用test2 modifier插件

{$time|test2:'Y-m-d H-i-s'}

定义modifier插件和function插件有所不同,function插件的自定义函数只接收一个数组参数,modifier插件的自定义函数

将接收到的参数一一列举出来

3.制作block插件

在Plugins文件夹下创建一个block.test3.php文件(block表示这个一个block插件,test3表示插件名),内容如下:

function smarty_block_test3($params ,$content){
 $replace = $params['replace'];
 $maxnum = $params['maxnum'];
 if($replace == 'true'){
  str_replace(',', ',', $content);
  str_replace('。', '.', $content);
 }
 $content = substr($content,0,$maxnum);
 return $content;
}

在模板中使用test3 block插件

{test3 replace='true' maxnum = 6}
abcdfedddderere
{/test3}

{test3}{/test3}之间的内容传递到smarty_block_test3中的第二个参数中,test3后跟着的参数打包成一个数组传递到smarty_block_test3中的第一个参数中。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
php str_pad 函数使用详解
Jan 13 PHP
PHP 文件扩展名 获取函数
Jun 03 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
php学习笔记之 函数声明(二)
Jun 09 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
Yii中使用PHPExcel导出Excel的方法
Dec 26 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
PHP浮点数精度问题汇总
May 13 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 #PHP
PHP+JavaScript实现无刷新上传图片
Feb 21 #PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 #PHP
如何离线执行php任务
Feb 21 #PHP
PHP实现上传多文件示例代码
Feb 20 #PHP
微信公众号开发之通过接口删除菜单
Feb 20 #PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 #PHP
You might like
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
python如何统计代码运行的时长
2019/07/24 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
2014年化工厂工作总结
2014/11/25 职场文书
工程款申请报告
2015/05/15 职场文书
围城读书笔记
2015/06/26 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL