用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10697|回复: 17
收起左侧

[已解决] 请问高手,如何在每个页面中都调用头文件?

[复制链接]
发表于 2008-2-13 22:16:17 | 显示全部楼层 |阅读模式
比如说,我要做个blog,blog有个模板文件,分别是header.php和bottom.php,

其中模板header.php由控制器Header中output()方法解析并返回,模板bottom.php由控制器Bottom中output()方法解析并返回

那么我现在要在所有其他的控制器中输出并显示头、尾文件,是不是只能在控制器__construct()中
PHP复制代码
require('/app/controllers/header.php);
echo Header::output();
复制代码

然后在控制器的__desctruct()中
PHP复制代码
require('/app/controllers/bottom.php);
echo Bottom::output();
复制代码

这样才可以?

但是我觉得这样不太像oo的风格,而且在PHP4下不能运行(因为貌似PHP4不认识__construct()和__destruct()),有没有更好的办法?

大家一般在调用这样公共显示的部分时,是怎么做的?

谢谢。

[ 本帖最后由 shishirui 于 2008-2-14 00:25 编辑 ]
发表于 2008-2-13 23:06:43 | 显示全部楼层
你这样不行吧?
我一般就是在视图里嵌套另外的视图。
发表于 2008-2-13 23:46:11 | 显示全部楼层
PHP复制代码
<?=$this->load->view('HeaderView')?>
复制代码

如楼上说的那样,在视图里面加载另一个视图文件
 楼主| 发表于 2008-2-14 00:23:57 | 显示全部楼层
哦原来这样啊

那如果'HeaderView'里面有变量,我需要把一些值赋值给变量怎么弄呢?


PHP复制代码
<?=$this->load->view('HeaderView',$data)?>
复制代码


$data要从数据库中取得,总不能在模板里写这段数据库操作代码吧?因为感觉不太好~

谢谢

[ 本帖最后由 shishirui 于 2008-2-14 00:25 编辑 ]
发表于 2008-2-14 02:40:50 | 显示全部楼层
load 父视图的时候把 $data 传进去。

PS: 楼上这么写,倒是另一种方法,只是我没试过。
发表于 2008-2-14 08:09:53 | 显示全部楼层
也可以不在view中写,
直接在Controller中调用,
传入view。
 楼主| 发表于 2008-2-14 10:32:58 | 显示全部楼层
嗯,谢谢楼上和楼上,似乎现在也只有这种方法比较好了。
发表于 2008-2-14 11:46:52 | 显示全部楼层
原帖由 shishirui 于 2008-2-14 00:23 发表
哦原来这样啊

那如果'HeaderView'里面有变量,我需要把一些值赋值给变量怎么弄呢?




$data要从数据库中取得,总不能在模板里写这段数据库操作代码吧?因为感觉不太好~

谢谢 ...


这样的写法,就等同Smarty的{include}那样,你说的传入$data,按我说的那样,HeaderView其实完全就没必要再去传入$data了,比方你在ProductsController里面调用ProductsView,并传入$data,然后ProductsView里面加载HeaderView,那么HeaderView的视图变量就是ProductsController传入的咯,而头部文件一般都有一些固定的变量值吧,那么只要在父Controller里面先设定一些固定的,然后子Controller都继承它,也就不需要再每次都去重设置值,如果需要重设,也只是用新值去覆盖掉旧的。我这样说你可能觉得很迷糊,因为之前我是用smarty,后来用ThinkPHP也是这样,一直是用这种方法。
而且楼上说的写法是一样的呀,只是写的地方不同,怎么灵活去运用才是重点:)
 楼主| 发表于 2008-2-14 14:42:43 | 显示全部楼层

回复 8楼 的帖子

非常感谢您的回复。
明白了很多了,但是不知道在ci里面如何设置父Controller和子Controller?好像没有这样的功能是吗?
发表于 2008-2-14 15:07:14 | 显示全部楼层
不需要去设置什么,是面向对象编程的设计,比方说你的全部或一些视图文件都需要加载HeaderView和FooterView,而这两个视图文件都需要设置一下东西变量之类的,你就可以写在一个Controller里面,然后用其它的Controller文件继承他,这样全部Controller都能获得同样的功能了,不必重复写同样的代码。
PHP复制代码
//Base继承Controller类,然后就可以在Base里面定义一些其它Controller类都需要用到的方法和属性等等
class Base extends Controller{
    function __construct(){
        parent::Controller();
        $this->load->helper('MyHelper');
    }
    function index(){
        ......
    }
    function _createFCK(){
        ......
        $this->data['fckhtml'] = $oFCKeditor->CreateHtml();
    }
}
复制代码
PHP复制代码
//Home继承Base类,这样就可以获得同样的方法和属性
class Home extends Base{
}
复制代码

[ 本帖最后由 tiana 于 2008-2-14 15:13 编辑 ]

本版积分规则