如何实现php仲smarty的一个列子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现php仲smarty的一个列子相关的知识,希望对你有一定的参考价值。

我想知道smarty怎样实现,php.ini我已经配置好了,在代码用$smarty=new Smarty;也没什么错误,但一个实实在在的的smarty例子是怎样的,请详细说说,书本哪里我看得不是很明白:
1.一个welcome.tpl,放在templates文件中,但tenmplates文件夹在哪里呢?welcome是设计模板
2.一个index.tpl文件,是个应用程序逻辑,里面有个$Smarty->display("welcome.tpl"),我测试时是http://localhost/index.tpl吗?好像不行,希望高手指点一下。
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist, or is not a directory. in C:\php\includes\Smarty\libs\Smarty.class.php on line 1093

模板目录设置:
$smarty->template_dir ="/templates/";
最好写成绝对路径,define('ROOT_PATH',substr(dirname(__FILE__),0,-7));这样的写法
$smarty->template_dir = ROOT_PATH."/templates/";
运行smarty并不是运行的tpl(html,htm都可以的)文件,而是运行调用它的程序,比如:
index.php:
<?php
include_once(smarty.class.php);//前面引入初始化smarty的文件
$smarty->assign("title","我的网站");//smarty加载的变量
$smarty->assign("content","我的内容");//smarty加载的变量
$smarty->display("index.tpl");//这个php加载的模板
?>
index.tpl:
<html>
<head>
<title>$title</title>
</head>
<body>
$content
</body>
</html>
确认smarty设置的和模板路径等都正确设置后,运行index.php就可以看到效果了。
参考技术A 在实例化SMARTY类时,必须对一些必要的成员变量进行初始化。

从你上面的错误可看出是因为编译的临时文件夹无法找到,比如这样。你在网站的根目录需要建议 templates 以及 compile 目录,SMARTY是不会自动帮你建立的,需要你手动创建。这两个目录分别存放模板以及临时编译文件。

$smarty->template_dir = "./templates/";
$smarty->compile_dir = "./compile/";
参考技术B 1、tenmplates 文件夹是在网上下载smarty相关文件包中带的一个文件夹。如果自己用smarty的相关文件包,就算没有tenmplates,就新建一个,配置好tenmplates的路径就可以了。
2、最好还是了解下smarty模板是什么样的工作原理,笼统的说就是实现前后台,美工跟后台代码分离的模板技术。调用的tpl文件,当然不行了。是调用php文件才可以。

用smarty模板主要还是先配置好各个模板引擎的绝对路径。写前台美工模板,这个一般是tpl的扩展名。写后台处理,先包含smarty模板配置文件的路径,再写php的处理方法。要访问就是直接访问这个php文件。

smarty模板基础

smarty模板的作用可以让前端和后端分离(也就是前端的显示页面和后端的php代码)。

smarty模板的核心是一个类,下载好的模板中有这么几个重要的文件夹

(1)libs核心文件夹
(2)int.inc.php这是入口文件
(3)plugins:自己写的插件文件夹
(4)templates_c:存放编译好的文件
(5)int.inc.php这是入口文件
(6)定义好常量:不能修改

一、如何实现前后分离的原理:
核心是一个类
1.左分隔符{
2.右分隔符}
3.数组(默认空数组):存储变量

4.提供一个方法:向模板中注册变量的方法(assign(名字,值))
方法存在数组中的(找到数组存入变量)

5.还有一个方法:显示模板的(display(模板的名称或是路径))
两个功能:拿模板,解析变量

通过名称就可以找到模板的路径
$url = "模板路径".$name ;

读取模板文件,返回字符串
$str = file_get_contents($url);

将字符串的某些内容作了替换
1.将模板中的"名字"替换成 一段php代码 echo $arr=[名字] 
2.将替换好的字符串保存到临时文件或者是编译好的文件
file_put_contents(存放的位置,上面替换好的字符串);
3.将编译好的文件拿到当前页面显示
include(临时文件的目录);

二、怎么用模板?

模板页面
1.引入模板的入口文件
include("入口文件路径位置");

