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.
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');
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);
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
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.
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.
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;
}
}
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);
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/
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);
}
}
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;
}
}
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.
Modifier core/Loader.php
et ajoutez votre propre fonction pour charger votre mise en page, j’ai appelé la fonction, par exemple .layout
.
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
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
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);