Верхний и нижний колонтитулы в CodeIgniter
Мне действительно не нравится писать в каждом контроллере:
$this->load->view('templates/header');
$this->load->view('body');
$this->load->view('templates/footer');
Возможно ли, что верхний и нижний колонтитулы будут включены автоматически, и если нам нужно его изменить, мы также можем это сделать? Как ты с этим справляешься? Или это не проблема, на ваш взгляд? Спасибо.
Ответы
Ответ 1
Вот что я делаю:
<?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');
Ответ 2
Да.
Создайте файл с именем 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);
Наслаждайтесь и помните детей, держите их сухими.
Ответ 3
Попробуйте это
Структура папок
-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
Вид рельсов, вроде подхода здесь
Ответ 4
Или более сложный, но облегчает жизнь - это использовать больше констант при загрузке.
Таким образом, подклассы могут быть определены свободно, а один метод - показывать представление.
Также выбранные константы могут быть переданы в 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");
загрузит заголовок, просмотр и нижний колонтитул.
Ответ 5
Простая запись @Landons MY_Loader для включения нескольких файлов для тела, e.i. уникальные боковые панели страницы...
<?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);
Ответ 6
Переопределите функцию CI_Loader:: view, добавив файл с именем "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;
}
}
Ответ 7
Вот как я справляюсь с моим. Я создаю файл под названием 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);
}
}
Ответ 8
У меня была эта проблема, когда я хочу, чтобы контроллер завершил сообщение, такое как "Спасибо за эту форму" и "не найдено" и т.д. ".
Я делаю это в разделе 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'); ?>
который позволяет мне изменять широковещательную передачу сообщений в одном файле для любой вещи, которая вызывает
$this->load->view("message/message_v", $data);
Ответ 9
Вы можете использовать файл 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/
Ответ 10
На этот вопрос был дан правильный ответ, но я хотел бы добавить свой подход, это не то, что отличается от того, что говорили другие.
Я использую разные страницы макетов для вызова разных верхних и нижних колонтитулов, некоторые называют этот макет, некоторые называют его шаблоном и т.д.
-
Измените core/Loader.php
и добавьте свою собственную функцию для загрузки макета, я вызвал функцию, например layout
.
-
Создайте свою собственную страницу шаблона и вызовите для нее вызов header/footer
, я назвал его default.php
и поместил в новый каталог, например. view/layout/default.php
-
Вызовите свою собственную страницу просмотра с вашего контроллера, как обычно. Но вместо вызова $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
Ответ 11
CodeIgniter-Assets легко настроить репозиторий, чтобы иметь пользовательский верхний и нижний колонтитулы с помощью CodeIgniter. Надеюсь, что это решит вашу проблему.
Ответ 12
Использование этого помощника для загрузки динамического шаблона
// 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;
}
}
Ответ 13
Не могли бы вы использовать include в своих представлениях? Например:
<?php include('templates/header.php'); ?>