繁体   English   中英

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

[英]Best method of including views within views in CodeIgniter

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

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

其他视图中的视图称为嵌套视图 在 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 概念。 特别是对于页眉、页脚和菜单等内容。

所以我的模板视图看起来像这样:

模板.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,既浪费又无法最终维护。

方法一

我使用这个方法到我的视图中,在我想要的地方插入包含视图

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


方法二

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

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

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


方法三

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

进入你的控制器:

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

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

在你的控制器中使用这个:

$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 中),名称为(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);
        }
?>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM