72 votes

En-tête et pied de page dans CodeIgniter

Je n'aime vraiment pas écrire dans tous les contrôleurs:

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

Est-il possible de faire cela, cet en-tête et ce pied de page seraient automatiquement inclus et si nous devions le changer, nous pourrions également le faire? Comment gérez-vous cela? Ou ce n'est pas un problème à votre avis? Merci.

109voto

landons Points 6672

Voici ce que je fais:

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

Ensuite, dans votre contrôleur, c’est tout ce que vous devez faire:

 <?php
$this->load->template('body');
 

47voto

Jordan Arseno Points 3979

Oui.

Créez un fichier appelé template.php votre views le dossier.

Le contenu de template.php:

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

Puis, à partir de votre contrôleur, vous pouvez faire quelque chose comme:

$d['v'] = 'body';
$this->load->view('template', $d);

C'est effectivement une version simpliste de la façon dont j'ai personnellement en charge la totalité de mes points de vue. Si vous prenez cette idée à l'extrême, vous pouvez faire d'intéressantes mises en page modulaire:

Demandez-vous si vous créez une vue appelés initiator.php qui contient la ligne:

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

Maintenant créer la vue html.php le contenu de:

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

Maintenant créez un affichage en head.php le contenu de:

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

Et un body.php afficher le contenu de:

<body>
    <div id="mainWrap">
        <? $this->load->view('header'); ?>
        <? //FINALLY LOAD THE VIEW!!! ?>
        <? $this->load->view($v); ?>
        <? $this->load->view('footer'); ?>
    </div>
</body>

Et de créer header.php et footer.php vues appropriées.

Maintenant, lorsque vous appelez l'initiateur du contrôleur, le gros du travail est fait et votre point de vue sera appliqué à l'intérieur d' <html> et <body> tags, vos en-têtes et pieds de page sera chargée.

$d['v'] = 'fooview'
$this->load->view('initiator', $d);

Profitez et n'oubliez pas les enfants, Garder au SEC.

8voto

Andre Dublin Points 578

Essaye ça

Structure de dossier

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

Manette

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

Vue

 <!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>
 

Lorsque vous devez charger différents fichiers js, css ou autres dans l'en-tête ou le pied de page, utilisez la fonction __construct pour $ this-> load-> vars

Une sorte de rail comme approche ici

2voto

Tim Higham Points 38

Ou plus complexe, mais rend la vie facile est d'utiliser plus de constantes dans le démarrage. Ainsi, les sous-classes peuvent être définies librement et une seule méthode pour afficher la vue. Les constantes sélectionnées peuvent également être transmises à JavaScript dans l'en-tête.

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

alors simplement:

 $this->show("<path>/views/viewname/whatever_V.php");
 

chargera l'en-tête, la vue et le pied de page.

1voto

Line in Linus Points 20

Une simple réécriture de @Landons MY_Loader, pour inclure plusieurs fichiers pour le corps, des barres latérales uniques de la page 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;
        }
    }
}
 

Cela fonctionne dans les deux sens

Y compris un fichier au modèle:

 $data['moo'] = 'my data'];
$this->load->template('home', $data);
 

Inclure plusieurs fichiers dans le modèle:

 $data['catalog'] = 'catalog load 1';
$data['sidebar'] = 'sidebar load 2';           
$load = array('catalog/catalog', 'catalog/sidebar');        
$this->load->template($load, $data);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X