Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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'); ?>