Code Igniter - 不违反DRY的观点的最佳实践

时间:2013-02-12 17:11:03

标签: php codeigniter codeigniter-2 dry

尝试确定在codeigniter中处理视图的最佳方法。现在我认为的任何东西看起来都太乱了。

目前我有3个相关观点:

1)标题 2)内容 3)页脚

每个控制器都有这样的东西。有些控制器甚至有几次(同一控制器中的不同功能):

$this->load->view('head', $data);
$this->load->view('volunteers/add_profile.php',$content_data);
$this->load->view('foot'); 

在每个页面上加载页眉和页脚似乎很愚蠢。但是,每个页面的标题中都会有略微不同的数据(元标记,样式表,加载的脚本等)。

我有更清洁的方法吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

我喜欢用renderPage('content_view', $data)之类的方法创建一个父控制器。该方法可以包括标题,菜单,页脚,...这样,所有视图加载的东西都保存在控制器中,我不必在每个动作或视图上打扰标题,菜单或页脚。它也很灵活,因为您的子控制器可以重新定义renderPage()方法以符合其目的。

如果需要加载多个内容视图,可以创建一个renderPage()方法,该方法接受字符串数组而不是字符串。

答案 1 :(得分:1)

是 - 拥有模板视图。在您的控制器中:

$data['header'] = xxx;
$data['content'] = xxx;
$this->load->view('my_template', $data);

然后在你的my_template.php视图文件中:

$this->load->view('head', $header);
$this->load->view('volunteers/add_profile.php',$content);
$this->load->view('foot'); 

答案 2 :(得分:1)

@TheShiftExchange建议的内容,或者,如果您的应用程序允许,您可以从每个内容视图调用页眉和页脚视图(这是从控制器调用的唯一视图)。

答案 3 :(得分:0)

我创建了自己的控制器,然后在MY_Controller extends CI_Controller中创建MY_Controller类,我使用了访问修饰符$data$loadviewArray

public $data = array(); 
public $loadviewArray = array();

之后我在MY_Controller

中创建函数
public function loadview() {
   foreach ($this->loadviewArray as $key => $val) {
      $this->load->view($val, $this->data);
   }
}

然后我在Admin控制器创建函数extends中创建控制器MY_ControllerAdmin extends MY_Controller Admin,如index

public function index() {
   $this->data["page_title"] = "Login";
   $this->data["records"] = $data; // You can pass data
   $this->loadviewArray = array("admin/header", "admin/login", "admin/footer");
   $this->loadview();
}

$data访问修饰符数组中,我在视图和$loadviewArray加载视图中传递数据,然后调用一个函数来加载您可以这样做的视图,这对我现在非常有帮助。并创建页眉和页脚视图分开...

答案 4 :(得分:-1)

请检查https://github.com/alzalabany/codeigniter-base-controller/tree/master

所以你总是可以使用模板库。但由于某种原因,我不喜欢他们!

codeigniter允许您扩展其核心;如果你去上面提到的链接你可以看到一个小例子

在这个例子中,每个将扩展MY_controller的控制器都将以这些默认值

开始
protected        $body='base/body',
                        $title='Codeigniter Z master',//txt
                        $js=array(),//filename
                        $inline_js='',//script
                        $css=array(),
                        $inline_css='',//style
                        $breadcrumb=FALSE,//<li><a>
                        $content=array(),//html
                        $noEcho = FALSE;

所以如果你选择在MY_controller中更改它们,它的效果将是默认的,否则使用$ this-&gt; title ='Codeigniter - welcome page';例如,在你的控制器构造函数中;

加载辅助是一项非常简单的工作,只需调用$this->_assets()和资产位置(编辑MY_controller.php默认位置到您的资产文件夹);如果它的inline_js / css只是调用

$this->_assets('alert("hi");','js');

如果要将视图加载到页面部分,请使用$this->outv(view_path,view_data,section_name);

如果您只想将html加载到变量中,可以使用

$这 - &GT;出( '页脚', '页脚');

结束时只需调用 - &gt; _flush();

我使用的其他一些选项,如

$noEcho;如果设置它将清除所有缓冲区以在将视图内容发送到浏览器之前删除任何回声;

您还可以在MY_controller中设置注销或登录等功能,任何人工控制器都可以访问它http://localhost/ci/welcome/logout

任何方式:)我希望能回答你的问题!