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

我正在启动一个大型的 codeigniter 项目,想尝试为可以显示在不同页面/控制器上的内容片段(如数据循环)创建一些可重用的“迷你”视图。

从主控制器的视图中调用视图是否更好?如果是这样,怎么做?或者我应该从控制器调用“ mini 视图”,从而将视图的代码传递给主视图?

108814 次浏览


我在视图中使用此方法在需要的位置插入 include 视图

$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);

其他视图中的视图称为 嵌套视图。 在 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。虽然间接地两者是相同的,但第一种方法比第二种方法更清楚、更干净!

这是一种将视图包含在 views.there 中的简单方法,不需要预先加载视图。只需将视图路径传递给其他视图。

在你的控制器中使用:

$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);

老实说,我更喜欢这样做,有模板视图,然后加载与必要的数据从控制器,这意味着很少重复的代码和遵循 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,浪费而且最终不能维护。

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

创建一个新的 helper (在应用程序/helpers 中) ,其名称为(es)。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);
}
?>

在视图文件夹中创建一个名为 page _ layent.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');
?>