2.直接用对象
提供一个方法:向模板中注册变量的方法(assign(名字,值)
$smarty->assign("ceshi","你好");
提供一个方法:显示模板的(display(模板的名称或是路径))
$smarty->display("ceshi.html");


正常页面
{assign(名字)}

注意:
1.访问的是php的页面,显示的是html页面
2.html用到了外部的样式表,位置是相对于访问的php页面来找外部样式

三、入口文件的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
define("ROOT",str_replace("\\\\","/",dirname(__FILE__)).\'/\'); //常量ROOT中指定项目根目录
 
//echo str_replace("\\\\","/",dirname(__FILE__)).\'/\'; //获取当前文件所在的位置
 
require ROOT.\'libs/Smarty.class.php\'//加载Smarty类文件
$smarty new Smarty(); //实例化Smarty对象
 
 
define("CSS_PATH","/project/css/");
define("JS_PATH","/project/js/");
 
//$smarty -> auto_literal = false; //就可以让定界符号使用空格
$smarty->setTemplateDir(ROOT.\'templates/\'); //设置所有模板文件存放位置
//$smarty->addTemplateDir(ROOT.\'templates2/\'); //添加一个模板文件夹
$smarty->setCompileDir(ROOT.\'templates_c/\'); //设置编译过的模板存放的目录
$smarty->addPluginsDir(ROOT.\'plugins/\'); //设置为模板扩充插件存放目录
$smarty->setCacheDir(ROOT.\'cache/\'); //设置缓存文件存放目录
$smarty->setConfigDir(ROOT.\'configs/\'); //设置模板配置文件存放目录
 
$smarty->caching = false; //设置Smarty缓存开关功能
$smarty->cache_lifetime = 60*60*24; //设置缓存模板有效时间一天
<br>//下面的内容是修改左和右的分隔符形式
$smarty->left_delimiter = \'<{\'//设置模板语言中的左结束符
$smarty->right_delimiter = \'}>\'//设置模板语言中的右结束符
 
?>

四、一些注意的点

(1)smarty注释

模板注释被*星号包围,而两边的星号又被定界符包围:

例如: 

1
{* this is a comment *}

注意:smarty注释不会在模板文件的最后输出中出现,这与<!-- HTML 注释-->不同(译注:html注释在页面源码中可见,而smarty注释则不能)也就是:注释只存在于模板里面,而在输出的页面中谁也看不见。 

(2)从配置文件读取的变量

配置文件的内容:

1
2
3
4
5
6
7
config file - foo.conf:
 
pageTitle = "This is mine"
bodyBgColor = \'#eeeeee\'
tableBorderSize = 3
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"

主页中写的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//下面为配置文件变量“井号方法”的示例
{config_load file=\'foo.conf\'}
<html>
<title>{#pageTitle#}</title>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
<tr bgcolor="{#rowBgColor#}">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//下面为$smarty.config方法的示例:
 
{config_load file=\'foo.conf\'}
<html>
<title>{$smarty.config.pageTitle}</title>
<body bgcolor="{$smarty.config.bodyBgColor}">
<table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor"}>
<tr bgcolor="{$smarty.config.rowBgColor}">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>

(3)加载配置文件后,配置文件中的变量需要用两个井号"#"包围或者是smarty的保留变量$smarty.config.来调用

{$smarty.now}取得当前时间戳,可以直接通过变量调节器date_format[格式化日期]输出显示

date_format转换标记:

  • %a - 当前区域星期几的简写
  • %A - 当前区域星期几的全称
  • %b - 当前区域月份的简写
  • %B - 当前区域月份的全称
  • %c - 当前区域首选的日期时间表达
  • %C - 世纪值(年份除以 100 后取整,范围从 00 到 99)
  • %d - 月份中的第几天,十进制数字(范围从 01 到 31)
  • %D - 和 %m/%d/%y 一样
  • %e - 月份中的第几天,十进制数字,一位的数字前会加上一个空格(范围从 \' 1\' 到 \'31\')
  • %g - 和 %G 一样,但是没有世纪
  • %G - 4 位数的年份,符合 ISO 星期数(参见 %V)。和 %V 的格式和值一样,只除了如果 ISO 星期数属于前一年或者后一年,则使用那一年。
  • %h - 和 %b 一样
  • %H - 24 小时制的十进制小时数(范围从 00 到 23)
  • %I - 12 小时制的十进制小时数(范围从 00 到 12)
  • %j - 年份中的第几天,十进制数(范围从 001 到 366)
  • %m - 十进制月份(范围从 01 到 12)
  • %M - 十进制分钟数
  • %n - 换行符
  • %p - 根据给定的时间值为 `am\' 或 `pm\',或者当前区域设置中的相应字符串
  • %r - 用 a.m. 和 p.m. 符号的时间
  • %R - 24 小时符号的时间
  • %S - 十进制秒数
  • %t - 制表符
  • %T - 当前时间,和 %H:%M:%S 一样
  • %u - 星期几的十进制数表达 [1,7],1 表示星期一
  • %U - 本年的第几周,从第一周的第一个星期天作为第一天开始
  • %V - 本年第几周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第一个至少还有 4 天的星期,星期一作为每周的第一天。(用 %G 或者 %g 作为指定时间戳相应周数的年份组成。)
  • %W - 本年的第几周数,从第一周的第一个星期一作为第一天开始
  • %w - 星期中的第几天,星期天为 0
  • %x - 当前区域首选的时间表示法,不包括时间
  • %X - 当前区域首选的时间表示法,不包括日期
  • %y - 没有世纪数的十进制年份(范围从 00 到 99)
  • %Y - 包括世纪数的十进制年份
  • %Z 或 %z - 时区名或缩写
  • %% - 文字上的 `%\' 字符 

例如: 

1
2
3
4
<?php
$config[\'date\'] = \'%I:%M %p\';
$smarty->assign(\'config\'$config);
?>

正常页面中的

1
2
3
{$smarty.now|date_format}
{$smarty.now|date_format:"%D"}
{$smarty.now|date_format:$config.date}

根据上面的字母提示可以算出输出信息。

 


 

Smarty自带了一些内置函数,这些内置函数是Smarty模板引擎的组成部分。他们被编译成相应的内嵌PHP代码,以获得最大性能。

您创建的自定义函数不能与内置函数同名,也不必修改这些内置函数。

其中一些具有assign属性,用来收集函数结果,并将结果分配给一个命名的模板变量,而不是将内容输出,类似于{assign}函数。

一、{if}{elseif}{else} 条件

随着一些特性加入到模版引擎,Smarty的{if}语句与php的if语句一样富有弹性。每一个{if}必须与一个{/if}成对出现,允许使用{else}和{elseif},所有php条件和函数在这里同样适用,诸如||、or、&&、and、is_array()等等。

如果开启安全,只支持符合$php_functions的安全策略属性的php函数。
下面是一串有效的限定符,它们的左右必须用空格分隔开,注意列出的清单中方括号是可选的,在适用情况下使用相应的等号(全等或不全等)。

(1){if}语句(开头结尾不要忘记)

先要在php页面引入“入口文件”,写入“变量注册方法”和“模板显示方法”

1
2
3
4
5
6
7
<?php
include("../init.inc.php");  //引入的入口文件
 
 
$smarty->assign("name",10);  //变量注册方法assign()
 
$smarty->display("test.html");  //模板显示方法display()

然后是html页面的条件了

1
2
3
4
5
6
7
<!--开头if-->
<{if $name == 10}>  <!--如果$name等于10-->
 
<div style="width:100px; height:100px; "></div> <!--这个div的颜色是红色-->
 
<!--结尾if-->
<{/if}>

看下结果

修改一下php文件中的注册值

1
$smarty->assign("name",11);

那么这个div就不会显示了,因为条件是$name等于10的时候才会显示红色

(2){if}...{else}语句 

php页面还是上面的例子,不同的是html页面加了一个“否则”的语句

1
2
3
4
5
6
7
8
<!--开头if-->
<{if $name == 10}>    <!--如果$name等于10,这个div就是红色-->
<div style="width:100px; height:100px; "></div>
<!--否则-->
<{else}>    <!--否则这个div是粉色-->
<div style="width:100px; height:100px; "></div>
<!--结尾if-->
<{/if}>

刚开始在php中name的值是“10”,所以也看到了颜色是红色;现在我们把name的值成随便一个数,那么html中的如果就不会成立,那么就会出现“否则”的颜色

注意:上面的那个表中相对的“备用词”也是可以用的。

二、{foreach},{foreachelse}遍历

(1)同样,要先写php文件,既然是遍历,那么我们可以用数组

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
include("../init.inc.php");
 
$arr array(
    array("001","中国"),
    array("002","淄博"),
    array("003","济南"),
    array("004","济宁"),
);
 
$smarty->assign("shuzu",$arr);
 
$smarty->display("test.html");

(2)然后就是写html页面了,{foreach}也是双标签啊,这里使用下拉列表显示出来的

1
2
3
4
5
6
7
<select>
        <{foreach $shuzu as $v}>
                <option value="<{$v[0]}>"><{$v[1]}></option>
        <{/foreach}>
         
</select>
        

看下显示结果

(3)嵌套了key的{foreach}

php页面没有任何变换,变换的是html页面

不同的是as后面的代码

1
2
3
4
5
<select>
  <{foreach $shuzu as $k=>$v}>   <!--不同之处就是$k=>$v-->
    <option value="<{$v[0]}>"><{$k}><{$v[1]}></option>
  <{/foreach}>      
</select>

这样就是显示出代号了

(4)@index

包含当前数组的下标,开始时为0。

同样的将html页面中的key进行修改

1
2
3
4
5
<select>
        <{foreach $shuzu as $v}>
                <option value="<{$v[0]}>"><{$v@index }><{$v[1]}></option>
        <{/foreach}>
</select>

效果是同样的

同样的还有一些差不多的

@iteration  :iteration包含当前循环的迭代,总是以1开始,这点与index不同。每迭代一次值自动加1。

@first  :当{foreach}循环第一个时first为真。这里我们演示当第一次迭代表格头所在行。

三、编辑器插件

这个就是关于编辑器的文件:

根据提示可以修改任何的参数对编辑器进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
 
  /**
     * 编辑器
     * @param int $textareaid
     * @param int $toolbar    有basic full 和desc三种
     * @param int $color 编辑器颜色
     * @param string $alowuploadexts 允许上传类型
     * @param string $height 编辑器高度
     * @param string $disabled_page 是否禁用分页和子标题
  */
  function smarty_block_textarea($args$content$smarty, &$repeat) {
  //public static function editor($textareaid = \'content\', $toolbar = \'basic\', $height = 200, $color = \'\', $up=true) {
 
  if(!$repeat) {   
    $textareaid = !empty($args[\'name\']) ? $args[\'name\'] : \'content\';
    $toolbar = !empty($args[\'toolbar\']) ? $args[\'toolbar\'] : \'basic\';
    $height = !empty($args[\'height\']) ? $args[\'height\'] : \'200\';
    $color = !empty($args[\'color\']) ? $args[\'color\'] : \'\';
    $up = !empty($args[\'up\']) ? $args[\'up\'] : true;
             
 
     
    $str =\'<textarea name="\'.$textareaid.\'">\'.$content.\'</textarea>\';
    if(!defined(\'EDITOR_INIT\')) {
        $str .= \'<script type="text/javascript" src="../js/ckeditor/ckeditor.js"></script>\';
        define(\'EDITOR_INIT\', 1);
    }
     
    if($toolbar == \'basic\') {
        $toolbar = "[\'Bold\'\'Italic\',\'Underline\',\'Strike\',\'NumberedList\'\'BulletedList\'\'TextColor\',\'BGColor\'\'Link\'\'Unlink\'\'-\'\'Image\',\'Flash\',\'Table\',\'Smiley\',\'SpecialChar\'],[\'RemoveFormat\'],
           \\r\\n";
    elseif($toolbar == \'full\') {
        $toolbar = "[\'Source\',\'-\',\'Templates\'],
        [\'Cut\',\'Copy\',\'Paste\',\'PasteText\',\'PasteFromWord\',\'-\',\'Print\'],
        [\'Undo\',\'Redo\',\'-\',\'Find\',\'Replace\',\'-\',\'SelectAll\',\'RemoveFormat\'],[\'ShowBlocks\'],[\'Image\',\'Capture\',\'Flash\'],[\'Maximize\'],
        \'/\',
        [\'Bold\',\'Italic\',\'Underline\',\'Strike\',\'-\'],
        [\'Subscript\',\'Superscript\',\'-\'],
        [\'NumberedList\',\'BulletedList\',\'-\',\'Outdent\',\'Indent\',\'Blockquote\'],
        [\'JustifyLeft\',\'JustifyCenter\',\'JustifyRight\',\'JustifyBlock\'],
        [\'Link\',\'Unlink\',\'Anchor\'],
        [\'Table\',\'HorizontalRule\',\'Smiley\',\'SpecialChar\'],
        \'/\',
        [\'Styles\',\'Format\',\'Font\',\'FontSize\'],
        [\'TextColor\',\'BGColor\'],
        [\'attachment\'],\\r\\n";
           
    elseif($toolbar == \'desc\') {
        $toolbar "[\'Bold\', \'Italic\', \'-\', \'NumberedList\', \'BulletedList\', \'-\', \'Link\', \'Unlink\', \'-\', \'Image\', \'-\',\'Source\'],\\r\\n";
         
    else {
        $toolbar \'\';
    }
    $str .= "<script type=\\"text/javascript\\">\\r\\n";
    $str .= "CKEDITOR.replace( \'$textareaid\',{";
 
    $str .= "height:{$height},";
     
     
    if($color以上是关于如何实现php仲smarty的一个列子的主要内容,如果未能解决你的问题,请参考以下文章

smarty模板基础1

smarty模板基础

php实现smarty模板无限极分类的方法

PHP框架_Smarty_实现登录功能

Smarty的分页实现

原创smarty引擎下的导航按钮高亮实现

(c)2006-2024 SYSTEM All Rights Reserved IT常识