Sdopx快速上手
1. 在php-fpm模式下使用。
//test.php
define('ROOT_DIR', __DIR__);
date_default_timezone_set('PRC');
require(ROOT_DIR . '/vendor/autoload.php');
use sdopx\Sdopx;
$sdopx = new Sdopx();
$sdopx->setTemplateDir('./view');
$sdopx->setCompileDir('./runtime');
//文本
$sdopx->assign('title', 'hello sdopx');
//数组
$sdopx->assign('list', [
['id' => 1, 'name' => 'wj006'],
['id' => 2, 'name' => 'wj007'],
['id' => 3, 'name' => 'wj008'],
['id' => 4, 'name' => 'wj009']
]);
$std = new stdClass();
$std->name = 'wj010';
$std->sex = '男';
$std->glass = '202';
//对象
$sdopx->assign('user', $std);
//html代码
$sdopx->assign('html', '<b>这是一段<span style="color: darkgreen">HTML</span>文本</b>');
//时间
$sdopx->assign('now', time());
$sdopx->display('test.tpl');
模板文件
<html>
<head>
<title>{$title}</title>
<meta charset="utf-8"/>
</head>
<body>
<h3>{$title}</h3>
<ul>
{foreach from=$list item='rs' attr='attr'}
<li>
<div>属性:总共:{$attr.total}行,索引:{$attr.index},第{$attr.iteration}
行,{if $attr.first}是首行{/if}{if $attr.last}是尾行{/if}</div>
<div> {$rs.id}-{$rs.name}</div>
</li>
{/foreach}
</ul>
{if $user!=null}
<ul>
{foreach from=$user key=k item=v attr=attr}
<li>
<div>属性:总共:{$attr.total}个属性,索引:{$attr.index},第{$attr.iteration}
行,{if $attr.first}是首行{/if}{if $attr.last}是尾行{/if}</div>
<div>--{$k}:{$v}</div>
</li>
{/foreach}
</ul>
{/if}
<div>默认输入(转码):{$html}</div>
<div>原样输入:{$html|raw}</div>
<div>字符串模板:{`这是一个拼接字符串{$title}`}</div>
<div>当前时间:{$now|date_format:'%Y-%m-%d %H:%M:%S'}</div>
</body>
</html>
运行结果:
<html>
<head>
<title>hello sdopx</title>
<meta charset="utf-8"/>
</head>
<body>
<h3>hello sdopx</h3>
<ul>
<li>
<div>属性:总共:4行,索引:0,第1
行,是首行</div>
<div> 1-wj006</div>
</li>
<li>
<div>属性:总共:4行,索引:1,第2
行,</div>
<div> 2-wj007</div>
</li>
<li>
<div>属性:总共:4行,索引:2,第3
行,</div>
<div> 3-wj008</div>
</li>
<li>
<div>属性:总共:4行,索引:3,第4
行,是尾行</div>
<div> 4-wj009</div>
</li>
</ul>
<ul>
<li>
<div>属性:总共:3个属性,索引:0,第1
行,是首行</div>
<div>--name:wj010</div>
</li>
<li>
<div>属性:总共:3个属性,索引:1,第2
行,</div>
<div>--sex:男</div>
</li>
<li>
<div>属性:总共:3个属性,索引:2,第3
行,是尾行</div>
<div>--glass:202</div>
</li>
</ul>
<div>默认输入(转码):<b>这是一段<span style="color: darkgreen">HTML</span>文本</b></div>
<div>原样输入:<b>这是一段<span style="color: darkgreen">HTML</span>文本</b></div>
<div>字符串模板:这是一个拼接字符串hello sdopx</div>
<div>当前时间:2018-07-25 06:38:32</div>
</body>
</html>
语法示例:
输出:
--字符串-----------------
{'zzz'} -- 字符串输出
{"xxx"} -- 字符串输出
{'aa
sss'} -- 换行输出
--变量-----------------
{$name} -- 变量输出
{date('Y-m-d')} -- 内置函数,或变量输出
---运算----------------
{`test{$str}xx`} -- 字符串拼接
{(2*50)}-- 数学运算表达式输出
{$obj->name} -- 属性输出
{$obj->get(2,3)} -- 方法调用 输出
{$arr['obj']->substr(2,3)}
--修饰符-------------------
{$code|raw} -- raw 只能是最后一个修饰器 保存原样输出,如未使用 raw 修饰器则自动转成HTML实体输出
{$code|upper|raw} --转大写且 原样输出
{$code|lower}
{$code|strip_tags} --移除html标签
{$code|default:'空'} --设置默认值
{$time|date_format:'%Y-%m-%d %H:%M:%S'} --日期格式化
{$str|truncate:40:'...'} --按字符位宽数量截取字符串 中文=2个字符位宽
判断:
{if $rs.name == 'wj008'}
<span>{$rs.name}</span>
{elseif $rs.info==`test{$data.name}test` }
<span>{$rs.info}</span>
{else}
<span>cccc</span>
{/if}
循环:
<ul>
{foreach from=$list item=rs}
<li>id:{$rs.id},name:{$rs.name}</li>
{foreachelse}
<li>没有任何数据</li>
{/foreach}
</ul>
<ul>
{for $i=0; $i<count($list);$i++}
<li>{$list[$i].id}-{$list[$i].name}</li>
{/for}
</ul>
<ul>
{assign $idx=0}
{while $idx < count($list) }
<li>{$list[$idx].id}-{$list[$idx].name}</li>
{assign var=idx value=$idx+1}
{/while}
</ul>
模板内注册变量:
{assign $name='wj008'}
{assign $temp=`aaaa{$name}`} --注册到局部
{global $str=`global value.`} --注册到全局
{assign var=a value=0} --局部赋值
{assign $a++} --局部赋值
{global var=b value=0} -全局赋值
{global $b--} --全局赋值
输出:{$temp}
输出:{$str}
输出:{$a}
输出:{$b}
包含文件:
{include file="head.tpl"} --包含
{include file="string:kxxxcsdsd"} --包含字符串源的模板
{include file="dbsource:select * from table where id=1"} //系统没有实现类似资源 自己可以通过扩展注册资源 这里只是演示支持不同的资源类型加载
{include file="head.tpl" output=false} 包含但是不输出任何内容 比如包含一些带有函数的控件模板
模板继承
layout.tpl
<html>
<title>{block name=title}{/block}</title>
<body>
{block name=testbody}{/block}
</body>
</html>
child.tpl
{extends file='layout.tpl'}
{block name='title'}hello{/block}
{block name=testbody}这是一个继承模板测试{/block}
避免被解析
{literal}
<script>
function myBar {alert('wj008');}
</script>
{/literal}
或者:
{assign $name='wj008'}
{literal left='<@' right='@>'}
<script>
function myBar {alert('<@$name@>');}
</script>
{/literal}