一个视图的两个控制器,CodeIgniter?

时间:2011-05-19 01:12:30

标签: php model-view-controller codeigniter

嘿伙计们,我是CodeIgniter的新手,需要一些帮助。我有一个格式化帖子内容区域的控制器。问题是我还需要创建一个包含动态组的侧边栏,以及一个包含最新帖子的右侧列。这并不难,我遇到的问题是我想要每个页面上的侧栏和右栏,我不想重新编码相同的位来获取每个控制器中的数据。

没有复制/粘贴的最佳方法是什么?

6 个答案:

答案 0 :(得分:8)

有很多方法可以做到这一点。

1)模板化:这是我对大多数情况的偏好(因为我的模板很复杂),我使用类似的东西将视图渲染成变量:

$content = $this->load->view('myview', $page_data, true);

然后我将它加载到模板解析器中(你可以将它加载到另一个视图中),如下所示:

$this->load->library('parser');
$data = array(
        'page_title' => 'My Page Title',
        'page_content' => $content,
        'side_bar' => side_bar(), // function which generates your side bar
        'right_col' => right_col() // function which generates your right column
        );
$this->parser->parse('my_template', $data);

然后你的模板就像:

<html>
<head>
<title>{page_title}</title>
</head>
<body>
    <div>{side_bar}</div>
    <div>{page_content}</div>
    <div>{right_col}</div>
</body>
</html>

2)在视图中加载另一个视图:(假设您的菜单是视图而不是控制器)这样的事情:

<?php $this->load->view('menu_view'); ?> 

3)PHP包括:你究竟如何在普通的PHP中做到这一点(只包括一个指向返回菜单的控制器的URL),像这样:

<?php include("/common/sidebar"); ?>

Codeigniter将呈现该页面,然后将其包含在内。

4)AJAX ..如果“模板”内容中的内容不太重要,请使用此项,例如横幅,建议的相关项目列表等。

答案 1 :(得分:3)

使用PHP生成静态HTML页面,例如side_bar.html ... 然后你可以将它包含在其他页面上。

答案 2 :(得分:2)

您可以查看HMVC。它特别适合你所谈论的“小部件”类型区域。

基本上你要做的是创建两个完整的MVC结构 - 一个用于侧边栏和右侧列,包括控制器,模型(如果需要)和局部视图。然后,您可以直接从主视图调用此控制器,将所需内容提取到页面中。

要在视图中实际调用它,只需将以下内容放在标记中,只要您想要显示侧边栏:

<?php echo modules::run('module/sidebar/index'); ?>

索引不是必需的,但我把它放在那里证明你可以使用modules::run()调用不同的方法。您还可以将无限数量的参数传递给modules::run()

答案 3 :(得分:2)

在代码点火器中,有$this->load->view的可选第三个参数,它允许您将呈现的视图作为字符串返回,然后可以将其用于赋值。您可以做的是创建一个包含所有常用部分的主模板,作为一个非常简单的示例:

<html>
<head>
</head>
<body>
<?php echo $sidebar; ?>
<?php echo $content; ?>
<?php echo $right_column; ?>
</body>
</html>

然后,您可以在控制器中创建一个私有函数,以填充公共部分的动态内容,并将它们与您的内容和主模板结合使用:

private function BuildTemplate($view, $data) {
   // Generate sidebar content
   $sidebar_data['...'] = 'blah blah';
   $master_data['sidebar'] = $this->load->view('sidebar', $sidebar_data, true);

   // Generate right column data
   $right_data['...'] = 'blah blah';
   $master_data['right_column'] = $this->load->view('right_column', $right_data, true);

   // Now load your content
   $master_data['content'] = $this->load->view($view, $data, true);

   // Merge it into the master template and return it
   return $this->load->view('master' $master_data, true);
}

然后在适当的控制器方法中:

public function index() {
   $data['...'] = 'blah';
   echo $this->BuildTemplate('index', $data);
}

将为您提供所有内容。如果要添加页面特定标题或脚本等内容,可以选择向BuildTemplate添加额外的参数。

答案 4 :(得分:1)

我不确定您的问题是在视图中还是在(动态)数据中显示在该视图的(公共部分)中。 如果它是后者(似乎建议使用短语'我不想重新编码相同的位来获取每个控制器中的数据'),那么你有几个选项。例如。

  1. 将逻辑放在控制器外部的某个函数中,作为帮助程序或某些模型内部获取“公共”数据,然后从控制器中调用它。

  2. 让您的控制器继承您自己的自定义控制器,实现该数据收集功能。

  3. 将您的两个控制器重构为一个控制器,每个场景具有不同的功能。

答案 5 :(得分:0)

1-使用以下代码在库文件夹中创建自定义库类

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

class LoadView{

   function __construct(){
    $this->CI =& get_instance();
   }
   function load_view($page){
       $this->CI->load->view('header');
       $this->CI->load->view('sidebar');
       $this->CI->load->view($page);
       $this->CI->load->view('footer');
   }

}

2-现在像这样在您的控制器中加载该库

$this->load->library('loadview');

3-现在调用库方法,只需插入您的页面名称,您就不必一次又一次包含页眉,边栏和页脚,因为它们将被库动态包含。

$this->loadview->load_view('about.php');