嘿伙计们,我是CodeIgniter的新手,需要一些帮助。我有一个格式化帖子内容区域的控制器。问题是我还需要创建一个包含动态组的侧边栏,以及一个包含最新帖子的右侧列。这并不难,我遇到的问题是我想要每个页面上的侧栏和右栏,我不想重新编码相同的位来获取每个控制器中的数据。
没有复制/粘贴的最佳方法是什么?
答案 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)
我不确定您的问题是在视图中还是在(动态)数据中显示在该视图的(公共部分)中。 如果它是后者(似乎建议使用短语'我不想重新编码相同的位来获取每个控制器中的数据'),那么你有几个选项。例如。
将逻辑放在控制器外部的某个函数中,作为帮助程序或某些模型内部获取“公共”数据,然后从控制器中调用它。
让您的控制器继承您自己的自定义控制器,实现该数据收集功能。
将您的两个控制器重构为一个控制器,每个场景具有不同的功能。
答案 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');