12月13日上午Smarty模版原理
模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用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模版原理的更多相关文章
- 2015年12月13日 spring初级知识讲解(四)面向切面的Spring
2015年12月13日 具体内容待补充...
- 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 ...
- 北京Uber优步司机奖励政策(12月13日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 18.Vim基础指令(自用)——2019年12月13日
title: vim study date: "2018-12-26 20:17:16" tags: 指令学习 categories: 技术驿站 vim study 2018年12 ...
- 12月15日下午Smarty模板函数
1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...
- 【12月13日】A股ROE最高排名
个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名 中公教育(SZ002607) - ROE_TTM:92.66% - ...
- 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_ ...
- WinForm 进程、线程、TreeView递归加载、发送邮件--2016年12月13日
进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start(); Process.S ...
- 11月13日上午ajax返回数据类型为JSON数据的处理
ajax返回数据类型为JSON数据的处理 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
随机推荐
- 慎用mutableCopy
因为逻辑需要,我在present到一个页面时,将一个存放uiimage的数组mutablecopy了过去(因为再返回的时候防止对数组做了改动),时间长了也忘了这事儿,后来发现添加多张图片上传时,app ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- count(*) 与count (字段名)的区别
count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数
- JavaScript—从数组的indexOf方法深入——Object的Property机制。
在js中,可以说万物皆对象(object),一个数组也是一个对象(array). 很多对象都有很多很方便的方法 比如数组的push,concat,slice等等,但是如果一些对象,它没有实现这些方法, ...
- CSS3:radial-gradient,径向渐变的使用方法
语法 径向渐变不同于线性渐变,线性渐变是从“一个方向”向“另一个方向”的颜色渐变,而径向渐变是从“一个点”向四周的颜色渐变.其语法如下: background: radial-gradient(cen ...
- MySQL多实例安装
1.安装MySQL需要的依赖的包和编译软件 (1)安装MySQL需要的依赖包 安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现报错,还得回来安装MySQL的依赖包. [root ...
- 【C++】类和对象(构造与析构)
类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...
- 基于TQ2440的SPI驱动学习(OLED)
平台简介 开发板:TQ2440 (NandFlash:256M 内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...
- nginx+php-fpm+mysql分离部署详解
相信大家将这三者部署到同一台主机应该已经不陌生了,今天在这里,给大家演示一下如何将三者部署到三台主机上. 实验系统:CentOS 6.6_x86_64 实验前提:大部分软件使用编译安装,请提前准备好编 ...
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...