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

时间:2013-03-05 10:23:55

标签: php codeigniter templates

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

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

6 个答案:

答案 0 :(得分:102)

其他视图中的视图称为嵌套视图。 有两种方法可以在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>

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

答案 1 :(得分: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');

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

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

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

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

答案 2 :(得分:5)

方法1

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

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


方法2

或在控制器中,您可以加载多于这样的视图:

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

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


方法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);

答案 3 :(得分:4)

这是一种在视图中包含视图的简单方法。不需要提前加载视图。只需将视图路径传递给其他视图。

在你的控制器中使用:

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

答案 4 :(得分:0)

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

您使用名称创建一个新的帮助程序(在应用程序/帮助程序中)(例如,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');   
   }

}

答案 5 :(得分:-1)

  

在控制器中

控制器

<?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_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');
  ?>