迅睿 CMS 插件与模板的交互:控制器如何把数据传给视图

· 迅睿CMS · 阅读 14
摘要

写了插件、改了模板,但页面上的数据没变?多数时候是数据传递的环节没接上。标准的传递方式// 控制器 public function index() { $data = [ 'list' => $list,

写了插件、改了模板,但页面上的数据没变?多数时候是数据传递的环节没接上。

标准的传递方式

// 控制器
public function index() {
    $data = [
        'list' => $list,
        'total' => $total,
    ];
    return dr_view('index', $data);
}

dr_view() 的第二个参数是数组,键名在模板里直接当变量用。

模板里的接收方式

{loop $list $item}
  <li>{$item.title}</li>
{/loop}
共 {$total} 条

注意 {loop} 是迅睿的循环标签,和 {foreach} 不同,别混着写。

数据没传到模板的三种情况

  1. 键名覆盖——控制器里用了和系统保留变量同名的键(如 title、id),被系统值顶掉了。建议自定义数据加前缀。
  2. 没有 return——方法写了 dr_view() 但忘了 return,视图不渲染。
  3. 缓存没清——模板改了但缓存里还是旧输出。

插件里怎么影响已有页面

不改控制器,只在插件里挂钩子追加数据:

'module_view_before' => function ($data) {
    $data['extra'] = '来自插件';
    return $data;
}

前提是模板里确实输出了 {$extra},否则数据传了也没人用。插件和模板必须成对修改,单独改一边不会生效。