developer tip

CodeIgniter의 머리글 및 바닥 글

copycodes 2020. 11. 7. 10:16
반응형

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 페이지 고유 사이드 바 ...

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

CodeIgniter-AssetsCodeIgniter를 사용하여 사용자 정의 머리글과 바닥 글을 갖도록 저장소를 쉽게 구성 할 수 있습니다. 이것이 문제를 해결하기를 바랍니다.


응용 프로그램 / 코어 폴더에 'MY_Loader.php'라는 파일을 추가하고 다음 내용을 추가하여 CI_Loader :: view 함수를 재정의합니다.

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

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/


여기 내가 내 것을 다루는 방법이 있습니다. 보기 폴더에 template.php라는 파일을 만듭니다. 이 파일에는 내 기본 사이트 레이아웃이 모두 포함되어 있습니다. 그런 다음이 템플릿 파일에서 추가 뷰를 호출합니다. 다음은 그 예입니다.

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

컨트롤러가 'Thanks for that form'및 일반 'not found etc'와 같은 메시지로 끝나기를 원하는이 문제가있었습니다. 나는 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);

이 질문에 대한 답은 적절했지만 제 접근 방식을 추가하고 싶습니다. 다른 사람들이 언급 한 것과 크게 다르지 않습니다.

I use different layouts pages to call different headers/footers, some call this layout, some call it template etc.

  1. Edit core/Loader.php and add your own function to load your layout, I called the function e.g.layout.

  2. Create your own template page and make it call header/footer for you, I called it default.php and put in a new directory e.g. view/layout/default.php

  3. Call your own view page from your controller as you would normally. But instead of calling $this-load->view use $this->load->layout, layout function will call the default.php and default.php will call your header and footer.

1) In core/Loader.php under view() function I duplicated it and added mine

   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) Create layout folder and put default.php in it in 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) From your controller, call your layout

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

To use another layout, include the new layout name in your $data array

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

and of course you must have your new layout in the layout directory as in:

view/layout/full_width.php 

Using This Helper For Dynamic Template Loading

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

참고URL : https://stackoverflow.com/questions/9540576/header-and-footer-in-codeigniter

반응형