簡體   English   中英

CodeIgniter 中的頁眉和頁腳

[英]Header and footer in CodeIgniter

我真的不喜歡在每個控制器中編寫:

    $this->load->view('templates/header');
    $this->load->view('body');
    $this->load->view('templates/footer');

是否可以這樣做,頁眉和頁腳將自動包含在內,如果我們需要更改它,我們也可以這樣做? 你怎么處理? 或者在您看來這不是問題? 謝謝。

這是我所做的:

<?php

/**
 * /application/core/MY_Loader.php
 *
 */
class MY_Loader extends CI_Loader {
    public function template($template_name, $vars = array(), $return = FALSE)
    {
        $content  = $this->view('templates/header', $vars, $return);
        $content .= $this->view($template_name, $vars, $return);
        $content .= $this->view('templates/footer', $vars, $return);

        if ($return)
        {
            return $content;
        }
    }
}

對於 CI 3.x:

class MY_Loader extends CI_Loader {
    public function template($template_name, $vars = array(), $return = FALSE)
    {
        if($return):
        $content  = $this->view('templates/header', $vars, $return);
        $content .= $this->view($template_name, $vars, $return);
        $content .= $this->view('templates/footer', $vars, $return);

        return $content;
    else:
        $this->view('templates/header', $vars);
        $this->view($template_name, $vars);
        $this->view('templates/footer', $vars);
    endif;
    }
}

然后,在您的控制器中,這就是您所要做的:

<?php
$this->load->template('body');

是的。

在您的views文件夾中創建一個名為template.php的文件。

template.php的內容:

$this->load->view('templates/header');
$this->load->view($v);
$this->load->view('templates/footer');

然后從您的控制器中,您可以執行以下操作:

$d['v'] = 'body';
$this->load->view('template', $d);

這實際上是我個人加載所有視圖的非常簡單的版本。 如果你把這個想法發揮到極致,你可以做出一些有趣的模塊化布局:

考慮是否創建一個名為init.php的視圖,其中包含單行:

$this->load->view('html');

現在用內容創建視圖html.php

<!DOCTYPE html>
<html lang="en">
    <? $this->load->view('head'); ?>
    <? $this->load->view('body'); ?>
</html>

現在創建一個包含內容的視圖head.php

<head>
<title><?= $title;?></title>
<base href="<?= site_url();?>">
<link rel="shortcut icon" href='favicon.ico'>
<script type='text/javascript'>//Put global scripts here...</script>
<!-- ETC ETC... DO A BUNCH OF OTHER <HEAD> STUFF... -->
</head>

以及包含內容的body.php視圖:

<body>
    <div id="mainWrap">
        <? $this->load->view('header'); ?>
        <? //FINALLY LOAD THE VIEW!!! ?>
        <? $this->load->view($v); ?>
        <? $this->load->view('footer'); ?>
    </div>
</body>

並根據需要創建header.phpfooter.php視圖。

現在,當你從控制器調用 init 時,所有繁重的工作都完成了,你的視圖將被包裹在<html><body>標簽中,你的頁眉和頁腳將被加載。

$d['v'] = 'fooview'
$this->load->view('init', $d);

嘗試以下

文件夾結構

-application
 --controller
   ---dashboards.php
 --views
   ---layouts
      ----application.php
   ---dashboards
      ----index.php

控制器

class Dashboards extends CI_Controller
{

   public function __construct()
   {
     parent::__construct();
     $data                = array();
     $data['js']          = 'dashboards.js'
     $data['css']         = 'dashbaord.css'
   }

   public function index()
   { 
     $data                = array();
     $data['yield']       = 'dashboards/index';

     $this->load->view('layouts/application', $data);
   }
}

看法

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>Some Title</title>
      <link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/app.css" />
      <link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/<?php echo $css; ?>" />
   </head>
   <body>
     <header></header>
     <section id="container" role="main">
     <?php $this->load->view($yield); ?>
     </section>
     <footer></footer>
     <script src="<php echo base_url(); ?>assets/js/app.js"></script>
     <script src="<php echo base_url(); ?>assets/js/<?php echo $js; ?>"></script>
  </body>
