【问题标题】:Best method of including views within views in CodeIgniter在 CodeIgniter 中的视图中包含视图的最佳方法
【发布时间】:2013-02-19 17:03:20
【问题描述】:

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

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

【问题讨论】:

标签: php codeigniter templates


【解决方案1】:

其他视图中的视图称为嵌套视图。 在 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);
?>

然后将&lt;?=$menu?&gt; 放在视图中您希望菜单出现的位置。

2。 “从内部”加载视图

先把这个放到控制器里:

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

然后把这个放到/application/views/home.php 视图中:

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

<p>Other home content...</p>

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

【讨论】:

  • 我认为没有必要提前加载视图并传递给另一个视图。看我的解决方案
  • @RahulChipad 你没有注意到评论:“TRUE”参数告诉它返回内容,而不是立即显示,这意味着即使提前加载它也不会影响
  • 警告: 当您以这种方式传递视图时(使用 TRUE 参数),您会将所有视图内容转换为 字符串。这在大多数情况下都有效,但是一旦你有大量数据,或者当你传递数组或 JSON 时,它就会中断。
  • 我不喜欢方法 1,因为在 home 视图中永远不会正确接收 $menu ...如果您要查看 home,您将不知道在哪里$menu 来自...
  • 第二种方式更受欢迎
【解决方案2】:

老实说,我更喜欢通过模板视图然后从控制器加载必要的数据来做到这一点,这意味着重复代码要少得多,并且比从视图加载视图更好地遵循 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 语句来决定要包含哪个标题,常规的或带有管理菜单的。

是的,我可以在每个主视图页面中包含页眉、侧边栏和页脚,但最终会导致大量重复代码。例如,如果我希望我的所有页面都有新的东西,或者其他一些小的 sn-p,会发生什么?使用模板我将 sn-p 添加到适当的模板中,它就完成了。走另一条路,我找到每个页面并在那里添加 sn-p 视图,在我看来这相当于在页面中添加 CSS,浪费且最终无法维护。

【讨论】:

  • 我喜欢您的技术,但我不太了解其他方法如何增加编码工作量。例如,如果我想在标题视图中添加语言栏,我只需编辑标题视图即可。我错过了什么吗?顺便说一句,我是一位老程序员,对 CodeIgniter 完全陌生。
  • 它们不会像增加重复代码那样增加编码工作量。看上面的代码。如果我没有创建模板,那么我将为控制器中的每个页面调用前 4 行。它更多的是关于模块化和易于包含/排除。在一个所有页面都具有相同元素的非常基本的网站上,这并不是什么大不了的事,甚至真的值得付出额外的努力。在页面差异很大的复杂网站上,它可以省去很多麻烦和重复。
  • 这与@sandip 回答的方法 2 不一样吗??
  • 我的回答为相同的代码提供了另一种观点,并展示了拆分为模板的好处。注入它的方法是一样的,整体的看法甚至不接近。 3岁的答案,如果两个人给出不同观点的相同代码真的很重要吗?
  • 如何将 $data 传递给标题?假设我想向 header 传递更多的东西,而不仅仅是 $title
【解决方案3】:

方法 1

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

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


方法 2

或者在控制器中,您可以加载多个视图,如下所示:

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

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


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

【讨论】:

  • 我希望传递数据,但方法一似乎是一个更好的主意。只需要弄清楚如何将数据传递给它。
  • 你可以在这种模式下传递数据: $this->load->view('include/include_view',$data);但问题是,在你的控制器中你必须将数据传递给你的主控制器,而在你的主控制器中你必须将数据传递给你的包含视图,这是一个很长的路要走,但如果你需要这个,你可以
  • 有没有办法传递全部数据?
【解决方案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);

【讨论】:

    【解决方案5】:

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

    您创建一个新的助手(在 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');   
       }
    
    }
    

    【讨论】:

      【解决方案6】:

      在控制器中

      控制器

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多