用户
 找回密码
 入住 CI 中国社区

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 7113|回复: 20
收起左侧

[库 Library] [2.2.0] CI 视图继承类库,可用于视图 Layout

  [复制链接]
发表于 2014-10-11 15:22:34 | 显示全部楼层 |阅读模式
为 CI 增加视图继承功能,不改变原有视图编写方式,无缝增加视图继承功能。

开源项目地址: https://github.com/hex-ci/hulk-template

安装方法

  • 把 Hulk_template.php 放到 ./application/libraries 目录下
  • 创建目录 ./application/third_party/hulk_template/views,如果目录不存在则要自己手动逐级创建。
  • 把 ./application/third_party/hulk_template/views 目录设为可写,Linux 下一定要保证 Apache 或 Nginx 对这个目录可写。


使用方法

例子:
父视图:
HTML复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Welcome to <# block title #>CodeIgniter<# /block #></title>
</head>
<body>
    <h1>Welcome to <# block title #>CodeIgniter<# /block #>!</h1>
</body>
</html>
复制代码

子视图:
HTML复制代码
<# extends parent_message #>
 
<# block title #>CI Chinese<# /block #>
复制代码

控制器:
PHP复制代码
class Welcome extends CI_Controller {
 
    public function index()
    {
        // 载入类库
        $this->load->library('hulk_template');
 
        // 加载子视图。这里可直接代替 $this->load->view() 的功能。
        $this->hulk_template->parse('welcome_message');
    }
}
复制代码


视图继承语法

实现视图继承的标签默认采用 <# 开头,#> 结尾,当然,你可以在代码里自定义成你喜欢的形式。例如: <# block #>

目前有 2 个标签:extends 和 block

extends 标签语法:

<# extends 视图路径 #>

例如 <# extends welcome/test #>

这里指的是从 ./application/views/welcome/test.php 这个视图继承。

注意:extends 标签必须在视图文件首行首字母位置。另外这个标签不需要结束标签。

block 标签语法:

<# block 名称 #>内容...<# /block #>

在父视图中使用 block 代表定义一个名为“名称”的 block。
在子视图中使用 block 代表替换父视图中同名的 block。
发表于 2014-12-2 02:09:00 | 显示全部楼层
是不是不支持嵌套?
view1:
<# block content1 #><# /block #>

view2:
<# extends view1 #>
<# block content1 #>
         <# block content2 #><# /block #>
<# /block #>

view3:
<# extends view3 #>
<# block content2 #>test<# /block #>

controller:
$this->hulk_template->parse('view3');

发现当解析view2时 直接把<# block content1 #><# block content2 #><# /block #>当成了一对标签,无视了<# block content2 #>
发表于 2014-12-5 20:15:28 | 显示全部楼层
Hex 发表于 2014-12-2 10:13
对的,block 不能嵌套,你这个是什么需求?如果有需求我想想怎么实现。
因为我自己的开发中,没有嵌套的 ...

恩,谢谢,多加了几个block变相实现了。
本来是想这样的
比方 主框架一个模板文件A(头尾导航),然后用户登录后有个用户管理菜单也一个模板文件B(左侧菜单)
最后“模块内容”嵌入“模板文件B”再嵌入“模板文件A”,这样感觉修改起来方便。也不会有多余的代码。
不过现在也实现了。感觉也行。
如果要使这个类强大易用,楼主也可以继续扩展实现。十分感谢。
 楼主| 发表于 2014-10-11 17:28:59 | 显示全部楼层
yuzhigang5460 发表于 2014-10-11 17:10
什么情景下要用到继承视图?
为何不使用控制器直接改变title呢?

这里的关键不是改变 title

这里要做的是从父视图继承一种布局,子视图只需要填充父视图的某些 block 就可以生成一个新视图。

这样就可以做一些很相似但局部又不同的视图了,否则你就要 copy 一堆视图文件,维护会很不方便。

发表于 2014-10-11 17:10:41 | 显示全部楼层
什么情景下要用到继承视图?
为何不使用控制器直接改变title呢?
发表于 2014-10-12 10:43:18 | 显示全部楼层
支持一下,确实有这个需求!!!
发表于 2014-10-12 19:16:14 | 显示全部楼层
很實用的分享
发表于 2014-10-13 15:14:41 | 显示全部楼层
本帖最后由 kuailewang 于 2014-10-13 15:20 编辑

ci一直就缺少这样一个东西 确实是好东西希望更多的好东西 可以分享出来
发表于 2014-10-14 10:49:36 | 显示全部楼层
的确是个好东西
发表于 2014-11-12 23:23:33 | 显示全部楼层
Hex的好东西啊,具体应用方位简单说了还不是很清楚。
 楼主| 发表于 2014-11-13 15:31:46 | 显示全部楼层
lvhjean 发表于 2014-11-12 23:23
Hex的好东西啊,具体应用方位简单说了还不是很清楚。

可以用于做 layout

发表于 2014-11-26 21:02:57 | 显示全部楼层
为什么用<##>啊,感觉很不习惯啊,为什么不用{}或者<{}>

本版积分规则