</html>

當您需要在頁眉或頁腳中加載不同的 js、css 或任何內容時,請使用__construct函數來$this->load->vars

有點像這里的方法

或者更復雜,但讓生活更輕松的是在引導中使用更多常量。 因此可以自由定義子類,並使用單個方法來顯示視圖。 還可以將選定的常量傳遞給標題中的 javascript。

<?php
/*
 * extends codeigniter main controller
 */

class CH_Controller extends CI_Controller {

    protected $viewdata;

public function __construct() {
    parent::__construct();
            //hard code / override and transfer only required constants (for security) server constants
            //such as domain name to client - this is for code porting and no passwords or database details
            //should be used - ajax is for this

    $this->viewdata = array(
                "constants_js" => array(
                    "TOP_DOMAIN"=>TOP_DOMAIN,
                    "C_UROOT" => C_UROOT,
                    "UROOT" => UROOT,
                    "DOMAIN"=> DOMAIN
                )
            );

}

public function show($viewloc) {
            $this->load->view('templates/header', $this->viewdata);
    $this->load->view($viewloc, $this->viewdata);
    $this->load->view('templates/footer', $this->viewdata);
}

//loads custom class objects if not already loaded
public function loadplugin($newclass) {
    if (!class_exists("PL_" . $newclass)) {
        require(CI_PLUGIN . "PL_" . $newclass . ".php");
    }
}

然后簡單地:

$this->show("<path>/views/viewname/whatever_V.php");

將加載頁眉、視圖和頁腳。

您可以使用 config.php 文件,也可以使用 CodeIgniter 中助手的強大功能。

$config['header_css'] = array('style.css','prettyPhoto.css','nivo-slider.css');
$config['header_js']  = array('core.js','core.js',
                              'jquery-1.4.1.min.js',
                              'jquery-slidedeck.pack.lite.js',
                              'jquery-prettyPhoto.js',
                              'jquery.nivo.slider.js');

來源: https : //jamshidhashimi.com/dynamically-add-javascript-and-css-files-in-codeigniter-header-page/

對@Landons MY_Loader 的簡單重寫,為正文包含多個文件,ei 頁面獨特的側邊欄...

<?php

class MY_Loader extends CI_Loader {
    public function template($template_name, $vars = array(), $return = FALSE)
    {
        $content  = $this->view('frontend/templates/header', $vars, $return);

        if(is_array($template_name)) { //return all values in contents

            foreach($template_name as $file_to_load) { 
                  $content .= $this->view('frontend/'.$file_to_load, $vars, $return);
            }
        }
        else {             
            $content .= $this->view('frontend/'.$template_name, $vars, $return);
        }

        $content .= $this->view('frontend/templates/footer', $vars, $return);

        if ($return)
        {
            return $content;
        }
    }
}

這兩種方式都有效...

包括一個文件到模板:

$data['moo'] = 'my data'];
$this->load->template('home', $data);

在模板中包含多個文件:

$data['catalog'] = 'catalog load 1';
$data['sidebar'] = 'sidebar load 2';           
$load = array('catalog/catalog', 'catalog/sidebar');        
$this->load->template($load, $data);

CodeIgniter-Assets很容易配置存儲庫以使用 CodeIgniter 自定義頁眉和頁腳我希望這能解決您的問題。

通過在 application/core 文件夾中添加名為“MY_Loader.php”的文件並添加以下內容來重新定義 CI_Loader::view 函數

/**
* /application/core/MY_Loader.php
*/

class MY_Loader extends CI_Loader 
{  
        public function view($view, $vars = array(), $return = FALSE, $include_template=TRUE)
        {
            $header='';
            $footer='';

            if($include_template)
            {
                    $header=parent::view('templates/header',$vars,$return);
            }

            $content=parent::view($view, $vars,$return);

            if($include_template)
            {
                    $footer=parent::view('templates/footer',$vars,$return);
            }

            if($return)
                    return "$header$content$footer";

            return $this;
        }
}

