Smarty框架中PHP向.tpl模板传数组 解决assign赋值后取值为Null问题
Smarty框架PHP传数组到模板返回Null的解决步骤
1. 先排查PHP侧赋值逻辑
- 首先确认
$smarty->assign('data', $data)执行前,$data本身是非空的:可在赋值前临时加var_dump($data)打印验证,排除源数据本身为Null的情况。 - 确认赋值完成后,调用了
$smarty->display('你的模板文件名.tpl')触发模板渲染,未执行display的情况下赋值不会同步到模板。 - 确认赋值和渲染用的是同一个Smarty实例:如果在多个方法/类中调用Smarty,避免重复实例化新的Smarty对象,不同实例之间的赋值不互通。
- 变量名严格匹配:assign的变量名大小写和模板中调用的完全一致,Smarty变量区分大小写,比如assign的是
data,模板写{$Data}就会返回空。
2. 调整模板侧数组取值逻辑
Smarty不支持直接用{$data}打印整个数组,直接输出数组类型变量默认会返回空,需要按以下方式取值:
- 取单个数组元素:
索引数组用{$data[0]}、{$data[1]}的格式;关联数组用{$data.键名}或者{$data['键名']}的格式,比如{$data.username}。 - 遍历输出整个数组:
用Smarty内置的foreach语法遍历:{foreach from=$data item=val} <!-- 输出单条值,如果val是子数组继续取对应键即可 --> <span>{$val}</span> {/foreach} - 临时调试看数组结构:可以用
{$data|print_r}或者{$data|var_dump}打印完整数组结构,确认参数是否成功传到模板。
3. 排查缓存问题
如果开启了Smarty编译缓存,先清空templates_c目录下的所有编译文件,或者调试阶段临时关闭缓存:
$smarty->caching = Smarty::CACHING_OFF;
避免旧的编译缓存没有加载最新的赋值参数。
内容的提问来源于stack exchange,提问作者Aya Ashraf
相关产品推荐
相关产品推荐

