当前位置: 首页 > news >正文

smarty模板原理

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}>。

转载于:https://www.cnblogs.com/sq45711478/p/6207805.html

相关文章:

  • python 数组反序的方法
  • 《企业云桌面实施》-小技巧-01-规划注意事项
  • J2SE Base-1
  • mysql零距离接触-存储过程
  • 加速 gradle 编译之屏蔽部分 Task | 掘金技术征文
  • Using Call_Form in Oracle D2k
  • php日志记录类
  • 乐观锁的一种实现方式——CAS
  • 中国科学院大学2014年数学分析高等代数考研试题
  • JavaScript标准库系列——Math对象和Date对象(二)
  • 图像处理中经常用的一幅图片Lena.jpg
  • Git的安装和介绍
  • linux下netstat --timers / -o详解及keepalive相关
  • iOS 10 开发 相机相关的适配
  • LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别
  • JavaScript-如何实现克隆(clone)函数
  • [nginx文档翻译系列] 控制nginx
  • 【笔记】你不知道的JS读书笔记——Promise
  • learning koa2.x
  • Map集合、散列表、红黑树介绍
  • Markdown 语法简单说明
  • mysql中InnoDB引擎中页的概念
  • nodejs调试方法
  • Python十分钟制作属于你自己的个性logo
  • v-if和v-for连用出现的问题
  • webpack入门学习手记(二)
  • 从零开始学习部署
  • 搞机器学习要哪些技能
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前嗅ForeSpider中数据浏览界面介绍
  • 收藏好这篇,别再只说“数据劫持”了
  • 小程序开发之路(一)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 智能合约开发环境搭建及Hello World合约
  • 1.Ext JS 建立web开发工程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (+4)2.2UML建模图
  • (1)Android开发优化---------UI优化
  • (23)Linux的软硬连接
  • (6)设计一个TimeMap
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (力扣题库)跳跃游戏II(c++)
  • (六)Hibernate的二级缓存
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .net 7 上传文件踩坑
  • .NET Core 项目指定SDK版本
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net Winform开发笔记(一)
  • .NET 发展历程