[英]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.php
和footer.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);
$javascript
變量)$this->load->view
以保持我的控制器干凈。我為這座建築感到非常自豪......
這是我如何處理我的。 我在我的視圖文件夾中創建了一個名為 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);
這個問題已經得到了正確的回答,但我想補充一下我的方法,它與其他人提到的沒有什么不同。
我使用不同的布局頁面來調用不同的頁眉/頁腳,有些稱之為布局,有些稱之為模板等。
編輯core/Loader.php
並添加您自己的函數來加載您的布局,我調用了該函數,例如layout
。
創建您自己的模板頁面並為您調用header/footer
,我將其命名為default.php
並放入一個新目錄中,例如view/layout/default.php
像往常一樣從控制器調用您自己的視圖頁面。 但不是調用$this-load->view
使用$this->load->layout
,布局函數將調用default.php
, default.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.