我嘗試了此頁面上提出的幾乎所有答案以及許多其他內容。 我最終保留在所有網站上的最佳選擇是以下架構:

單一視圖

我在瀏覽器中只顯示一個視圖。 這是我的主要觀點(/views/page.php):

<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <?= $header ?? '' ?>
    </head>
    <body>
        <div style="width:1200px">
                <?= $content ?? '' ?>
        </div> 
    </body>
</html>

控制器處理多個視圖

當然,我有幾個視圖,但它們被連接起來以構建$header$content變量。 這是我的控制器:

$data['header'] = $this->load->view('templates/google-analytics', '', TRUE)
                 .$this->load->view('templates/javascript', '', TRUE)
                 .$this->load->view('templates/css', '', TRUE);


$data['content'] = $this->load->view('templates/navbar', '', TRUE)
                  .$this->load->view('templates/alert', $myData, TRUE)
                  .$this->load->view('home/index', $myData, TRUE)
                  .$this->load->view('home/footer', '', TRUE)
                  .$this->load->view('templates/modal-login', '', TRUE);

$this->load->view('templates/page', $data);
  • 看看源代碼多么漂亮和清晰。
  • 您不再需要在一個視圖中打開 HTML 標記並在另一個視圖中關閉。
  • 現在,每個視圖都專用於一個且僅一個內容。
  • 看意見是如何連接在一起:方法鏈接模式,或者我們應該說:concatanated鏈格局!
  • 您可以添加可選部分(例如,正文末尾的第三個$javascript變量)
  • 我經常擴展 CI_Controller 以使用專用於我的應用程序的額外參數重載$this->load->view以保持我的控制器干凈。
  • 如果您總是在多個頁面上加載相同的視圖(這就是問題的最終答案),根據您的需要有兩個選項:
    • 在視圖中加載視圖
    • 擴展 CI_Controller 或 CI_Loader

我為這座建築感到非常自豪......

這是我如何處理我的。 我在我的視圖文件夾中創建了一個名為 template.php 的文件。 這個文件包含我所有的主要站點布局。 然后從這個模板文件我調用我的附加視圖。 下面是一個例子:

<!doctype html>
<html lang="en">
<head>
  <meta charset=utf-8">
  <title><?php echo $title; ?></title>
    <link href="<?php echo base_url() ;?>assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="<?php echo base_url() ;?>assets/css/main.css" rel="stylesheet" type="text/css" />
<noscript>
Javascript is not enabled! Please turn on Javascript to use this site.
</noscript>

<script type="text/javascript">
//<![CDATA[
base_url = '<?php echo base_url();?>';
//]]>
</script>

</head>
<body>

<div id="wrapper">
    <div id="container">
        <div id="top">
            <?php $this->load->view('top');?>
        </div>

        <div id="main">
            <?php $this->load->view($main);?>
        </div>

        <div id="footer"> 
            <?php $this->load->view('bottom');?>
        </div>
    </div><!-- end container -->
</div><!-- end wrapper -->

<script type="text/javascript" src="<?php echo base_url();?>assets/js/jquery-1.8.2.min.js" ></script>
<script type="text/javascript" src="<?php echo base_url();?>assets/js/bootstrap.min.js"></script>

</body>
</html>

在我的控制器中,我將視圖的名稱傳遞給 $data['main']。 所以我會做這樣的事情:

class Main extends CI_Controller {

    public function index()
    {
        $data['main'] = 'main_view';
          $data['title'] = 'Site Title';
          $this->load->vars($data);
          $this->load->view('template', $data);
    }
}

我遇到了這個問題,我希望控制器以諸如“感謝該表單”和通用“未找到等”之類的消息結束。 我在 views->message->message_v.php 下執行此操作

<?php
    $title = "Message";
    $this->load->view('templates/message_header', array("title" => $title));
