【问题标题】:Code Igniter - Best Practice for views to not violate DRYCodeigniter - 视图不违反 DRY 的最佳实践
【发布时间】:2013-02-12 17:11:03
【问题描述】:

试图确定在 codeigniter 中处理视图的最佳方式。现在任何我认为的东西似乎都太乱了。

目前我有 3 个相关视图:

1) 标题 2) 内容 3) 页脚

每个控制器都有这样的东西。有的控制器甚至多次出现这种情况(同一个控制器中的不同功能):

$this->load->view('head', $data);
$this->load->view('volunteers/add_profile.php',$content_data);
$this->load->view('foot'); 

在每一页上都加载页眉和页脚似乎很愚蠢。但是,每个页面的标题中的数据都会略有不同(元标记、样式表、加载的脚本等)。

我有更清洁的方法吗?

谢谢!

【问题讨论】:

  • 看看我的回答(user2727841)它会给你一个想法!!!
  • 查看@user2727841的答案...

标签: php codeigniter codeigniter-2 dry


【解决方案1】:

我喜欢使用renderPage('content_view', $data) 之类的方法创建父控制器。该方法可以包括页眉、菜单、页脚……这样,所有视图加载内容都保存在控制器中,我不必为每个操作或视图的页眉、菜单或页脚而烦恼。它也很灵活,因为您的子控制器可以重新定义 renderPage() 方法以适应他们的目的。

如果您需要加载多个内容视图,您可以创建一个renderPage() 方法,该方法接受字符串数组而不是字符串。

【讨论】:

    【解决方案2】:

    是的 - 有一个模板视图。在您的控制器中:

    $data['header'] = xxx;
    $data['content'] = xxx;
    $this->load->view('my_template', $data);
    

    然后在你的 my_template.php 视图文件中:

    $this->load->view('head', $header);
    $this->load->view('volunteers/add_profile.php',$content);
    $this->load->view('foot'); 
    

    【讨论】:

    • $header 数据如何从控制器获取到 my_template.php 视图文件?
    • 你不能 $this->加载内部视图文件!
    • @MomenMElZalabany 是的,你可以。我一直这样做
    【解决方案3】:

    无论@TheShiftExchange 建议什么,或者,如果您的应用程序允许,您可以从每个内容视图(这是当时唯一从控制器调用的视图)调用页眉和页脚视图。

    【讨论】:

      【解决方案4】:

      我创建了自己的控制器,在其中创建MY_Controller extends CI_Controller 类,然后在MY_Controller 中使用访问修饰符$data 和$loadviewArray。

      public $data = array(); 
      public $loadviewArray = array();
      

      之后我在MY_Controller中创建函数

      public function loadview() {
         foreach ($this->loadviewArray as $key => $val) {
            $this->load->view($val, $this->data);
         }
      }
      

      然后我在Admin 控制器创建函数index 中创建控制器Admin 和extends MY_Controller 就像这样Admin extends MY_Controller。

      public function index() {
         $this->data["page_title"] = "Login";
         $this->data["records"] = $data; // You can pass data
         $this->loadviewArray = array("admin/header", "admin/login", "admin/footer");
         $this->loadview();
      }
      

      在$data 访问修饰符数组中,我在视图中传递数据,在$loadviewArray 中加载视图,然后调用一个函数来加载视图,您可以这样做,这对我现在也很有帮助。并分别创建页眉和页脚视图...

      【讨论】:

      • 这也可以,如果你想在里面加载另一个视图,比如管理员/登录,你可以使用 $data['extra']=$this->load->view('view', $数据,真); !或某事;;
      【解决方案5】:

      请查看https://github.com/alzalabany/codeigniter-base-controller/tree/master

      因此,您始终可以使用模板库。但我出于某种原因不喜欢它们!

      codeigniter 允许你扩展它的核心;如果你去上面提到的链接你可以看到一个小例子

      在此示例中,每个将扩展 MY_controller 的控制器都将从这些默认值开始

      protected        $body='base/body',
                              $title='Codeigniter Z master',//txt
                              $js=array(),//filename
                              $inline_js='',//script
                              $css=array(),
                              $inline_css='',//style
                              $breadcrumb=FALSE,//<li><a>
                              $content=array(),//html
                              $noEcho = FALSE;
      

      所以如果你选择在 MY_controller 中更改它们,其效果将是默认的,否则使用 $this->title = 'Codeigniter - Welcome page';例如在你的控制器构造函数中;

      加载辅助是一项非常简单的工作,只需调用$this-&gt;_assets() 和资产位置(将 MY_controller.php 默认位置编辑到您的资产文件夹);如果它是一个 inline_js/css 就调用

      $this->_assets('alert("hi");','js');
      

      如果您想将视图加载到页面部分,请使用 $this-&gt;outv(view_path,view_data,section_name);

      如果您只想将 html 加载到变量中,您可以使用

      $this->out('页脚','页脚');

      最后只需调用 ->_flush();

      我使用的其他一些选项,例如

      $noEcho ;如果设置,它将清除所有缓冲区以在将您的视图内容发送到浏览器之前删除任何回声;

      您还可以在 MY_controller 中设置注销或登录等功能,您的任何控制器都可以访问它http://localhost/ci/welcome/logout

      任何方式:) 我希望能回答你的问题!

      【讨论】:

      • 反对投票的任何理由?
      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多