wj008 / sdopx
sdopx Embedded php templates
4.1.0
2025-12-30 19:42 UTC
Requires
- php: >=8.0
README
Sdopx 是一个基于 PHP 的高性能模板引擎,提供灵活的模板编译和渲染功能,适用于 Web 开发中的视图层处理。
特性
- 模板继承:支持模板继承机制,便于构建可复用的页面结构。
- 编译优化:将模板编译为原生 PHP 代码,提升执行效率。
- 插件系统:提供丰富的插件支持,如变量修饰符、自定义标签等。
- 多条件判断:支持多种条件判断标签,简化模板逻辑。
- 多资源支持:支持从文件、字符串、Base64 等多种资源加载模板。
- 调试功能:内置调试支持,便于开发过程中排查问题。
安装
使用 Composer 安装 Sdopx:
composer require wj008/sdopx
使用示例
基本用法
use sdopx\Sdopx;
// 初始化模板引擎
$sdopx = new Sdopx();
// 设置模板目录
$sdopx->setTemplateDir(__DIR__ . '/templates');
// 分配变量
$sdopx->assign('name', 'Sdopx');
$sdopx->assign('user', ['level' => 2, 'role' => 'editor']);
// 渲染模板
$sdopx->display('index.tpl');
模板语法示例
{* index.tpl *}
Hello, {$name}!
其他语法请查阅 http://sdopx.wj008.net
Sdopx 4.0.4 以上新语法特点
4.0.4 版本优化了代码结构,修正错误输出的提示内容,以及定位错误代码位置。
- 左分界符号右侧如有空格及换行将被视为 HTML 代码不被解析为模板
<style>
body {
color: red;
}
.css1 { color: red; }
</style>
<script>
function abc() {
alert('ceshide');
}
abc();
</script>
以上代码将会原样输出。
- 新增模板内直接变量赋值及添加变量链接修饰器 |cat
{$name = 'sdopx'}
{$temp = $name|cat:' ok?'}
- 支持 PHP 内置的字符串处理函数以修饰器的形式调用,如:
{$temp|strlen}
{$temp|trim}
{$temp|ucfirst}
{$temp|substr:1:3}
{$temp|base64_encode}
{'world'|str_replace:'sdopx':$temp}
...
Sdopx 4.1.0 新增条件判断标签
1. 基本条件判断
eq / neq - 等于/不等于判断
{eq var=$user.level value=2}
您是编辑
{/eq}
{neq var=$user.id value=0}
用户ID不为0
{/neq}
empty / notempty - 空值/非空判断
{empty var=$user.email}
邮箱未设置
{/empty}
{notempty var=$products}
<ul>
{foreach $products as $product}
<li>{$product.name}</li>
{/foreach}
</ul>
{/notempty}
2. 范围判断
between / notbetween - 在/不在范围内判断
{between var=$user.age start=18 end=60}
成年人
{/between}
{notbetween var=$score min=0 max=59}
及格以上
{/notbetween}
<!-- 支持两种参数格式:start/end 或 min/max -->
{between var=$price min=100 max=500}
价格在合理范围
{/between}
3. 包含判断
in / notin - 包含/不包含判断
{in var=$user.role value='admin,editor,author'}
有权限的用户
{/in}
{notin var=$permission value='delete,modify_system'}
安全权限
{/notin}
<!-- 支持数组字面量 -->
{in var='admin' value=['admin','editor','author']}
管理员角色
{/in}
<!-- 支持数组变量 -->
{in var=$user.role value=$allowed_roles}
角色合法
{/in}
4. 多分支条件判断
switch / case / default - 多分支条件判断
{switch var=$user.level}
{case value=1}
管理员
{/case}
{case value=2}
编辑
{/case}
{case value=3}
作者
{/case}
{default}
游客
{/default}
{/switch}
<!-- 支持字符串比较 -->
{switch var=$user.role}
{case value='admin'}
<span class="role-admin">管理员</span>
{/case}
{case value='editor'}
<span class="role-editor">编辑</span>
{/case}
{default}
<span class="role-guest">访客</span>
{/default}
{/switch}
<!-- 支持表达式 -->
{switch var=intval($score/10)}
{case value=10}
优秀
{/case}
{case value=9}
良好
{/case}
{case value=8}
中等
{/case}
{case value=7}
及格
{/case}
{default}
不及格
{/default}
{/switch}
5. 条件嵌套使用
{foreach from=$orders item=order attr='attr'}
<tr class="{if $attr.index %2==0}odd{else}even{/if}">
<td>{$order.order_no}</td>
<td>
{switch var=$order.status}
{case value=0}
<span class="status-pending">待支付</span>
{/case}
{case value=1}
<span class="status-paid">已支付</span>
{/case}
{case value=2}
<span class="status-shipped">已发货</span>
{/case}
{case value=3}
<span class="status-completed">已完成</span>
{/case}
{/switch}
</td>
<td>
{if $order.status == 0}
<button>立即支付</button>
{elseif $order.status == 1}
<button>取消订单</button>
{/if}
</td>
</tr>
{/foreach}
6. 复合条件判断
{eq var=$user.status value=1}
{in var=$user.role value='admin,editor'}
{between var=$user.age start=20 end=50}
<div class="qualified-user">合格用户</div>
{/between}
{/in}
{/eq}
特性说明
- 字面量优化:自动识别数字、字符串等字面量,生成更优化的 PHP 代码。
- 表达式支持:所有参数都支持 PHP 表达式。
- 严格的错误检查:
- 确保必需参数存在。
- 确保标签正确嵌套。
- 确保 between/notbetween 参数配对使用。
- 确保 switch 至少有一个 case。
- 确保 default 标签唯一。
- 临时变量管理:自动创建和清理临时变量,避免命名冲突。
- 灵活的参数格式:
- between/notbetween 支持 start/end 或 min/max 两种格式。
- in/notin 支持逗号分隔字符串或 PHP 数组字面量。
插件扩展
Sdopx 提供多种内置插件,同时也支持自定义插件扩展。
条件判断插件(4.1.0新增)
- eq / neq:等于/不等于判断。
- empty / notempty:空值/非空判断。
- in / notin:包含/不包含判断。
- between / notbetween:范围判断。
- switch / case / default:多分支条件判断。
修饰符插件
- cat:拼接字符串。
- default:设置默认值。
- lower:转换为小写。
- upper:转换为大写。
- truncate:截断字符串。
- nl2br:将换行符转换为
标签。
自定义标签插件
- volist:遍历数组输出。
- cycle:循环输出不同值。
- extends:模板继承。
- block:定义可重写区块。
资源类型
Sdopx 支持多种资源类型加载模板:
- FileResource:从文件系统加载模板。
- StringResource:从字符串加载模板。
- Base64Resource:从 Base64 编码字符串加载模板。
- ExtendsResource:支持模板继承的资源类型。
调试支持
启用调试模式后,Sdopx 会在模板渲染出错时提供详细的错误上下文信息,帮助开发者快速定位问题。
Sdopx::$debug = true;
贡献指南
欢迎贡献代码和改进文档。请遵循以下步骤:
- Fork 项目。
- 创建新分支 (git checkout -b feature/new-feature)。
- 提交更改 (git commit -am 'Add new feature')。
- 推送分支 (git push origin feature/new-feature)。
- 创建 Pull Request。
许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。