You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Smarty3修饰器插件中访问模板变量的值

Smarty3 修饰器实现性别匹配词汇选择

核心问题

需要编写Smarty3修饰器插件,根据模板中定义的性别值匹配对应词汇,优先使用管道符调用形式{'男版表述|女版表述|未知性别表述'|genderize},不清楚修饰器插件内如何访问$smarty对象读取模板变量。

解决方案

Smarty3的修饰器插件原生支持获取Smarty对象引用,不需要特殊配置,遵循插件定义规则即可:

  • 修饰器插件命名规范为smarty_modifier_[修饰器名称]
  • 函数第一个参数固定为管道符前传入的待处理值,最后一个参数会自动传入Smarty对象引用
  • 拿到Smarty对象后,通过getTemplateVars(变量名)方法就能直接读取模板内赋值的所有变量,包括你定义的性别字段

完整插件代码

将以下代码保存为modifier.genderize.php,放到项目的Smarty插件目录下即可直接使用:

<?php
function smarty_modifier_genderize($input, &$smarty)
{
    // 按竖线拆分三个版本的文本,限制最多拆3段,避免文本内部带竖线时报错
    $parts = explode('|', $input, 3);
    // 补全缺失的文本段,防止数组下标越界
    $parts = array_pad($parts, 3, '');
    list($maleText, $femaleText, $unknownText) = $parts;

    // 读取模板中定义的性别变量,这里默认变量名为$gender,可根据自身业务修改
    // 性别值约定:1=男性 2=女性 其余值=未知,可根据业务规则调整判断逻辑
    $gender = (int)$smarty->getTemplateVars('gender');
    
    return match($gender) {
        1 => $maleText,
        2 => $femaleText,
        default => $unknownText
    };
}

使用注意事项

  • 只要在PHP端或者模板内提前给性别变量赋值就能正常生效,比如PHP端$smarty->assign('gender', 1)、模板内{assign var='gender' value=2}都可以被读取
  • 如果你的性别变量不是命名为gender,直接修改getTemplateVars()里的参数即可;也可以给修饰器加可选参数自定义变量名,比如实现{'他|她|TA'|genderize:'userGender'}的调用形式,只需要给函数加第二个参数接收变量名即可
  • 如果待匹配的文本本身包含竖线,可以把分隔符换成其他不会出现在文本里的符号,比如||、%%,对应修改explode的第一个参数就行

内容的提问来源于stack exchange,提问作者SunWuKung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:18:20