【问题标题】:CodeIgniter create a layout/template libraryCodeIgniter 创建布局/模板库
【发布时间】:2013-05-03 15:16:25
【问题描述】:

在开始之前,我必须说我最近开始学习 CodeIgniter,所以如果我再次重复这个主题,我很抱歉。

在程序 php 中我会做这样的事情

// the header.php
<!DOCTYPE html>
<html>
<head>
      <meta name="description" content="blah blah">
      <title>My Site</title>
      <link href="css/main.css" rel="stylesheet" media="screen">
<php? if($current_page == 'about.php'): ?>
      <link href="css/secondary.css" rel="stylesheet" media="screen"> // or some embed styles (<stlye> ... </style>)
   <?php endif; ?> 


      <script src="http://code.jquery.com/jquery.js"></script>
      <script src="js/main_script.js"></script>

      <php? if($current_page == 'contact.php'): ?>
      <script src="js/validation.js"></script>
      <?php endif; ?>
</head>
<body>
     // end of header.php

     include('template/header.php');

     <h1>Heading1</h1>    
     <p>Lorem Ipsum...</p>

     include('template/footer.php');

    //footer.php
    //maybe some js and here
</body>
</html>

所以我想在 CI 中做类似的事情。所有页面/视图都将具有相同的主要样式或脚本,但在某些情况下,某些特定页面(如contact.php)可能包含并且在这些页面中,某些特定样式或脚本(如验证.js)。

我发现了这个video,它展示了如何使用 CI 创建模板/布局库,但我不太确定如何应用此功能才能正常工作。

