Smarty模板变量无法在PHP标签中访问问题求解(Smarty 2.6.7)
解决Smarty 2.6.7中{php}标签无法访问模板变量的问题
首先得搞清楚你的代码出问题的核心原因:在Smarty 2.x版本里,{php}标签内的PHP代码运行在独立作用域,模板里的{$date}变量并不会自动进入PHP的全局作用域,所以你用global $date根本拿不到模板里的日期值——这就是为什么输出中间会出现--(因为$date未定义为空),而后面的日期计算因为用了无效的$date值(默认被当作0,对应1970年的时间戳),才会得到1968这种奇怪的年份。
下面给你两种实用的解决方法,按需选择:
方法1:在{php}标签内正确获取模板变量
你可以通过Smarty实例的get_template_vars()方法来获取模板变量的值,在{php}块里,$this就代表当前的Smarty对象。修改后的代码如下:
{$date} {php} // 从Smarty模板中取出$date变量的值 $date = $this->get_template_vars('date'); echo "-{$date}-"; // 计算并输出前一年的年份 $prevYear = date("Y", strtotime(date("Y-m-d", $date) . " -1 year")); echo $prevYear; {/php}
这样修改后,就能正确拿到模板里的{$date}值,输出结果会符合你的预期:March 8, 2018-March 8, 2018-2017。
方法2:用Smarty内置修饰器替代{php}标签
Smarty的设计理念就是尽量在模板里少写原生PHP代码,你可以用它的内置修饰器来实现同样的效果,代码更简洁也更符合模板规范:
{$date}-{$date}-{assign var="prevYearTimestamp" value=$date|date_format:"%Y-%m-d"|strtotime:"-1 year"}{$prevYearTimestamp|date_format:"%Y"}
这里用到了三个Smarty核心功能:
date_format:把时间戳格式化为指定的日期字符串strtotime:解析日期字符串为时间戳,并处理-1 year的偏移assign:临时存储计算后的时间戳,方便后续格式化
这种写法不需要依赖{php}标签,在Smarty 2.6.7里完全可以正常运行。
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

