在CodeIgniter视图中包含视图的最佳方法

我开始一个大型的codeigniter项目,并希望尝试创build一些可重复使用的“迷你”视图,例如可能在不同页面/控制器上显示的数据循环。

从主控制员的angular度来看是否更好? 如果是这样,怎么样? 还是应该从控制器调用“迷你视图”,然后将视图的代码传递给主视图?

其他视图中的视图称为嵌套视图 。 有两种在CodeIgniter中包含嵌套视图的方法:

1.在控制器中加载嵌套视图

预先加载视图并转到另一个视图。 首先把它放在控制器中:

<?php // the "TRUE" argument tells it to return the content, rather than display it immediately $data['menu'] = $this->load->view('menu', NULL, TRUE); $this->load->view ('home', $data); ?> 

然后在您想要菜单出现的位置放入<?=$menu?>

2.从视图中加载视图

首先把它放在控制器中:

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

然后把这个放在/application/views/home.php视图中:

 <?php $this->view('menu'); ?> <p>Other home content...</p> 

关于最好的方法,我比第二种方法更喜欢第一种方法,因为通过使用第一种方法,我不必混淆代码,它不像包括 PHP。 尽pipe间接都是一样的,第一种方法比第二种方法更清晰。

老实说,我更喜欢通过使用模板视图,然后从控制器中加载必要的数据来做到这一点,这意味着重复代码less得多,并且遵循DRY概念比从视图加载视图更好。 尤其是对于页眉,页脚和菜单等内容。

所以我的模板视图看起来像这样:

的template.php

 $this->load->view('header',$title); $this->load->view('sidebar',$sidebar_content); $this->load->view('main_content',$main_content); $this->load->view('footer'); 

然后在我的控制器中传递所需的数据到这个模板:

 $data['title'] = 'Home Page'; $data['sidebar_content']='pages/standard_sidebar'; $data['main_content'] ='pages/my_home_page'; $this->load->view('template',$data); 

这样做有很多好处。 首先是我可以有多个模板,例如,在我的情况下,我有两个主要的模板,一个用于没有侧边栏的完整页面视图,另一个用于带有侧边栏的页面,我还调用if语句来决定包含哪个头,普通的还是带有pipe理菜单的。

是的,我可以在每个主视图页面中包含页眉,侧边栏和页脚,但最终会出现大量重复的代码。 如果我想让所有的页面都有新的东西,还有一些小的片段,会发生什么呢? 使用模板,我将代码片段添加到适当的模板,并完成。 去其他路线,我发现每一个页面,并在那里添加片段视图,这相当于在我看来,页面中的CSS,浪费,并不能最终维护。

方法1

我使用这个方法进入我的视图插入包含视图,我想要的地方

 $this->load->view('include/include_view'); 

方法2

或在控制器中,你可以加载一个比这样的视图:

 $this->load->view('header_view'); $this->load->view('list_view'); $this->load->view('footer_view'); 

是不是一个更好的方法,取决于如果你必须传递一些数据(诠释他的情况下使用method2),或者如果你想包括一个视图在你的主视图的特定部分(在这种情况下更好地使用方法1 )

方法3

通过主视图将数据传递给您的包含视图

进入你的控制器:

 $data['title'] = "Title"; $this->load->view('main_view',$data); 

在你看来

 $data2['title'] = $title; $this->load->view('include/include_view',$data2); 

如果你想传递整个数据到你的包含视图,你可以在这个模式下进行:在你的控制器中:

 $data['nestedView']['title'] = 'title'; 

在你看来

 $this->load->view('includes/included_view', $nestedView); 

这是一种简单的方式,在视图中包含视图。不需要提前加载视图。只需将视图path传递到其他视图。

在你的控制器中使用这个:

 $data['middle'] = 'includeFolder/include_template_view'; //the view you want to include $this->load->view('main_template_view',$data); //load your main view 

在main_template_view中可以包含其他视图:

 $this->load->view($middle); 

在我看来,为了更有效地解决这个问题,我这样做了:

你用名字(例如common_helpers.php,下划线是重要的)创build一个新的助手(在application / helpers中)。 在这个文件中,你把所有的function,例如build立共同的html片段。

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); function getHead(){ require_once(APPPATH."views/common/head.php"); } function getScripts(){ require_once(APPPATH."views/common/scripts.php"); } function getFooter(){ require_once(APPPATH."views/common/footer.php"); } 

在你的控制器中,你只调用一个MVC方面的视图,并从你的自定义帮助器中调用函数。

 class Hello extends CI_Controller { public function index(){ $this->load->helper('common'); $this->load->view('index'); } }