模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用php代码写逻辑,写完逻辑拿到前台显示。

一、写法

一般需要以下:写3个页面:

1.显示页面aa.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<{$a}>
</body>
</html>

2.类文件Smarty.class.php

<?php
class Smarty//写出类的名字
{
public $left = "<{";//代表左分隔符,在用phpcms套模板的时候,这个页面里面所有嵌入php的代码都是在{}里面的。phpcms默认的是{},但是用{}容易出现问题,因为本身的静态页面里面就有{}。这里分隔符再用{}的话会混淆。所以这里选择用<{}>。
public $right = "}>";//代表右分隔符,默认的是},把{}拿到前段页面显示,将{}里面的内容解析出来。 public $attr = array();//定义一个数组,先默认是空的。里面存储注册变量。 function assign($name,$value)//向smarty里面注册变量的方法。里面需要2个参数,第一个参数是变量名,第二个参数是变量值。
{
$this->attr[$name] = $value;//方法调用类里面的数组方法,把传过来的变量名当做索引,把传过来的变量值当做数组里面的值,存到数组里面,相当于往数组里面添加一个变量。
} function display($filename)//调用模板显示的方法,()里面是静态页面的路径。
{
//操作步骤
//1.读取静态页面所有的内容,把内容存到变量str里面。
$str = file_get_contents($filename);
//2.替换内容,获取的内容可能是网页的源代码,会比较长。找到标记的里面的内容,然后替换。替换原理是根据正则表达式找到源代码里面<{}>分隔符里面的内容,然后将<{}>里面的内容替换成数组attr里面的内容。替换完内容之后,替换完的页面会变成数组里面存的,数组里面有可能存变量,例如存的是catid,那么这个页面就变成了动态的页面。
//3.强替换完的页面保存到某一个位置。 //4.将替换完的页面加载到当前页面,用include或者require加载到当前页面。
}
}
?>

3.注入页面

<?php
//这是一个纯php页面,里面只有逻辑,没有前台显示代码。
$a = 10;
include("./Smarty.class.php");//引入Smarty类
$smarty = new Smarty();//新建一个smarty对象
$smarty->assign("a",$a);//调用assign方法,里面写一个变量,变量名为a,变量值为$a。把这个变量注册进去。 $smarty->display("aa.html");//把一个模板aa.html拿进来。
?>

二、示例

1.类的页面

<?php

define("ROOT",str_replace("\\","/",dirname(__FILE__)).'/'); //常量ROOT中指定项目根目录。使用define定义一个常量,常量的名字为ROOT,常量的值为后面的内容,意思是获取文件的路径后,将目录里面的"\"替换成"/"。将windows里面的路径修改成网页里面的文件的路径。

//echo str_replace("\\","/",dirname(__FILE__)).'/'; //获取当前文件所在的位置

require ROOT.'libs/Smarty.class.php'; //加载Smarty类文件
$smarty = new Smarty(); //实例化Smarty对象 define("CSS_PATH","/project/css/");//定义常量,将css文件放到根目录中project/css文件夹下。
define("JS_PATH","/project/js/");//定义常量,将js文件放到根目录中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; //设置缓存模板有效时间一天 $smarty->left_delimiter = '<{'; //设置模板语言中的左结束符
$smarty->right_delimiter = '}>'; //设置模板语言中的右结束符 ?>

2.注入页面

<?php
//引入配置文件
include("../init.inc.php");//init.inc.php里面已经造smarty对象了。 $a = "hello";
$smarty->assign("ceshi",$a);//注入变量
$smarty->display("test.html");//调用模板文件来显示 ?>

3.显示页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<{$ceshi}>
</body>
</html>

运行的时候要运行注入页面,注入页面把显示页面拿来使用显示内容,并不是直接走显示页面。直接运行显示页面的话只会显示<{$ceshi}>。

12月13日上午Smarty模版原理的更多相关文章

  1. 2015年12月13日 spring初级知识讲解(四)面向切面的Spring

    2015年12月13日 具体内容待补充...

  2. 2016年12月13日 星期二 --出埃及记 Exodus 21:8

    2016年12月13日 星期二 --出埃及记 Exodus 21:8 If she does not please the master who has selected her for himsel ...

  3. 北京Uber优步司机奖励政策(12月13日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. 18.Vim基础指令(自用)——2019年12月13日

    title: vim study date: "2018-12-26 20:17:16" tags: 指令学习 categories: 技术驿站 vim study 2018年12 ...

  5. 12月15日下午Smarty模板函数

    1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...

  6. 【12月13日】A股ROE最高排名

    个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名 中公教育(SZ002607) - ROE_TTM:92.66% - ...

  7. 12月13日 什么是help_method,session的简单理解, find_by等finder method

    helper_method Declare a controller method as a helper. For example, helper_method :link_to def link_ ...

  8. WinForm 进程、线程、TreeView递归加载、发送邮件--2016年12月13日

    进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start(); Process.S ...

  9. 11月13日上午ajax返回数据类型为JSON数据的处理

    ajax返回数据类型为JSON数据的处理 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

随机推荐

  1. Android教程收集贴

    Loader & REST Rest Loader Tutorial [github源码] [源码演示] [github作者主页] Twitter Timeline Sample for An ...

  2. gitflow以及git

    git大概只会用常用的那几个命令,自己用的最多的也只是add commit push pull之类的,然后那天电话面试问我版本回退怎么办我都忘记了. 然后又看了看教程,此时想起来做项目的时候师兄说的g ...

  3. 优化SQLServer--表和索引的分区(二)

    简介 之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容.如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行.这也就产生了很大优势 ...

  4. {"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}——记录一次微信错误处理

    错误情况概述: 启动应用之后,微信调用 相机拍照 等接口是可以正常使用的, 但是过了一段时间(2个小时左右--token/jsapi_ticket的过期时间),微信调用相机拍照的功能失效,启用debu ...

  5. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  6. [游戏开发-学习笔记]菜鸟慢慢飞(九)- NGUI- UIWidget(官方说明翻译)

  7. 阿里技术协会好文推荐:Android绘制流程http://click.aliyun.com/m/8719/

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

  8. Webform:Application、ViewState对象的用法

    Application Application对象的作用范围是整个全局,也就是说对所有用户都有效.它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取.它和S ...

  9. 有关日期的函数操作用法总结,to_date(),trunc(),add_months();

    相关知识链接: Oracle trunc()函数的用法 oracle add_months函数 Oracle日期格式转换,tochar(),todate() №2:取得当前日期是一个星期中的第几天,注 ...

  10. 安全测试 - 抓包工具BurpSuite

    Brup SuiteBurpSuite是用于攻击web应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP消息,持久 ...