Smarty是一个使用PHP写出来的模板引擎,一说模板引擎,其实就是再html中插入能够直接渲染的数据。这个是为了让前端和后台分离的一种管理模式。javascript
优势: 代码由服务端直接渲染,能够避免js后期插入的延迟,页面渲染速度也很快。而服务端只须要给数据,至于怎么用或者修改页面的时候,不用后台动逻辑,多人项目合做显得很重要。php
fis3-smarty默认的分届符为{%、%}
,这个能够修改。css
<html>
标签,设置页面运行的前端框架,以及控制住总体页面输出{%html framework="home:static/lib/[mod.js](http://wiki.afpai.com/pages/mod.js)"%}
{%/html%}
复制代码
页面输出html
<html>
<body>
<script src="/static/lib/mod.js"/></script>
</body>
</html>
复制代码
<head>
标签,控制CSS资源加载输出。{%html framework="home:static/lib/mod.js"%}
{%head%}
<meta charset="utf-8"/>
{%/head%}
{%/html%}
复制代码
页面输出前端
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script src="/static/lib/mod.js"/></script>
</body>
</html>
复制代码
<body>
标签,控制JS资源加载输出。{%html framework="home:static/lib/mod.js"%}
{%head%}
<meta charset="utf-8"/>
{%/head%}
{%body%}
....
{%/body%}
{%/html%}
复制代码
<script>
标签,收集使用JS组件的代码块,控制输出至页面底部。{%html%}
{%head%}
<meta charset="utf-8"/>
{*经过script插件收集加载组件化JS代码*}
{%script%}
console.log("aa");
{%/script%}
{%/head%}
{%body%}
...
{%/body%}
{%/html%}
复制代码
解析结果(不管是放在head里面仍是body里面,最后都会在body最后面输出):html5
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript"> !function(){ console.log("aa"); }(); </script>
</body>
</html>
复制代码
<style>
标签,收集使用css内嵌资源的代码块。{%html%}
{%head%}
<meta charset="utf-8"/>
{*经过script插件收集加载组件化JS代码*}
{%style%}
body{
background-color:pink;
}
{%/style%}l
{%/head%}
{%body%}
...
{%/body%}
{%/html%}
复制代码
解析结果java
<html>
<head>
<meta charset="utf-8"/>
<style> body{ background-color:pink; } </style>
</head>
<body>
</body>
</html>
复制代码
{%html framework="home:static/lib/mod.js"%}
{%head%}
<meta charset="utf-8"/>
{%/head%}
{%body%}
{%require name="home:static/index/index.css"%}
{%require name="home:static/index/index.js"%}
...
{%/body%}
{%/html%}
复制代码
编译以后解析结果(测试以后src的属性不能用):jquery
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="/static/home/index/index.css">
</head>
<body>
<script type="text/javascript" src="/static/home/index/index.js"></script>
</body>
</html>
复制代码
页面数据
{
"result":{
"addStr":"html of b"
}
}
----home.tpl
{%body%}
{%widget name="home:widget/A/B.tpl" info=$result%}
{%/body%}
<!--$info的改变不会对$data.header.info有任何影响-->
----B.tpl
<div>{%$info.addStr%}</div>
复制代码
编译以后:git
<body>
<div>html of b</div>
</body>
复制代码
<!--A.tpl-->
<title>{%block name="head_title"%}{%/block%}</title>
<!--B.tpl-->
{%block name="head_title"%}title show{%/block%}
复制代码
编译以后在页面你上能够获得github
<title>title show</title>
复制代码
{%extends file="common/page/layout/m-base.tpl"%}
复制代码
{%$logo_url="{%uri name="common:static/a.js"%}"%}
复制代码
//framework中举例
//定义变量html_ext_attr
{%capture name="html_ext_attr"%}{%block name="html_ext_attr"%}{%/block%}{%/capture%}
//使用变量
{%$html_ext_attr%}
复制代码
frameworkTpl --> productTpl
首先有一个最基础的tpl模板,定义了最基础的东西,而后后面继承的能够根据这个东西进行修改。
append
就能够<!--定义一个html标签自定义属性的变量,名字叫html_ext_attr-->
{%capture name="html_ext_attr"%}{%block name="html_ext_attr"%}{%/block%}{%/capture%}
<!--fis必需要引用mod.js-->
{%html framework="common:js/mod.js" {%$smarty.capture.html_ext_attr%}%}
<!--head标签-->
{%head%}
<meta charset="{%block name='head_charset'%}UTF-8{%/block%}">
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<!-- 添加 meta 配置,引导 360 浏览器优先使用 webkit 内核渲染页面 -->
<meta name="renderer" content="webkit">
<meta name="description" content="{%block name='head_desc'%}网页描述{%/block%}">
<meta name="keywords" content="{%block name='head_keywords'%}网页keywords{%/block%}">
<!--页面title-->
<title>{%block name="head_title"%}{%/block%}</title>
<!--页面icon-->
{%block name="head_favicon"%}
<link rel="shortcut icon" href="">
{%/block%}
<!-- <head> 标签开始位置,title 以后,全部 CSS/JavaScript 引用以前 -->
{%block name="head_start"%}{%/block%}
<!-- 基础样式 -->
{%require name="common:css/base.css"%}
<!-- 为 IE8 及更低版本 IE 浏览器添加 HTML5 新增元素支持 -->
<link rel="import" href="../../static/html/html5-hack.html?__inline">
<!-- <head> 标签结束位置 -->
{%block name="head_end"%}{%/block%}
{%/head%}
<!-- <head> 标签末端 -->
{%block name="after_head"%}{%/block%}
<!-- 全局 js 基础库,默认引用 jQuery -->
{%block name="global_js"%}
{%require name="common:js/jquery.js"%}
{%/block%}
<!-- block "body_ext_attr" 用于向 <body> 标签中添加自定义属性 -->
{%capture name="body_ext_attr"%}{%block name="body_ext_attr"%}{%/block%}{%/capture%}
<!-- block "body_page_class" 用于向 <body> 标签中添加样式名 -->
{%body class="{%block name='body_page_class'%}{%/block%}" {%$smarty.capture.body_ext_attr%}%}
<!-- <body> 标签开始位置,页面主体内容前 -->
{%block name="body_start"%}{%/block%}
<!-- 页面主体内容 -->
{%block name="body"%}
<!-- 页面内容的 header 区域 -->
{%block name="body_header"%}{%/block%}
<!-- 页面内容主体 -->
{%block name="body_main"%}{%/block%}
<!-- 页面内容的 footer 区域 -->
{%block name="body_footer"%}{%/block%}
{%/block%}
<!-- <body> 标签结束位置,页面主体内容后 -->
{%block name="body_end"%}{%/block%}
{%/body%}
<!-- <body> 标签以后 -->
{%block name="after_body"%}{%/block%}
{%/html%}
复制代码
而后是一个个性化的Tpl模板,用于不一样的项目组
{%extends file='./framework.tpl'%}
{%block name='head_keywords'%}项目keywords{%/block%}
{%block name="head_title"%}项目html{%/block%}
{%block name='head_desc'%}项目desc{%/block%}
<!--须要html渲染以前执行的css和js-->
{%block name="head_end" append%}
<script type="text/javascript"> console.log("TODO"); </script>
<style> .hide{ display:none; } </style>
{%require name="product:product.css"%}
{%/block%}
<!-- 修改全局 js 基础库,默认引用 zepto-->
{%block name="global_js"%}
{%require name="common:js/zepto.js"%}
{%/block%}
<!--body_ext-attr,body额外的属性-->
{%block name="body_ext_attr"%}time=true{%/block%}
{%block name="body_main"%}
<div>------全部html标签都写在这里------</div>
<div>------这里面也能够直接使用smarty语法------</div>
{%/block%}
{%block name="body_end"%}
<script> var finished = "{%$result.finished%}"; console.log(finished); </script>
{%require name="product:product.js"%}
{%/block%}
复制代码