让你的thinkphp支持嵌套继承模板

技术分享2,672 人阅读

最近想把后台重写一下,不想再用iframe了,用整页跳转的,当然想到的就是把之前那些固定的菜单做成一个模板,然后挖坑,内容页就填充到坑里,thinkphp里面有模板继承的功能 extend,可我发现它居然不支持嵌套继承。

比如我写一个只加载bootstrap框架的basic页basic.html(放在Common/View/Boot/basic.html)

 

然后我再写一个我后台的admin_basic.html,继承刚才的basic页(放在Admin/View/Public/admin_basic.html),然后写导航、菜单,然后再挖坑。

 

然后我就写后台管理系统的首页 index.html

 

tp它居然默认无法这样实现,我觉得这个功能应该是非常重要的呀,没办法,它不实现,只能我来实现了。

当然首先就是百度了,非常幸运,让我找到下面这个大湿的博客

http://blog.csdn.net/wangzuxi/article/details/44217355

具体是找到Thinkphp/Libray/Think/Template.class.php文件,在245行附近的parseExtend方法 中 $content = $this->replaceBlock($content);这句后面增加 $content = $this->parseExtend($content); 让tp递归解析extend,然后再到340行附近的replaceBlock方法中,将  $content = $content[3]; 索引改为0

请看下在代码,注释有 [2develop]

 

我用它上面写的方法后,发现真的成功了,但是!可能我比较纠结,我发现了一个小问题。

我发现如果我 basic 里面的 block name 名为 body 的话,我在 admin_basic 里如果也挖了一个坑 name 也为 body 的话,它就会覆盖 admin_basic 里我在 body block 里写的内容了,要不就得避免 block name 值一样。

我比较龟毛,一般主体我一直喜欢用body,所以我不能妥协!

让我研究了一上午,终于让我解决了

Thinkphp/Libray/Think/Template.class.php

345附近的$reg = '/('.$begin.'block\sname=[\'"](.+?)[\'"]\s*?'.$end.')(.*?)'.$begin.'\/block'.$end.'/is';

改成下面这个

$reg = ‘/(‘.$begin.’block\sname=[\'”]([^\'”]+?)[\'”]\s*?’.$end.’)([^(?!’.$begin.’block)]*?)’.$begin.’\/block’.$end.’/is’;

 

我也不知这样改会不会有什么错误,不过我看了我其它页面都还没发现有错误的现象,仅供参考学习。