在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'); } }