如何在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
相关产品推荐
相关产品推荐

