제목 | 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) | ||
없음 |