如何在codeigniter中组合不同的页面?

时间:2011-09-02 04:44:54

标签: php codeigniter

假设我将页面分为4个部分。一个是横幅,一个是登录,一个是主要,另一个是页脚。横幅和页脚是静态的,它不会改变。并且登录是基于不同的用户权限或登录状态,最后主要基于很多事情来做。所以,我有4个部分:

http://localhost:8888/my_app/index.php/static_page/banner

http://localhost:8888/my_app/index.php/static_page/footer

http://localhost:8888/my_app/index.php/user/login_fragment

http://localhost:8888/my_app/index.php/system/main_fragment

但是用户只能看到一个页面,但它将所有人员组合在一起......所以,我不是让iframe将它们放在一起,而是如何让这些页面分开逻辑,但可以在一个视图中组合?谢谢。

4 个答案:

答案 0 :(得分:3)

我想分享我的所作所为。虽然不是一个原创的想法(不记得我从哪里来),但希望这对你有帮助。我有一个'includes'[application / views / includes]文件夹,其中包含以下文件:

  

footer.php,header.php,navigation.php和template.php

现在template.php中的代码如下:

$this->load->view('includes/header'); 
$this->load->view($main_content); 
$this->load->view('includes/footer');

使用方法,我举个例子:

$data = array (
  'page_title'    => 'Users Listing',
  'title'         => 'Users Listing',
  'main_content'  => 'users/showlist',            
);

$this->load->view('includes/template', $data));

$ data数组中的元素将在视图[application / views / users / showlist.php]中以$ page_title,$ title等形式提供。您还可以发送数组或HTML内容。

答案 1 :(得分:0)

只需多次调用load->视图

在控制器方法中:

function index()
{
 $this->load->view("banner",array(/** some parameters if you want **/));
 $this->load->view("main",array(/** some parameters if you want **/));
 $this->load->view("footer"); // this one doesn't need parameters maybe
}

请参阅views文档页面

注意:在视图文件本身(例如banner.php内)中,您可以再次调用load-view来插入嵌套视图。

注意2:如果你不想立即输出,你还可以将load-> view的结果返回给变量,方法是添加一个true参数作为第三个参数:

$login_box = $this->load->view("login",array(),true);

// $login_box contains the view html.

echo $login_box; // or pass it as a parameter to another view if you want

答案 2 :(得分:0)

首先

$this->load->view('filename');

可以在同一控制器功能中使用多次,它们将以正确的顺序显示。

您所做的是在必须在同一控制器中使用的控制器部件中分开。我想你有像

这样的文件
/application/controllers/static_page.php
/application/controllers/user.php
/application/controllers/system.php

并且,如果没有对CodeIgniter进行大量修改,您就无法从另一个控制器调用控制器,这就是阻止您的操作。如果必须对许多函数使用相同的处理代码,则必须创建一个helper,可以在任何地方使用,或者更优雅的解决方案,即在/libraries/MY_Controller.php中具有通用控制器函数

总是在调用控制器之前调用MY_Controller.php

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        // you can do any kind of processing here
        // in example if you have some view counter
        // this place is always called
    }

    function a_generic_function($rawdata)
    {
        // do some processing here

        return $data;
    }


}

然后,您将能够在任何控制器中使用此功能:

$this->a_generic_function($rawdata);

现在,处理页眉+页脚的最智能方法是创建一个包含页眉和页脚的“布局”文件。

这是layout.php视图的一个例子:

<!doctype html>
<head>
    <meta charset="utf-8">
    <title><?php echo $title; ?></title>
</head>
<body>
    <div id="container">
        <header>This page has been made by <?php echo $user_name; ?>/header>

        <div id="main" role="main">
            <?php echo $main_content_view; ?>
        </div>

        <footer>Write your footer here</footer>
    </div>
</body>
</html>

你看到中间有$ main_content_view。

有了这个,你将在你的控制器中做到:

// add the HTML for the login to the variable
// TRUE means we don't output it in the browser, but put it in a String
$this->viewdata["main_content_view"] = $this->load->view('login', $data, TRUE);

// want to add more data? just ADD it to the variable, like a String
$this->viewdata["main_content_view"] += $this->load->view('main', $data, TRUE);

// done? send it to the layout, and pass it the $this->viewdata
$this->load->view('layout', $this->viewdata);

你还能做些什么呢?您可以使用$ this-&gt; viewdata,如:

$this->viewdata["title"] = 'Function title';
$this->viewdata["user_name"] = $user_name;

因此您可以像任何其他视图一样编辑您的布局。

答案 3 :(得分:0)

Phil Sturgeon为Codeigniter编写了一个流行的模板库,它将以比目前为止在其他答案中描述的更智能的方式完成您想要的任务。您可以在此处阅读其文档:http://philsturgeon.co.uk/demos/codeigniter-template/user_guide/

文档可能需要一段时间才能理解,因为它缺少示例。

您可以在此处下载模板库:https://github.com/philsturgeon/codeigniter-template