Kopf- und Fußzeile in CodeIgniter


71

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.


2
Auf dieser Wiki-Seite zu Code Igniter wird erläutert, wie Sie dies tun, indem Sie den Core-Controller erweitern.
Andy

Antworten:


106

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

1
Bist du noch da Ich verstehe nicht, warum "$ this-> load-> template ('body');" gibt alles zurück, da $ return auf FALSE gesetzt ist. "if ($ return)" sollte false zurückgeben und daher nicht $ content zurückgeben, und doch, wenn ich es getestet habe. Was fehlt mir hier?
Zeitplan

3
Ignoriere, was ich gerade gesagt habe. Die Antwort im Handbuch: "Wenn Sie den Parameter auf true (boolean) setzen, werden Daten zurückgegeben. Das Standardverhalten ist false, wodurch diese an Ihren Browser gesendet werden. Denken Sie daran, sie einer Variablen zuzuweisen, wenn die Daten zurückgegeben werden sollen:" . Das "if ($ return)" ist nur eine Sicherung.
Zeitplan

2
Ich habe der Datei / dem Kern eine Datei LS_Loader.php mit der von Ihnen gegebenen Antwort hinzugefügt, aber wenn ich $ this-> load-> template ('my_template', $ data) aufrufe, wird ein Fehler ausgegeben Call to undefined method CI_Loader::template(). Sind noch weitere Schritte erforderlich? Oder funktioniert das nicht mit 2.1.3?
Mehulved

1
IN ORDNUNG. Es muss nur MY_Loader.php sein. Das Präfix ist festgelegt.
Mehulved

2
@mehulved the MY_ist konfigurierbar, wird jedoch standardmäßig MY_in CI verwendet und ist für alle benutzerdefinierten Überschreibungen gleich. Wenn Sie es ändern, werden wahrscheinlich andere Plugins beschädigt
Basic

45

Ja.

Erstellen Sie eine Datei mit dem Namen template.phpin Ihrem viewsOrdner.

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.phpmit Inhalten:

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

Erstellen Sie nun eine Ansicht head.phpmit 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.phpAnsicht 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.phpund footer.phpAnsichten 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);

@ QadirHussain mein Vergnügen, gerne zu helfen.
Jordan Arseno

1
Diese Lösung ist sehr praktisch.
Ahsan

8

Versuchen Sie Folgendes

Ordnerstruktur

-application
 --controller
   ---dashboards.php
 --views
   ---layouts
      ----application.php
   ---dashboards
      ----index.php

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 __constructFunktion, um$this->load->vars

Eine Art Schienen wie Ansatz hier


+1 rechts ist nicht erforderlich, um Klassen zu erweitern, sobald Sie Ansichtsteile aus Ansichtsunterordnern laden können!
Es ist der

2

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.


1

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

1

CodeIgniter-Assets ist einfach zu konfigurieren Repository mit benutzerdefinierten Kopf- und Fußzeilen mit CodeIgniter Ich hoffe, dies wird Ihr Problem lösen.


1

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


1

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 $headerund die $contentVariablen 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);
  • Schauen Sie, wie schön und klar der Quellcode ist.
  • Sie haben kein HTML-Markup mehr in einer Ansicht geöffnet und in einer anderen geschlossen.
  • Jede Ansicht ist jetzt nur einem Element gewidmet.
  • Schauen Sie, wie Ansichten verkettet sind: Methodenverkettungsmuster , oder sollten wir sagen: verkettetes Verkettungsmuster!
  • Sie können optionale Teile hinzufügen (z. B. eine dritte $javascriptVariable am Ende des Körpers).
  • Ich erweitere CI_Controller häufig $this->load->viewmit zusätzlichen Parametern für meine Anwendung, um meine Controller sauber zu halten.
  • Wenn Sie immer dieselben Ansichten auf mehreren Seiten laden (dies ist schließlich die Antwort auf die Frage), stehen Ihnen je nach Bedarf zwei Optionen zur Verfügung:
    • Ansichten in Ansichten laden
    • Erweitern Sie CI_Controller oder CI_Loader

Ich bin so stolz auf diese Architektur ...


0

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

0

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

0

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.

  1. Bearbeiten core/Loader.phpund fügen Sie Ihre eigene Funktion hinzu, um Ihr Layout zu laden. Ich habe die Funktion aufgerufen, z layout.

  2. Erstellen Sie Ihre eigene Vorlagenseite und lassen Sie sie header/footerfür Sie aufrufen . Ich habe sie aufgerufen default.phpund in ein neues Verzeichnis gestellt, zview/layout/default.php

  3. Rufen Sie wie gewohnt Ihre eigene Ansichtsseite von Ihrem Controller aus auf. Anstatt die $this-load->viewVerwendung aufzurufen $this->load->layout, ruft die Layoutfunktion die auf default.phpund default.phpruft Ihre Kopf- und Fußzeile auf.

1) In der Funktion core/Loader.phpunder view () habe ich sie dupliziert und meine hinzugefügt

   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) 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 $dataArray 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:

view/layout/full_width.php 

0

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

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.