Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter中的页眉和页脚_Php_Codeigniter - Fatal编程技术网

Php CodeIgniter中的页眉和页脚

Php CodeIgniter中的页眉和页脚,php,codeigniter,Php,Codeigniter,我真的不喜欢在每个控制器上都写: $this->load->view('templates/header'); $this->load->view('body'); $this->load->view('templates/footer'); $data['header'] = $this->load->view('templates/google-analytics', '', TRUE)

我真的不喜欢在每个控制器上都写:

    $this->load->view('templates/header');
    $this->load->view('body');
    $this->load->view('templates/footer');
$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);
是否可以这样做,页眉和页脚将自动包括,如果我们需要更改它,我们也可以这样做?你是怎么处理的?或者在你看来这不是问题?谢谢。

试试下面的内容

文件夹结构

-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);
   }
}
看法


一些头衔
对

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>
<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>
    <div id="mainWrap">
        <? $this->load->view('header'); ?>
        <? //FINALLY LOAD THE VIEW!!! ?>
        <? $this->load->view($v); ?>
        <? $this->load->view('footer'); ?>
    </div>
</body>
以及包含以下内容的
body.php
视图:

<!DOCTYPE html>
<html lang="en">
    <? $this->load->view('head'); ?>
    <? $this->load->view('body'); ?>
</html>
<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>
    <div id="mainWrap">
        <? $this->load->view('header'); ?>
        <? //FINALLY LOAD THE VIEW!!! ?>
        <? $this->load->view($v); ?>
        <? $this->load->view('footer'); ?>
    </div>
</body>
我是这样做的:

<?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;
        }
    }
}
然后,在控制器中,您只需执行以下操作:

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

以下是我如何处理我的问题。我在我的视图文件夹中创建了一个名为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>

我有一个问题,我希望一个控制器以一条消息结尾,比如“谢谢你的表单”和“找不到”等。 我在views->message->message\u 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'); ?>

您可以使用config.php文件,也可以使用CodeIgniter中的helpers功能

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

来源:

对@Landons MY_Loader的简单重写,包括正文的多个文件,即页面唯一侧栏

<?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['catalog'] = 'catalog load 1';
$data['sidebar'] = 'sidebar load 2';           
$load = array('catalog/catalog', 'catalog/sidebar');        
$this->load->template($load, $data);

或者更复杂,但让生活更简单的是在引导中使用更多的常量。 所以可以自由定义子类,并使用单个方法显示视图。 还可以将选定的常量传递给标头中的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");
    }
}
这个问题已经得到了正确的回答,但我想补充一下我的方法,它与其他人提到的没有什么不同

我使用不同的版面页面来调用不同的页眉/页脚,有人称之为版面,有人称之为模板等等

  • 编辑
    core/Loader.php
    并添加自己的函数来加载布局,我调用了函数,例如
    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
    
  • 像平常一样,从控制器调用自己的查看页面。但不是调用
    $this load->view
    使用
    $this->load->layout
    ,layout函数将调用
    default.php
    default.php
    将调用页眉和页脚

  • 1) 在view()函数下的
    core/Loader.php
    中,我复制了它并添加了我的

       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)创建布局文件夹并将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 
    

    使用CodeIgniter可以很容易地配置存储库,使其具有自定义页眉和页脚。我希望这可以解决您的问题。

    使用此帮助程序进行动态模板加载

    //  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_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):

    • 看看源代码有多漂亮和清晰
    • 不再在一个视图中打开HTML标记,在另一个视图中关闭HTML标记
    • 现在,每个视图都专用于一种且仅适用于一种内容
    • 看看视图是如何连接的:,或者我们应该说:concatated链接模式
    • 您可以添加可选部分(例如,正文末尾的第三个
      $javascript
      变量)
    • 我经常使用专用于我的应用程序的额外参数将CI_控制器扩展为重载
      $this->load->view
      ,以保持控制器干净
    • 如果您总是在多个页面上加载相同的视图(这是问题的最终答案),根据您的需要,有两个选项:
      • 在视图中加载视图
      • 扩展CI_控制器或CI_加载器

    我为这种体系结构感到骄傲…

    我已经达到了这个目标,我希望能帮助所有人在应用程序/核心中创建我的\u控制器 然后将此代码放入其中,并将change作为文件名

        <?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
    }
    
    注意:关于控制器前缀的名称,您必须确定config.php文件中的前缀
    我希望能帮助任何人

    你还在吗?我不明白为什么“$this->load->template('body');”会返回任何东西,因为$return被设置为FALSE。“if($return)”应该返回false,因此不返回$content,但在我测试它时确实返回了。我在这里遗漏了什么?忽略我刚才说的。手册中的答案是:“如果您将参数设置为true(布尔值),它将返回数据。默认行为为false,这会将其发送到浏览器。如果您希望返回数据,请记住将其分配给变量:”。“if($return)”只是一个备份。我在application/core中添加了一个文件LS_Loader.php,以及您给出的回复,但当我调用$this->load->template('my_template',$data')时,它会抛出一个错误
    调用未定义的方法CI_Loader::template()
    。还有其他步骤吗
    /**
    * /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;
            }
    }
    
    <?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>
    
    $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);
    
        <?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