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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:17:30