Верхний и нижний колонтитулы в CodeIgniter

Мне действительно не нравится писать на каждом контроллере:

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

Возможно ли, что верхний и нижний колонтитулы будут включены автоматически, и если нам нужно будет изменить его, мы также можем это сделать? Как ты с этим справляешься? Или это не проблема, на ваш взгляд? Благодарю.

Вот что я делаю:

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

Для 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; } } 

Затем, в вашем контроллере, это все, что вам нужно сделать:

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

Да.

Создайте файл с именем template.php в папке views .

Содержимое template.php :

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

Затем с вашего контроллера вы можете сделать что-то вроде:

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

На самом деле это очень упрощенная версия того, как я лично загружаю все свои взгляды. Если вы примете эту идею до крайности, вы можете сделать несколько интересных модульных макетов:

Подумайте, создаете ли вы представление init.php , содержащее одну строку:

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

Теперь создайте представление html.php с содержимым:

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

Теперь создайте представление head.php с содержимым:

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

И просмотр body.php с содержимым:

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

При необходимости создайте представления header.php и footer.php .

Теперь, когда вы вызываете init из контроллера, выполняется весь тяжелый подъем, и ваши представления будут обернуты внутри тегов <html> и <body> , ваши верхние и нижние колонтитулы будут загружены.

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

Наслаждайтесь и помните детей, держите его сухим.

Попробуй это

Структура папок

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

контроллер

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

Посмотреть

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

Когда вам нужно загрузить разные js, css или что-то в верхнем или нижнем колонтитуле, используйте функцию __construct для $ this-> load-> vars

Вид рельсов, как подход здесь

Или сложнее, но облегчает жизнь, чтобы использовать больше констант в ботинке. Таким образом, подклассы могут быть определены свободно, а один метод – показывать представление. Также выбранные константы могут быть переданы в javascript в заголовке.

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

то просто:

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

будет загружать заголовок, просмотр и нижний колонтитул.

Простое переименование @Landons MY_Loader, чтобы включить несколько файлов для тела, уникальные боковые панели ei page …

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

Это работает в обоих направлениях …

Включая один файл в шаблон:

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

Включить несколько файлов в шаблон:

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

Переопределите функцию CI_Loader :: view, добавив в папку приложения / core файл с именем «MY_Loader.php» и добавив следующий контент

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

Вот как я справляюсь с моим. Я создаю файл под названием template.php в моей папке views. Этот файл содержит весь мой макет моего основного сайта. Затем из этого файла шаблона я вызываю свои дополнительные представления. Вот пример:

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

Из моего контроллера я передам имя представления в $ data ['main']. Поэтому я сделаю что-то вроде этого:

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

У меня была эта проблема, когда я хочу, чтобы контроллер завершил сообщение, такое как «Спасибо за эту форму» и «не найдено» и т. Д. ». Я делаю это под view-> 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'); ?> 

который позволяет мне изменять широковещательный сайт сообщений в этом одиночном файле для любой вещи, которая вызывает

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

На этот вопрос был дан правильный ответ, но я хотел бы добавить свой подход, он не отличается от того, что говорили другие.

Я использую разные страницы макетов для вызова разных верхних и нижних колонтитулов, некоторые называют этот макет , некоторые называют его шаблоном и т. Д.

  1. Отредактируйте core/Loader.php и добавьте свою собственную функцию для загрузки макета, я назвал функцию, например, layout .

  2. Создайте свою собственную страницу шаблона и вызовите для нее вызов header/footer , я назвал его default.php и поместил в новый каталог, например view/layout/default.php

  3. Вызовите свою собственную страницу просмотра с вашего контроллера, как обычно. Но вместо вызова $this-load->view используйте $this->load->layout , функция макета вызовет default.php а default.php вызовет ваш верхний и нижний колонтитулы.

1) В функции core/Loader.php в режиме view () я продублировал и добавил

  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) Создайте папку макета и поместите в нее default.php в 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) С вашего контроллера вызовите макет

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

Чтобы использовать другой макет, добавьте новое имя макета в массив $data

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

и, конечно, вы должны иметь свой новый макет в каталоге макета, как в:

 view/layout/full_width.php 

CodeIgniter-Assets легко настроить репозиторий, чтобы иметь пользовательский верхний и нижний колонтитулы с CodeIgniter. Я надеюсь, что это решит вашу проблему.

Использование этого помощника для загрузки динамического шаблона

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

Вы можете использовать файл config.php, а также использовать полномочия помощников в 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'); 

Источник: https://jamshidhashimi.com/dynamically-add-javascript-and-css-files-in-codeigniter-header-page/

Не могли бы вы использовать включение в свои взгляды? Такие как:

 <?php include('templates/header.php'); ?>