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

Dav*_*vid 63 php templates codeigniter

我正在开始一个大型的codeigniter项目,并希望尝试为内容片段创建一些可重复使用的"迷你"视图,例如可以在不同页面/控制器上显示的数据循环.

从主控制器的视图中调用视图会更好吗?如果是这样,怎么样?或者我应该从控制器调用"迷你视图",从而将视图的代码传递给主视图?

san*_*dip 112

其他视图中的视图称为嵌套视图.有两种方法可以在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);
?>
Run Code Online (Sandbox Code Playgroud)

然后<?=$menu?>在您希望菜单显示的位置放入您的视图.

2.从视图中"加载"视图

首先把它放在控制器中:

<?php
  $this->load->view('home');
?>
Run Code Online (Sandbox Code Playgroud)

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

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

<p>Other home content...</p>
Run Code Online (Sandbox Code Playgroud)

关于最好的方法,我更喜欢第一种方法而不是第二种方法,因为通过使用第一种方法我不需要混淆代码,它不像包含 php.虽然间接两者都相同,但第一种方法比第二种方法更清晰,更清洁!

  • **警告:**当您以这种方式传递视图时(使用`TRUE`参数),您将所有视图内容转换为**字符串**.这大部分时间都可以工作,但是一旦你有大量数据,或者当你传递数组或JSON时,这将会破坏. (3认同)
  • 我不喜欢方法1,因为在“ home”视图中永远不会正确接收“ $ menu” ...如果您要查看“ home”,则不知道“ $ menu”来自何处。 .. (2认同)
  • 第二种方法更可取 (2认同)

Ric*_*der 17

老实说,我更喜欢通过使用模板视图然后使用控制器中的必要数据加载它来实现这一点,这意味着重复的代码更少,并且比从视图加载视图更好地遵循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');
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中,我将模板所需的数据传递给:

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

这样做有很多好处.首先,我可以有多个模板,例如我有两个主要模板,一个用于没有侧边栏的完整页面视图,另一个用于带侧边栏的页面,我还调用if语句来决定要包含哪个头,常规的一个或带有管理菜单的一个.

是的我可以在每个主视图页面中包含标题,侧边栏和页脚,但最终会有大量重复的代码.如果我希望我的所有页面都有新的东西,还有其他一些小片段,会发生什么?使用模板我将片段添加到相应的模板,它已完成.走另一条路线,我找到每个页面并在那里添加片段视图,这相当于我认为页面中有CSS,浪费而且最终无法维护.


Ale*_*eri 6

方法1

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

$this->load->view('include/include_view');
Run Code Online (Sandbox Code Playgroud)


方法2

或者在控制器中,你可以加载超过这样的视图:

$this->load->view('header_view');
$this->load->view('list_view');
$this->load->view('footer_view');
Run Code Online (Sandbox Code Playgroud)

没有一种方法比另一种方法更好,这取决于你是否必须传递一些数据(在这种情况下使用方法2)或者如果你想在主视图的特定部分中包含一个视图(在这种情况下最好使用method1) )


方法3

主视图将数据传递到包含视图

进入你的控制器:

$data['title'] = "Title";
$this->load->view('main_view',$data);
Run Code Online (Sandbox Code Playgroud)

在你看来

$data2['title'] = $title;
$this->load->view('include/include_view',$data2);
Run Code Online (Sandbox Code Playgroud)

如果要将整个数据传递到include视图,可以这样做:在控制器中:

$data['nestedView']['title'] = 'title';
Run Code Online (Sandbox Code Playgroud)

在你看来

$this->load->view('includes/included_view', $nestedView);
Run Code Online (Sandbox Code Playgroud)