Верхний и нижний колонтитулы в CodeIgniter - PullRequest
67 голосов
/ 03 марта 2012

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

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

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

Ответы [ 12 ]

100 голосов
/ 03 марта 2012

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

<?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');
39 голосов
/ 03 марта 2012

Да.

Создайте файл с именем 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);
7 голосов
/ 03 марта 2012

Попробуйте выполнить

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

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

View

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

Вид рельсов, подобный подходу

2 голосов
/ 20 мая 2014

Или более сложный, но облегчающий жизнь, это использование большего числа констант в загрузке.Таким образом, подклассы могут быть определены свободно, и единственный метод, чтобы показать представление.Также выбранные константы могут быть переданы в 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");

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

1 голос
/ 22 августа 2015

Переопределите функцию 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;
        }
}
1 голос
/ 25 декабря 2014

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

1 голос
/ 19 мая 2014

Простая перезапись @Landons MY_Loader, включающая несколько файлов для тела, например страница уникальных боковых панелей ...

<?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);
1 голос
/ 24 марта 2014

Вы можете использовать свой файл 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/

0 голосов
/ 31 марта 2015

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

//  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 голосов
/ 10 августа 2014

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

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

  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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...