CodeIgniter 中国开发者社区诚征热爱 CI 的版主

查看完整版本: 请问高手,如何在每个页面中都调用头文件?

shishirui 2008-2-13 22:16

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

比如说,我要做个blog,blog有个模板文件,分别是header.php和bottom.php,

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

那么我现在要在所有其他的控制器中输出并显示头、尾文件,是不是只能在控制器__construct()中
[code=PHP]require('/app/controllers/header.php);
echo Header::output();[/code]
然后在控制器的__desctruct()中
[code=PHP]require('/app/controllers/bottom.php);
echo Bottom::output();[/code]
这样才可以?

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

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

谢谢。

[[i] 本帖最后由 shishirui 于 2008-2-14 00:25 编辑 [/i]]

Hex 2008-2-13 23:06

你这样不行吧?
我一般就是在视图里嵌套另外的视图。

tiana 2008-2-13 23:46

[code=PHP]<?=$this->load->view('HeaderView')?>[/code]
如楼上说的那样,在视图里面加载另一个视图文件

shishirui 2008-2-14 00:23

哦原来这样啊

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


[code=PHP]<?=$this->load->view('HeaderView',$data)?>[/code]

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

谢谢

[[i] 本帖最后由 shishirui 于 2008-2-14 00:25 编辑 [/i]]

Hex 2008-2-14 02:40

load 父视图的时候把 $data 传进去。

PS: 楼上这么写,倒是另一种方法,只是我没试过。

moonster 2008-2-14 08:09

也可以不在view中写,
直接在Controller中调用,
传入view。

shishirui 2008-2-14 10:32

嗯,谢谢楼上和楼上,似乎现在也只有这种方法比较好了。

tiana 2008-2-14 11:46

[quote]原帖由 [i]shishirui[/i] 于 2008-2-14 00:23 发表 [url=http://codeigniter.org.cn/forums/redirect.php?goto=findpost&pid=1504&ptid=267][img]http://codeigniter.org.cn/forums/images/common/back.gif[/img][/url]
哦原来这样啊

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




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

谢谢 ... [/quote]

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

shishirui 2008-2-14 14:42

回复 8楼 的帖子

非常感谢您的回复。
明白了很多了,但是不知道在ci里面如何设置父Controller和子Controller?好像没有这样的功能是吗?

tiana 2008-2-14 15:07

不需要去设置什么,是面向对象编程的设计,比方说你的全部或一些视图文件都需要加载HeaderView和FooterView,而这两个视图文件都需要设置一下东西变量之类的,你就可以写在一个Controller里面,然后用其它的Controller文件继承他,这样全部Controller都能获得同样的功能了,不必重复写同样的代码。
[code=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();
    }
}[/code]
[code=PHP]//Home继承Base类,这样就可以获得同样的方法和属性
class Home extends Base{
}[/code]

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

shishirui 2008-2-14 20:36

原来是这样啊
恍然大悟
谢谢!!
非常感谢!!
我这就去试试去!

感谢万分!五体投地!

shishirui 2008-2-15 10:49

tiana,按照你的方法行不通

我首先在controller目录下创建了一个Base控制器:

[code=PHP]class Base extends Controller {

        protected $tdata = array();

        function base()
        {
                parent::Controller();
                $this->load->scaffolding('blogs');
                $this->load->library('blogexit');
        }

}[/code]

然后我又创建 Blog 控制器:

[code=PHP]class Blog extends Base {

        function Blog()
        {
                ...
        }

}[/code]

但是出现了错误:

[code=TEXT]Fatal error: Class 'Base' not found in D:\\htdocs\\ci\\system\\application\\controllers\\blog.php on line 3[/code]

请问 Base 应该在哪儿定义才可以?

[[i] 本帖最后由 shishirui 于 2008-2-15 10:50 编辑 [/i]]

tiana 2008-2-15 10:59

:P 你有没有先导入需要的类呢?

shishirui 2008-2-15 11:02

您的意思是在每个控制器前都导入一下base.php吗?
[code=PHP]require_once('base.php')
class Blog extends Base {

        function Blog()
        {
        ...        
        }

}[/code]

tiana 2008-2-15 11:23

[quote]原帖由 [i]shishirui[/i] 于 2008-2-15 11:02 发表 [url=http://codeigniter.org.cn/forums/redirect.php?goto=findpost&pid=1543&ptid=267][img]http://codeigniter.org.cn/forums/images/common/back.gif[/img][/url]
您的意思是在每个控制器前都导入一下base.php吗?
require_once('base.php')
class Blog extends Base {

        function Blog()
        {
        ...        
        }

} [/quote]
是的
[code=PHP]<?php
class Base extends Controller {
    function base(){
        parent::Controller();
    }
    function index(){
        echo "index";
    }
    function test(){
        echo "test";
    }
}
?>[/code]
[code=PHP]<?php
include_once("base.php");
class Blog extends Base {
    function Blog(){
        parent::base();
    }
}
?>[/code]

[[i] 本帖最后由 tiana 于 2008-2-15 11:26 编辑 [/i]]

shishirui 2008-2-15 11:27

嗯嗯,彻底明白了,非常非常的感谢!
页: [1]
查看完整版本: 请问高手,如何在每个页面中都调用头文件?