CodeIgniter自定义Loader模板:视图子目录变量传递失败问题
解决CodeIgniter自定义模板加载器在子目录视图中无法传递变量的问题
嘿,我来帮你搞定这个头疼的问题!你的自定义MY_Loader思路是对的,但可能是变量传递的方式在子目录视图场景下出了点小坑,咱们一步步来排查修复:
问题根源
你原来的代码里,每个view调用都手动传了$vars,理论上不管视图在根目录还是子目录都应该生效,但可能是CodeIgniter视图加载的底层逻辑在处理子目录时,对变量传递的处理有细微差异(比如作用域或缓存的小问题)。不过没关系,换个更稳妥的方式就能解决。
修复方案:全局注册变量
修改你的MY_Loader类,用$this->vars($vars)把变量提前注册到加载器的全局变量池里,这样所有视图(不管在哪个目录)都能自动获取到这些变量:
<?php class MY_Loader extends CI_Loader { public function template($template_name, $vars = array(), $return = FALSE) { // 先把变量全局注册,所有后续视图都能直接调用 $this->vars($vars); if ($return) { $content = $this->view('common/header', array(), $return); $content .= $this->view($template_name, array(), $return); $content .= $this->view('common/footer', array(), $return); return $content; } else { $this->view('common/header'); $this->view($template_name); $this->view('common/footer'); } } }
这样修改后,你不用再给每个view单独传$vars了,加载器会自动把全局注册的变量传递给所有视图,完美解决子目录视图的变量传递问题。
额外排查小技巧
如果还是不行,你可以试试这几步排查:
- 打开子目录的
welcome_message.php,直接用<?php var_dump($test); ?>打印变量,排除视图本身的写法问题; - 去
application/logs目录查看CodeIgniter的日志,有没有变量未定义或者视图加载失败的报错信息; - 在控制器里加个
var_dump($data),确认$test确实被正确放进数组里了。
为啥根目录能生效?
其实理论上原来的写法在子目录也应该有用,可能是你根目录的视图刚好有其他获取变量的途径(比如之前测试留下的全局变量),或者CodeIgniter对根目录视图的变量传递做了隐性优化。但用全局注册变量的方式是更可靠的通用方案,以后不管视图放哪都不会出问题。
内容的提问来源于stack exchange,提问作者Chocolate MIlk
相关产品推荐
相关产品推荐

