web-dev-qa-db-fra.com

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.

68
good_evening

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

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

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

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

Oui.

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

Le contenu de template.php:

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

Ensuite, depuis votre contrôleur, vous pouvez faire quelque chose comme:

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

C’est en fait une version très simpliste de la façon dont je charge personnellement tous mes points de vue. Si vous prenez cette idée à l'extrême, vous pouvez créer des schémas modulaires intéressants:

Considérez si vous créez une vue appelée init.php Qui contient la seule ligne:

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

Maintenant, créez la vue html.php Avec le contenu:

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

Créez maintenant une vue head.php Avec le contenu suivant:

<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 une vue body.php Avec le contenu:

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

Et créez les vues header.php Et footer.php Selon vos besoins.

Désormais, lorsque vous appelez init depuis le contrôleur, tout le travail est fait et vos vues sont intégrées aux balises <html> Et <body>, Vos en-têtes et vos pieds de page seront chargés.

$d['v'] = 'fooview'
$this->load->view('init', $d);
42
Jordan Arseno

Essayez de suivre

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 commande __construct fonction à $this->load->vars

Type de Rails comme approche ici

7
Andre Dublin

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.

2
Datadimension

CodeIgniter-Assets est facile à configurer le référentiel pour avoir un en-tête et un pied de page personnalisés avec CodeIgniter. J'espère que cela résoudra votre problème.

1
shaz3e

Redéfinissez la fonction CI_Loader :: view en ajoutant un fichier nommé 'MY_Loader.php' dans votre dossier application/core et en ajoutant le contenu suivant.

/**
* /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
siraj k

Une simple réécriture de @Landons MY_Loader, pour inclure plusieurs fichiers pour le corps, par exemple. page unique sidebars ...

<?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);
1
Line in Linus

Vous pouvez utiliser votre fichier config.php, mais aussi utiliser le pouvoir des assistants dans 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');

Source: https://jamshidhashimi.com/dynamically-add-javascript-and-css-files-in-codeigniter-header-page/

1
Jamshid Hashimi

Voici comment je gère le mien. Je crée un fichier nommé template.php dans mon dossier de vues. Ce fichier contient toute la mise en page de mon site principal. Ensuite, à partir de ce fichier modèle, j'appelle mes vues supplémentaires. Voici un exemple:

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

De mon contrôleur, je vais passer le nom de la vue à $ data ['main']. Je vais donc faire quelque chose comme ça alors:

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

Utilisation de cet assistant pour le chargement dynamique de modèles

//  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
kamran webmaster

Cette question a reçu une réponse correcte, mais j'aimerais ajouter mon approche, ce n'est pas si différent de ce que les autres ont mentionné.

J'utilise différentes pages de mise en page pour appeler différents en-têtes/pieds de page, certains appellent cela layout, d'autres l'appellent modèle etc.

  1. Modifier core/Loader.php et ajoutez votre propre fonction pour charger votre mise en page, j’ai appelé la fonction, par exemple .layout.

  2. Créez votre propre modèle de page et appelez-le header/footer pour vous, je l'ai appelé default.php et mis dans un nouveau répertoire, par exemple view/layout/default.php

  3. Appelez votre propre page de vue depuis votre contrôleur comme vous le feriez normalement. Mais au lieu d'appeler $this-load->view utilisation $this->load->layout, la fonction de mise en page appelle le default.php et default.php appellera votre en-tête et votre pied de page.

1) En core/Loader.php sous la fonction view () je l'ai dupliqué et ajouté le mien

   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) Créez un dossier de disposition et mettez-y default.php dans 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

) Depuis votre contrôleur, appelez votre layout

 $this->load->layout('projects');// will use 'view/layout/default.php' layout which in return will call header and footer as well. 

Pour utiliser une autre mise en page, incluez le nouveau nom de la mise en page dans votre $data tableau

 $data["layout"] = "full_width";
 $this->load->layout('projects', $data);// will use full_width.php layout

et bien sûr vous devez avoir votre nouvelle mise en page dans le répertoire de mise en page comme dans:

view/layout/full_width.php 
0
Mohammed Joraid

J'ai eu ce problème où je veux qu'un contrôleur se termine par un message tel que "Merci pour cette forme" et générique "pas trouvé, etc.". Je le fais sous 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'); ?>

ce qui me permet de changer le site de rendu de message dans ce fichier unique pour tout ce qui appelle

$this->load->view("message/message_v", $data);
0
Datadimension