【问题讨论】:

    标签: php codeigniter templates layout


    【解决方案1】:

    我通过以下方式实现了同样的目标:

    将此代码放入您的./application/core/MY_Controller.php 文件中:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
        class MY_Controller extends CI_Controller
        {
            protected $layout = 'layout/main';
    
            public function __construct()
            {
                parent::__construct();
            }
    
            protected function render($file = NULL, &$viewData = array(), $layoutData = array())
            {
                if( !is_null($file) ) {
                    $data['content'] = $this->load->view($file, $viewData, TRUE);
                    $data['layout'] = $layoutData;
                    $this->load->view($this->layout, $data);
                } else {
                    $this->load->view($this->layout, $viewData);
                }
    
                $viewData = array();
            }
       }
    

    ./application/views 目录中创建一个布局文件夹,然后在其中创建包含整个 html 的文件。只需将&lt;?php echo $content; ?&gt; 放入您要放入动态内容的文件中。然后在您的控制器中使用$this-&gt;render(); 并传递您的文件路径和数据。如果您想为特定页面使用不同的布局,只需输入$this-&gt;layout = 'path_to_your_layout_file';,它将覆盖要使用的布局文件。

    【讨论】:

      【解决方案2】:

      不久前我也遇到过类似的问题。我的解决方案如下: 在您的控制器构造函数中创建 2 个数组,其中一个是 css 文件,另一个是 js 文件,并将所有视图共有的文件放入其中。 并在控制器的每个功能中添加逻辑特定文件。 对于你的例子,你会有这样的东西:

      <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
      
      class Home extends CI_Controller
      {
          public function __construct()
          {
              parent::__construct();
              $this->page_data = array();
              $this->page_data['css']=array('main.css','bootstrap.css');
              $this->page_data['js']=array('main.js','bootstrap.js');
          }
          public function about()
          {
             array_push($this->page_data['css'],'secondary.css');
             $this->load->view('main_layout',$this->page_data)
          }
          public function contact()
          {}
      
      
       }
      

      在您的视图文件中,您只需遍历 $css 和 $js 数组并一一包含它们。 您可以通过将页眉和页脚模板推入 page_data 数组来轻松扩展它以包含页眉和页脚模板。

      我最终转而使用 Backbone 在客户端进行所有模板化,并仅使用 Code Igniter 作为 REST API,但这种技术为我提供了相对简洁的代码来满足我的需要。

      【讨论】:

        【解决方案3】:

        将底层类放在libraries/Layout.php 中(你的应用不是系统)。在自动加载中添加库:

        $autoload['libraries'] = array('layout');
        

        在你的控制器里写$this-&gt;layout-&gt;render();

        该类将渲染布局views/layouts/default.php 和视图views/$controller.views/$method.php

        在默认布局中就放

        <?php $this->load->view($view,$data); ?>
        

        就是这样。

        代码是

        <?php
        if (!defined('BASEPATH')) exit('No direct script access allowed');
        
        class Layout
        {
            public $data = array();
            public $view = null;
            public $viewFolder = null;
            public $layoutsFodler = 'layouts';
            public $layout = 'default';
            var $obj;
        
            function __construct()
            {
                $this->obj =& get_instance();
            }
        
            function setLayout($layout)
            {
                $this->layout = $layout;
            }
            function setLayoutFolder($layoutFolder)
            {
                $this->layoutsFodler = $layoutFolder;
            }
        
            function render()
            {
        
                $controller = $this->obj->router->fetch_class();
                $method = $this->obj->router->fetch_method();
                $viewFolder = !($this->viewFolder) ? $controller.'.views' : $this->viewFolder . '.views';
                $view = !($this->view) ? $method : $this->view;
        
                $loadedData = array();
                $loadedData['view'] = $viewFolder.'/'.$view;
                $loadedData['data'] = $this->data;
        
                $layoutPath = '/'.$this->layoutsFodler.'/'.$this->layout;
                $this->obj->load->view($layoutPath, $loadedData);
            }
        }
        ?>
        

        【讨论】:

        • 我开发了一个与您的库非常相似的库。无论如何感谢您的回复!
        • 谢谢,这真是太好了!但是难道Controller中的$data变量不会这样传给视图吗?我将 $data 传递给 render 方法并更改了 $loadedData['data'] = $data;
        • 使用公共函数 index() { $this->load->view('layouts/default', ['view'=>'dashboard/index' , 'data' => [ ]]); }
        【解决方案4】:

        我正在做的布局是这样的。

        我将内容放到 data['content'] 变量中。

        这是我的控制器。

            class Article extends MY_Controller {
        
                function __construct() {
                    parent::__construct();
                    $this->load->model('article_model');
                }
        
                public function index() {
        
                    $data['allArticles']    =   $this->article_model->getAll(); 
        
                    $data['content']        =   $this->load->view('article', $data, true);
                    $this->load->view('layout', $data);
        
                }
        

        这是我的布局。我正在使用引导布局。

            <!DOCTYPE html>
            <html lang="en">
                <head>
                    <meta charset="utf-8">
                    <meta http-equiv="X-UA-Compatible" content="IE=edge">
                    <meta name="viewport" content="width=device-width, initial-scale=1">
                    <meta name="description" content="">
                    <meta name="author" content="">
                    <title>Starter Template for Bootstrap</title>
                    <base href="<?php echo base_url(); ?>" />
        
                    <!-- Bootstrap core CSS -->
                    <link href="assets/bootstrap3.0.1/css/bootstrap.min.css" rel="stylesheet">
        
                    <!-- Custom styles for this template -->
                    <!--    <link href="starter-template.css" rel="stylesheet">-->
        
                    <!-- Just for debugging purposes. Don't actually copy this line! -->
                    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
        
                    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
                    <!--[if lt IE 9]>
                      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
                      <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
                    <![endif]-->
                </head>
        
                <body>
        
                    <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
                        <div class="container">
                            <div class="navbar-header">
                                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                                    <span class="sr-only">Toggle navigation</span>
                                    <span class="icon-bar"></span>
                                    <span class="icon-bar"></span>
                                    <span class="icon-bar"></span>
                                </button>
                                <a class="navbar-brand" href="#"> Article Management System</a>
                            </div>
                            <div class="collapse navbar-collapse">
                                <ul class="nav navbar-nav">
                                    <li class="active"><a href="">Home</a></li>
                                    <li class="dropdown">
                                        <a class="dropdown-toggle" data-toggle="dropdown" href="#"> Admin <span class="caret"></span></a>
                                        <ul class="dropdown-menu">
                                            <li><a href="article/add">Add Article</a></li>
                                            <li><a href="article">All Article</a></li>
                                        </ul>
                                    </li>
                                </ul>
                            </div><!--/.nav-collapse -->
                        </div>
                    </div>
        
                    <div class="container" style="margin-top: 80px;">
        
                        <?php echo $content; ?>
        
                    </div><!-- /.container -->
        
        
                    <!-- Bootstrap core JavaScript
                    ================================================== -->
                    <!-- Placed at the end of the document so the pages load faster -->
                    <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
                    <script src="assets/bootstrap3.0.1/js/bootstrap.min.js"></script>
                </body>
            </html>        
        

        这是我的内容视图

            <div class="row">
        
                <div class="col-xs-12 col-sm-12 col-md-12">
        
                    <div class="page-header">
                        <h4>All Articles </h4>
                    </div>
        
                </div>
        
                <div class="col-xs-12 col-sm-12 col-md-12">
        
                    <table class="table table-striped table-bordered">
                        <thead>
                            <tr>
                                <th>Title</th>
                                <th>Description</th>
                                <th></th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($allArticles as $row) { ?>
                            <tr>
                                <td><?php echo $row->title; ?></td>
                                <td><?php echo substr($row->description,0,100); ?> ....</td>
                                <td></td>
                            </tr>
                            <?php } ?>
                        </tbody>
                    </table>
        
                </div>
            </div>
        

        【讨论】:

          【解决方案5】:

          我在旧版本的 CodeIgniter 中使用它,它也适用于版本 3。

          <?php  
          if (!defined('BASEPATH')) exit('No direct script access allowed');
          
          class Layout
          {
          
              var $obj;
              var $layout;
          
              function Layout($layout = "layout_main")
              {
                  $this->obj =& get_instance();
                  $this->layout = $layout;
              }
          
              function setLayout($layout)
              {
                $this->layout = $layout;
              }
          
              function view($view, $data=null, $return=false)
              {
                  $loadedData = array();
                  $loadedData['content_for_layout'] = $this->obj->load->view($view,$data,true);
          
                  if($return)
                  {
                      $output = $this->obj->load->view($this->layout, $loadedData, true);
                      return $output;
                  }
                  else
                  {
                      $this->obj->load->view($this->layout, $loadedData, false);
                  }
              }
          }
          ?>
          

          并在我使用的控制器中调用它:

          $this->layout->view('apps/apps', $data);
          

          【讨论】:

            【解决方案6】:

            创建 CodeIgniter 模板的 5 个简单步骤:

            步骤#1

            Template.php @ 库

            步骤 #2

            编写以下代码

            /* Start of file Template.php */
            <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
            class Template {
                    var $template_data = array();
                    function set($name, $value)
                    {
                        $this->template_data[$name] = $value;
                    }
                    function load($template = '', $view = '' , $view_data = array(), $return = FALSE)
                    {               
                        $this->CI =& get_instance();
                        $this->set('contents', $this->CI->load->view($view, $view_data, TRUE));         
                        return $this->CI->load->view($template, $this->template_data, $return);
                    }
            }
            /* End of file Template.php */
            /* Location: ./system/application/libraries/Template.php */
            

            步骤#3

            打开配置/autoload.php 在第 55 行替换

            $autoload['libraries'] = array('database', 'session','encrypt');
            with this code
            $autoload['libraries'] = array('database', 'session','encrypt', 'template');
            

            步骤#4

            在我的控制器调用模板上作为

            //start
            $this->template->load(TEMPLATE_NAME, VIEW_NAME , $this->data);
            //end
            

            步骤#5

            观看次数 创建一个文件为 custom_template.php 并在那里放置以下代码--

            //start
            <?php $this->load->view('elements/header'); ?>
            <div><?php echo $contents;?></div>
            <?php $this->load->view('elements/footer'); ?>
            //end
            

            注意在元素文件夹的视图中创建两个文件,分别为 header.phpfooter.php

            【讨论】:

            • 那么是不是意味着header.php上的标签和footer.php上的关闭标签?如果是,这是非常糟糕的模式。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-09-22
            • 1970-01-01
            • 1970-01-01
            • 2013-09-07
            • 1970-01-01
            • 2011-12-16
            • 1970-01-01
            相关资源
            最近更新 更多