在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文件夹中创build一个名为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); 

这实际上是我个人装载所有视图的简单版本。 如果你把这个想法推向极致,你可以做一些有趣的模块化布局:

考虑如果你创build一个名为init.php的视图,它包含单行:

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

现在用内容创build视图html.php

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

现在创build一个视图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> 

并根据需要创buildheader.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"); 

将加载标题,视图和页脚。

一个简单的重写@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); 

通过在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; } } 

这是我如何处理我的。 我在我的视图文件夹中创build一个名为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); } } 

我有这个问题,我想要一个控制器结束与一个消息,如“感谢这种forms”和通用“未find等”。 我在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并添加你自己的函数来加载你的布局,我称之为layoutfunction。

  2. 创build自己的模板页面,并为您调用header/footer ,我把它叫做default.php并放在一个新的目录,例如view/layout/default.php

  3. 通常情况下,从您的控制器调用您自己的视图页面。 但不是调用$this-load->view使用$this->load->layout ,layout函数将调用default.phpdefault.php将调用页眉和页脚。

1)core/Loader.php下view()函数我重复它,并join我的

  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)创build布局文件夹,并把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-Assets很容易configuration存储库CodeIgniter自定义页眉和页脚我希望这将解决您的问题。

使用这个助手进行dynamic模板加载

 // 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; } } 

你可以使用你的config.php文件,也可以在CodeIgniter中使用helper的强大function。

 $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/

你不能在你的意见中使用包含吗? 如:

 <?php include('templates/header.php'); ?>