CodeIgniter 中的页眉和页脚

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

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

是否可能这样做,页眉和页脚将自动包括在内,如果我们需要改变它,我们也可以这样做?你是怎么处理的?或者在你看来这不是个问题?谢谢。

140639 次浏览

试着跟上

文件夹结构

-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

有点像接近这里的轨道

是的。

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

我是这么做的:

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

这就是我的处理方式。我在视图文件夹中创建了一个名为 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);

您可以使用 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');

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

对@Landons MY _ Loader 进行简单的重写,以包含主体的多个文件,e.i. 页面的唯一侧栏..。

<?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);

或者更复杂,但使生活更容易的是在引导中使用更多的常量。 因此,可以自由地定义子类,并使用单个方法显示视图。 也可以将选择的常量传递到头部的 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");

将加载页眉、视图和页脚。

这个问题已经得到了恰当的回答,但是我想补充一下我的方法,它和其他人提到的没有什么不同。

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

  1. 编辑 core/Loader.php并添加自己的函数来加载布局,我调用函数 e.g.layout

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

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

1)core/Loader.php under 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) 创建布局文件夹并在 view/layout/default.php中将 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-Asset 可以很容易地配置存储库,以便使用 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;
}
}

通过在 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 标记在一个视图中打开而在另一个视图中关闭。
  • 现在,每个视图都专用于一个且只有一个内容。
  • 看看视图是如何连接的: 方法链接图案方法链接图案,或者我们应该说: 连体婴儿链接模式!
  • 您可以添加可选的部分(例如,在主体的末尾添加第三个 $javascript变量)
  • 我经常扩展 CI _ Controller 使用专用于应用程序的额外参数重载 $this->load->view,以保持控制器的整洁。
  • 如果你总是在几个页面上加载相同的视图(这就是问题的答案) ,根据你的需要有两种选择:
    • 加载视图中的视图
    • 扩展 CI _ Controller 或 CI _ Loader

我为这个建筑感到骄傲。

我已经达到了这一点,我希望能够帮助所有人在 application/core 中创建 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 文件中的前缀 我希望这对任何人都有帮助