Ich schreibe wirklich nicht gerne in jeden Controller:
$this->load->view('templates/header');
$this->load->view('body');
$this->load->view('templates/footer');
Ist es möglich, dass Kopf- und Fußzeile automatisch eingefügt werden und wenn wir sie ändern müssen, können wir das auch tun? Wie gehst du damit um? Oder ist es Ihrer Meinung nach kein Problem? Vielen Dank.
php
codeigniter
guten Abend
quelle
quelle
Antworten:
Folgendes mache ich:
<?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; } } }
Für 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; } }
In Ihrem Controller ist dies alles, was Sie tun müssen:
<?php $this->load->template('body');
quelle
Call to undefined method CI_Loader::template()
. Sind noch weitere Schritte erforderlich? Oder funktioniert das nicht mit 2.1.3?MY_
ist konfigurierbar, wird jedoch standardmäßigMY_
in CI verwendet und ist für alle benutzerdefinierten Überschreibungen gleich. Wenn Sie es ändern, werden wahrscheinlich andere Plugins beschädigtJa.
Erstellen Sie eine Datei mit dem Namen
template.php
in Ihremviews
Ordner.Der Inhalt von
template.php
:$this->load->view('templates/header'); $this->load->view($v); $this->load->view('templates/footer');
Dann können Sie von Ihrem Controller aus Folgendes tun:
$d['v'] = 'body'; $this->load->view('template', $d);
Dies ist eigentlich eine sehr vereinfachte Version davon, wie ich persönlich alle meine Ansichten lade. Wenn Sie diese Idee auf die Spitze treiben, können Sie einige interessante modulare Layouts erstellen:
Überlegen Sie, ob Sie eine Ansicht mit dem Namen erstellen
init.php
, die die einzelne Zeile enthält:$this->load->view('html');
Erstellen Sie nun die Ansicht
html.php
mit Inhalten:<!DOCTYPE html> <html lang="en"> <? $this->load->view('head'); ?> <? $this->load->view('body'); ?> </html>
Erstellen Sie nun eine Ansicht
head.php
mit Inhalten:<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>
Und eine
body.php
Ansicht mit Inhalten:<body> <div id="mainWrap"> <? $this->load->view('header'); ?> <? //FINALLY LOAD THE VIEW!!! ?> <? $this->load->view($v); ?> <? $this->load->view('footer'); ?> </div> </body>
Und erstellen
header.php
undfooter.php
Ansichten nach Bedarf.Wenn Sie jetzt den Init vom Controller aus aufrufen, ist das ganze schwere Heben erledigt und Ihre Ansichten werden darin verpackt
<html>
und<body>
Tags, Ihre Kopf- und Fußzeilen werden geladen.$d['v'] = 'fooview' $this->load->view('init', $d);
quelle
Versuchen Sie Folgendes
Ordnerstruktur
Regler
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); } }
Aussicht
<!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>
Wenn Sie verschiedene js, css oder was auch immer in der Kopf- oder Fußzeile laden müssen, verwenden Sie die
__construct
Funktion, um$this->load->vars
Eine Art Schienen wie Ansatz hier
quelle
Oder komplexer, aber macht das Leben einfacher, wenn mehr Konstanten im Boot verwendet werden. So können Unterklassen frei definiert werden und eine einzige Methode zum Anzeigen der Ansicht. Auch ausgewählte Konstanten können im Header an Javascript übergeben werden.
<?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"); } }
dann einfach:
$this->show("<path>/views/viewname/whatever_V.php");
lädt Kopf-, Ansichts- und Fußzeile.
quelle
Ein einfaches Umschreiben von @Landons MY_Loader, um mehrere Dateien für den Body, ei page eindeutige Seitenleisten ...
<?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; } } }
Das funktioniert in beide Richtungen ...
Einschließlich einer Datei zur Vorlage:
$data['moo'] = 'my data']; $this->load->template('home', $data);
Fügen Sie der Vorlage mehrere Dateien hinzu:
$data['catalog'] = 'catalog load 1'; $data['sidebar'] = 'sidebar load 2'; $load = array('catalog/catalog', 'catalog/sidebar'); $this->load->template($load, $data);
quelle
CodeIgniter-Assets ist einfach zu konfigurieren Repository mit benutzerdefinierten Kopf- und Fußzeilen mit CodeIgniter Ich hoffe, dies wird Ihr Problem lösen.
quelle
Definieren Sie die CI_Loader :: view-Funktion neu, indem Sie eine Datei mit dem Namen 'MY_Loader.php' in Ihren Anwendungs- / Kernordner einfügen und den folgenden Inhalt hinzufügen
/** * /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; } }
quelle
Sie können Ihre config.php-Datei verwenden und auch die Leistung der Helfer in CodeIgniter nutzen.
$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');
Quelle: https://jamshidhashimi.com/dynamically-add-javascript-and-css-files-in-codeigniter-header-page/
quelle
Ich habe fast alle auf dieser Seite vorgeschlagenen Antworten und viele andere Dinge ausprobiert. Die beste Option, die ich endlich auf allen meinen Websites behalten habe, ist die folgende Architektur:
Eine einzige Ansicht
Ich zeige nur eine Ansicht im Browser an. Hier ist meine Hauptansicht (/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>
Controller verarbeiten mehrere Ansichten
Natürlich hatte ich mehrere Ansichten, aber sie sind verkettet, um die
$header
und die$content
Variablen zu erstellen . Hier ist mein Controller:$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
Variable am Ende des Körpers).$this->load->view
mit zusätzlichen Parametern für meine Anwendung, um meine Controller sauber zu halten.Ich bin so stolz auf diese Architektur ...
quelle
So gehe ich mit meinen um. Ich erstelle eine Datei namens template.php in meinem Ansichtsordner. Diese Datei enthält mein gesamtes Layout meiner Hauptseite. Dann rufe ich aus dieser Vorlagendatei meine zusätzlichen Ansichten auf. Hier ist ein Beispiel:
<!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>
Von meinem Controller übergebe ich den Namen der Ansicht an $ data ['main']. Also werde ich dann so etwas machen:
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); } }
quelle
Ich hatte dieses Problem, bei dem ein Controller mit einer Meldung wie "Danke für dieses Formular" und "Allgemein nicht gefunden usw." enden soll. Ich mache das unter 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'); ?>
Dadurch kann ich die Rendering-Site für Nachrichten in dieser einzelnen Datei für alle Aufrufe ändern
$this->load->view("message/message_v", $data);
quelle
Diese Frage wurde richtig beantwortet, aber ich möchte meinen Ansatz hinzufügen, es ist nicht so anders als das, was die anderen erwähnt haben.
Ich benutze verschiedene Layoutseiten, um verschiedene Kopf- / Fußzeilen aufzurufen, manche nennen dieses Layout , manche nennen es Vorlage usw.
Bearbeiten
core/Loader.php
und fügen Sie Ihre eigene Funktion hinzu, um Ihr Layout zu laden. Ich habe die Funktion aufgerufen, zlayout
.Erstellen Sie Ihre eigene Vorlagenseite und lassen Sie sie
header/footer
für Sie aufrufen . Ich habe sie aufgerufendefault.php
und in ein neues Verzeichnis gestellt, zview/layout/default.php
Rufen Sie wie gewohnt Ihre eigene Ansichtsseite von Ihrem Controller aus auf. Anstatt die
$this-load->view
Verwendung aufzurufen$this->load->layout
, ruft die Layoutfunktion die aufdefault.php
unddefault.php
ruft Ihre Kopf- und Fußzeile auf.1) In der Funktion
core/Loader.php
under view () habe ich sie dupliziert und meine hinzugefügtpublic 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) Erstellen Sie einen Layoutordner und legen Sie die Datei default.php darin ab
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) Rufen Sie von Ihrem Controller aus Ihr Layout auf
$this->load->layout('projects');// will use 'view/layout/default.php' layout which in return will call header and footer as well.
Um ein anderes Layout zu verwenden, fügen Sie den neuen Layoutnamen in Ihr
$data
Array ein$data["layout"] = "full_width"; $this->load->layout('projects', $data);// will use full_width.php layout
und natürlich müssen Sie Ihr neues Layout wie folgt im Layoutverzeichnis haben:
quelle
Verwenden dieses Hilfsprogramms zum dynamischen Laden von Vorlagen
// 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; } }
quelle
Ich hatte danach gegriffen und hoffe, dass ich allen helfen kann, my_controller in application / core zu erstellen. Dann füge ich diesen Code mit der Änderung des Dateinamens ein
<?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 }
Verwenden Sie dies in Ihrem Controller
class yourControllerName extends MY_Controller
Hinweis: Über den Namen des Controller-Präfixes müssen Sie sich über Ihr Präfix in der Datei config.php sicher sein. Ich hoffe, dass Sie jemandem helfen können
quelle