# sdopx
**Repository Path**: wj008/sdopx
## Basic Information
- **Project Name**: sdopx
- **Description**: No description available
- **Primary Language**: PHP
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-19
- **Last Updated**: 2026-01-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Sdopx 模板引擎
Sdopx 是一个基于 PHP 的高性能模板引擎,提供灵活的模板编译和渲染功能,适用于 Web 开发中的视图层处理。
## 特性
- **模板继承**:支持模板继承机制,便于构建可复用的页面结构。
- **编译优化**:将模板编译为原生 PHP 代码,提升执行效率。
- **插件系统**:提供丰富的插件支持,如变量修饰符、自定义标签等。
- **多条件判断**:支持多种条件判断标签,简化模板逻辑。
- **多资源支持**:支持从文件、字符串、Base64 等多种资源加载模板。
- **调试功能**:内置调试支持,便于开发过程中排查问题。
## 安装
使用 Composer 安装 Sdopx:
```bash
composer require wj008/sdopx
```
## 使用示例
### 基本用法
```php
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');
```
### 模板语法示例
```smarty
{* index.tpl *}
Hello, {$name}!
```
其他语法请查阅 http://sdopx.wj008.net
## Sdopx 4.0.4 以上新语法特点
4.0.4 版本优化了代码结构,修正错误输出的提示内容,以及定位错误代码位置。
- **左分界符号右侧如有空格及换行将被视为 HTML 代码不被解析为模板**
```smarty
```
以上代码将会原样输出。
- **新增模板内直接变量赋值及添加变量链接修饰器 |cat**
```smarty
{$name = 'sdopx'}
{$temp = $name|cat:' ok?'}
```
- **支持 PHP 内置的字符串处理函数以修饰器的形式调用**,如:
```smarty
{$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** - 等于/不等于判断
```smarty
{eq var=$user.level value=2}
您是编辑
{/eq}
{neq var=$user.id value=0}
用户ID不为0
{/neq}
```
**empty / notempty** - 空值/非空判断
```smarty
{empty var=$user.email}
邮箱未设置
{/empty}
{notempty var=$products}
{foreach $products as $product}
- {$product.name}
{/foreach}
{/notempty}
```
### 2. 范围判断
**between / notbetween** - 在/不在范围内判断
```smarty
{between var=$user.age start=18 end=60}
成年人
{/between}
{notbetween var=$score min=0 max=59}
及格以上
{/notbetween}
{between var=$price min=100 max=500}
价格在合理范围
{/between}
```
### 3. 包含判断
**in / notin** - 包含/不包含判断
```smarty
{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** - 多分支条件判断
```smarty
{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'}
管理员
{/case}
{case value='editor'}
编辑
{/case}
{default}
访客
{/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. 条件嵌套使用
```smarty
{foreach from=$orders item=order attr='attr'}
| {$order.order_no} |
{switch var=$order.status}
{case value=0}
待支付
{/case}
{case value=1}
已支付
{/case}
{case value=2}
已发货
{/case}
{case value=3}
已完成
{/case}
{/switch}
|
{if $order.status == 0}
{elseif $order.status == 1}
{/if}
|
{/foreach}
```
### 6. 复合条件判断
```smarty
{eq var=$user.status value=1}
{in var=$user.role value='admin,editor'}
{between var=$user.age start=20 end=50}
合格用户
{/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 会在模板渲染出错时提供详细的错误上下文信息,帮助开发者快速定位问题。
```php
Sdopx::$debug = true;
```
## 贡献指南
欢迎贡献代码和改进文档。请遵循以下步骤:
1. Fork 项目。
2. 创建新分支 (git checkout -b feature/new-feature)。
3. 提交更改 (git commit -am 'Add new feature')。
4. 推送分支 (git push origin feature/new-feature)。
5. 创建 Pull Request。
## 许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。