| 제목 | MY_Loader 확장을 이용한 레이아웃 구조 사용 | ||
|---|---|---|---|
| 글쓴이 | 천재작곡가 | 작성시각 | 2016/02/24 14:45:40 |
|
|
|||
|
안녕하세요 '블루나라'님의 Hook을 이용한 레이아웃을 주로 사용하다가 이걸 $this->load->view() 에서 처리하는 방법이 없을까 고민하다가 한번 만들어봤습니다. 소스 주요핵심내용이 대부분 '블루나라'님이 공유해주신 소스라서 혹시 문제가 된다면 자삭하도록 하겠습니다.
@core/MY_Loader.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CI_Loader 의 확장
*
* $this->load->layout = TRUE;
* $this->load->skin = "스킨디렉토리이름";
* 으로 세팅하고
* $this->load->view($view, $vars, $return); 를 사용하면
*
* 해당 스킨디렉토리에 layout.php가 존재하실
* layout.php에 작성한 내용에 맞게 치환시킨다.
* {layout} => $this->load->view($view, $vars, $return);에서 가져온 데이타
* {layout %s} => 추가로 불러올 파일명
*
* example :
* {layout inc/header}
* {layout}
* {layout inc/footer}
*
* 위 예제의경우
* 스킨디렉토리/inc/header.php 파일,
* 스킨디렉토리/$view 파일,
* 스킨디렉토리/inc/footer.php 파일 로 자동으로 치환되서 불러온다.
*/
class MY_Loader extends CI_Loader {
public $layout = FALSE; // 레이아웃 사용여부
public $skin = NULL; // 레이아웃 사용시 스킨이름
function __construct()
{
parent::__construct();
}
public function view($view, $vars = array(), $return = FALSE)
{
global $OUT;
/*
* $this->load->layout = TRUE 로 설정하고
* $this->load->skin = "디렉토리명"으로 설정한경우
* 불러올 $view PATH에 스킨디렉토리 경로를 추가한다.
*/
$skin_path = VIEWPATH . DIRECTORY_SEPARATOR . $this->skin . DIRECTORY_SEPARATOR;
$view = ( $this->layout && $this->skin && file_exists($skin_path) ) ? $this->skin . DIRECTORY_SEPARATOR . $view : $view;
// 해당 파일을 불러와서 $output 변수에 저장한다.
$output = $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => TRUE));
// Layout 설정이 true로 되어있다면
if($this->layout === TRUE)
{
$requested = $skin_path ."layout.php";
if(file_exists($requested))
{
// $layout 변수에 layout파일 내용을 가져와 저장한다.
$layout = $this->file($requested, true);
// 위에서 불러왔던 output을 layout 파일 내의 {layout} 부분과 치환한다.
$output = str_replace('{layout}', $output, $layout);
// {layout %s} 부분과 매치되는 부분이 있는지 가져와서
// 해당 부분 파일이 존재하면 가져와서 치환한다.
if(preg_match_all('/{layout[\s]*([^}]*)}/', $layout, $matches) && array_key_exists(1, $matches))
{
foreach($matches[1] as $k => $v)
{
if(!empty($v))
{
$requested = $skin_path.trim($v).".php";
if(file_exists($requested))
{
$layout = $this->file($requested, true);
$output = str_replace(sprintf('{layout %s}', $v), $layout, $output);
}
}
}
}
}
}
$OUT->_display($output);
}
}
@ controllers/Test.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Test extends CI_Controller {
function __construct()
{
parent::__construct();
// 이 컨트롤러는 전부 레이아웃을 사용하고 같은 스킨을 사용하기때문에 생성자 부분에 넣었습니다.
$this->load->layout = TRUE;
$this->load->skin = "default";
}
function test()
{
$this->load->view("test");
}
}
|
|||
| 태그 | 레이아웃,스킨 | ||
| 관련링크 |
http://www.codeigniter-kr.org/bbs/view/tip?idx=8120 |
||
| 다음글 | 타서버와 연동중에 갑자기 2006에러가 발생 | ||
| 이전글 | DB TABLE column comment 를 이용한 ... (3) | ||
| 없음 |