?>
<h1>Message</h1>
<?php echo $msg_text; ?>
<h2>Thanks</h2>
<?php $this->load->view('templates/message_footer'); ?>

這允許我在單個文件中更改消息呈現站點范圍內的任何調用

$this->load->view("message/message_v", $data);

這個問題已經得到了正確的回答,但我想補充一下我的方法,它與其他人提到的沒有什么不同。

我使用不同的布局頁面來調用不同的頁眉/頁腳,有些稱之為布局,有些稱之為模板等。

  1. 編輯core/Loader.php並添加您自己的函數來加載您的布局,我調用了該函數,例如layout

  2. 創建您自己的模板頁面並為您調用header/footer ,我將其命名為default.php並放入一個新目錄中,例如view/layout/default.php

  3. 像往常一樣從控制器調用您自己的視圖頁面。 但不是調用$this-load->view使用$this->load->layout ,布局函數將調用default.phpdefault.php將調用您的頁眉和頁腳。

1)core/Loader.php下的 view() 函數中,我復制了它並添加了我的

   public function layout($view, $vars = array(), $return = FALSE)
   {
       $vars["display_page"] = $view;//will be called from the layout page
       $layout               = isset($vars["layout"]) ? $vars["layout"] : "default";
       return $this->_ci_load(array('_ci_view' => "layouts/$layout", '_ci_vars' =>  $this->_ci_object_to_array($vars), '_ci_return' => $return));
   }

2)創建 layout 文件夾並將 default.php 放入view/layout/default.php

   $this->load->view('parts/header');//or wherever your header is
   $this->load->view($display_page);
   $this->load->view('parts/footer');or wherever your footer is

3)從你的控制器,調用你的布局

 $this->load->layout('projects');// will use 'view/layout/default.php' layout which in return will call header and footer as well. 

要使用其他布局,請在$data數組中包含新的布局名稱

 $data["layout"] = "full_width";
 $this->load->layout('projects', $data);// will use full_width.php layout

當然,您必須在布局目錄中擁有新布局,如下所示:

view/layout/full_width.php 

使用此助手進行動態模板加載

//  get  Template 
    function get_template($template_name, $vars = array(), $return = FALSE) {
        $CI = & get_instance();

        $content = "";
        $last = $CI - > uri - > total_segments();

        if ($CI - > uri - > segment($last) != 'tab') {
            $content = $CI - > load - > view('Header', $vars, $return);
            $content. = $CI - > load - > view('Sidebar', $vars, $return);
        }

        $content. = $CI - > load - > view($template_name, $vars, $return);

        if ($CI - > uri - > segment($last) != 'tab') {
            $content. = $CI - > load - > view('Footer', $vars, $return);
        }

        if ($return) {
            return $content;
        }
    }

我已經達到了這個目的,我希望幫助所有人在應用程序/核心中創建 my_controller 然后將此代碼放入其中並更改為您的文件名

    <?php
defined('BASEPATH') OR exit('No direct script access allowed');
// this is page helper to load pages daunamically
class MY_Controller extends CI_Controller {

 function loadPage($user,$data,$page='home'){

  switch($user){

   case 'user':
   $this->load->view('Temp/head',$data);
   $this->load->view('Temp/us_sidebar',$data);
   $this->load->view('Users/'.$page,$data);
   $this->load->view('Temp/footer',$data);
   break;

   case 'admin':
   $this->load->view('Temp/head',$data);
   $this->load->view('Temp/ad_sidebar',$data);
   $this->load->view('Admin/'.$page,$data);
   $this->load->view('Temp/footer',$data);
   break;

   case 'visitor';
    $this->load->view('Temp/head',$data);
   $this->load->view($page);
   $this->load->view('Temp/footer',$data);
   break;

   default:
   echo 'wrong argument';
   die();
       }//end switch

   }//end function loadPage
}

在你的控制器中使用這個

class yourControllerName extends MY_Controller

注意:關於控制器前綴的名稱,您必須確定您在 config.php 文件中的前綴,希望對任何人有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM