我正在开始一个大型的编码器项目,并想尝试创建一些可重用的'迷你'视图的内容片段,如循环的数据可能显示在不同的页面/控制器。
从主控制器的视图中调用视图是否更好?如果有,怎么做?或者我应该从控制器调用"迷你视图",从而将视图的代码传递给主视图?
其他视图中的视图称为嵌套视图。有两种方法可以在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。虽然间接地两者是相同的,但第一种方法更清楚。比第二个干净!
老实说,我更喜欢通过模板视图然后从控制器加载必要的数据来做到这一点,这意味着重复的代码要少得多,并且比从视图加载视图更好地遵循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语句来决定哪个头包括,常规的一个或一个与管理菜单在它。
是的,我可以在每个主视图页面中包含页眉、侧边栏和页脚,但这最终会导致大量重复的代码。如果我想让我所有的页面都有一些新的东西,一些其他的小片段,会发生什么?使用模板,我将代码片段添加到适当的模板中,这样就完成了。另一种方法是,我找到每个页面并在那里添加片段视图,在我看来,这相当于在页面中添加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),或者如果你想在主视图的特定部分包含视图(在这种情况下最好使用method1)
方法3
将数据通过主视图传递给包含视图
插入控制器:
$data['title'] = "Title";
$this->load->view('main_view',$data);
在你的视图
$data2['title'] = $title;
$this->load->view('include/include_view',$data2);
如果你想把整个数据传递给你的include视图,你可以这样做:在你的控制器中:
$data['nestedView']['title'] = 'title';
在你的视图
$this->load->view('includes/included_view', $nestedView);
这是一个在视图中包含视图的简单方法。不需要预先加载视图。只需将视图路径传递给其他视图。
在你的控制器中使用:
$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);
我认为为了更有效地解决这个问题,我已经这样做了:
创建一个新的帮助器(在application/helpers中),名称为。Common_helpers.php,下划线很重要)。在此文件中,您将所有函数(例如构建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');
}
}
控制器在控制器
<?php
public function view($page = NULL)
{
if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
{
$data['title'] = ucfirst($page); // Capitalize the first letter
// Whoops, we don't have a page for that
show_404();
}
$data= array('');
$data['title'] = ucfirst($page); // Capitalize the first letter
$data['page_layout']='pages/'.$page;
$this->load->view('page_layout', $data);
}
?>
在Views文件夹中创建一个名为page_layout.php的页面
page_layout.php
//This is where you set the layout to call any view through a variable called $page_layout declared in the controller//
<?php
$this->load->view('header');
$this->view($page_layout);
$this->load->view('footer');
?>