TIP게시판

제목 MY_Loader 확장을 이용한 레이아웃 구조 사용
글쓴이 천재작곡가 작성시각 2016/02/24 14:45:40
댓글 : 0 추천 : 0 스크랩 : 1 조회수 : 15180   RSS

안녕하세요

'블루나라'님의 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)

댓글

없음