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]