CI 코드

제목 코드 이그나이터를 접하고 처음으로 만들어본 객체 입니다.
글쓴이 내일은 작성시각 2011/11/11 11:16:16
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 18696   RSS
블럭단위의 독립적인 레이아웃과 효과적인 마크업에 가장 중점을 뒀습니다.

허접하지만 많은 지적 부탁드립니다.
<?php  
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Layout
{
 private $layout = array();
 private $data = array();

 function __construct()
    {
        $this->obj =& get_instance();

  $this->layout_header = 'default/layout_h';
  $this->layout_footer = 'default/layout_f';
  $this->data['title'] = $this->obj->config->item('coo_title');

  $this->add('js', 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js');

  if( $this->obj->uri->segment(1) != 'adm' )
  {
   $this->add('css', RT_PATH.'/css/common.css?20111007');
  }
    }

 public function view($path, $data = array())
 {
  $this->layout[] = array('path' => $path, 'data' => $data);
 }

 public function assign($key, $value)
 {
  $this->data[$key] = $value;
 }

 public function add($key, $value)
 {
  if( is_array($value) === TRUE )
  {
   $this->data[$key] = array_merge( $this->data[$key], $value );
  }
  else
  {
   $this->data[$key][] = $value;
  }
 }

 public function output()
 {
  $this->obj->load->view($this->layout_header, $this->data);
  
  foreach($this->layout as $output)
  {
   $this->obj->load->view($output['path'], $output['data']);
  }

  $this->obj->load->view($this->layout_footer);
 }
}

/* End of file Layout.php */
/* Location: ./application/libraries/Layout.php */

  
헤더 부분 마크업입니다.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
 <meta name="description" content="" />
 <meta name="keywords" content="" />
 <meta name="author" content="" />
 <title><?=$title?></title> 
<?foreach($css as $url):?>
 <link rel="stylesheet" href="<?=$url?>" type="text/css" media="screen" />
<?endforeach;?>
<?foreach($js as $url):?>
 <script type="text/javascript" src="<?=$url?>"></script>
<?endforeach;?>
</head>

<body>


사용 예
 
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class ohead extends CI_Controller {

 function __construct()
 {
  parent::__construct();
  //$this->output->enable_profiler(TRUE);
  $this->load->library('layout');
 }

 public function index()
 {
  $this->layout->add('js', JS_PATH.'/co.js');

  $this->layout->view('default/header');
  $this->layout->view('default/contents');
  $this->layout->view('default/footer');

  $this->layout->output();
 }
}

/* End of file main.php */
/* Location: ./application/controllers/main.php */


해더부분이외에 css 나 js 를 넣지 않기 위해서 개별 js 파일 삽입을 가능하도록 작성했습니다.
단점은 많이 느슨한구조로 보안부분이 문제가 될수도 있지 않을까싶네요..

긴글 읽어주셔서 감사합니다.
 다음글 업로드된 이미지 정사각형으로 썸네일 만드는 함수 (3)
 이전글 모델코드 생성기 (27)

댓글

변종원(웅파) / 2011/11/11 11:51:31 / 추천 0
add()구조 잘 만드셨네요. 드루팔에서도 저렇게 구현을 했습니다.

한가지 아쉬운 점은 레이아웃을 사용하는 특성상 (헤더와 푸터를 신경쓰고 싶지 않은..)
헤더와 푸터는 라이브러리에 고정을 하고 나머지 js나 css 추가와 컨텐츠 부분만 정의하는 것으로
바꾸시면 괜찮을 것 같습니다.

그리고 글은 ci코드로 이동하겠습니다.

감사합니다.

내일은 / 2011/11/11 11:59:01 / 추천 0
웅파님 도움말씀 너무 감사합니다 ^^

컨트롤러에서의 헤더와 푸터는 보여지는 부분이고.

보여지는 헤더와 푸터도 블럭 형식으로 가져다 쓸수 있게하고 싶었습니다..

레이아웃모델안의 헤더와 푸터를 디폴트로 선언해두었습니다.(doc 타입과 js css 정의 부분)

ajax 통신시를 대비하여 디폴트 헤더와 푸터도 디스플레이 여부를 지정할수 있게끔 수정해야겠네요 ..



혹시 제가 요지를 잘못 파악한걸까요;;; ;;
변종원(웅파) / 2011/11/11 12:36:15 / 추천 0
 아. 저는 index()에서  아래와 같이 쓰셨길래 헤더가 레이아웃안에 없는걸로 생각을 했는데
소스를 다시 보니 있네요. ^^; 그 디폴트 헤더가 중간에 쓰신 마크업인거죠?

그리고 ajax처리시 popup도 같이 처리하시면 됩니다. ^^
  $this->layout->view('default/header');
  $this->layout->view('default/contents');
  $this->layout->view('default/footer');
내일은 / 2011/11/11 13:29:42 / 추천 0
 네 ^^ 감사합니다 ..ㅎ

퇴사 결정후에 쉬면서 코드이그나이터분석을 해보려 하고 있습니다..

하고 싶은거 하면서 돈버는게 역시 쉬운게 아니네요 ^^;

웅파님 항상 도움주셔서 감사합니다 ^^
한대승(불의회상) / 2011/11/23 14:42:19 / 추천 0
좋은 자료 감사 합니다.

layout 구성시 잘 사용하도록 하겠습니다.

좋은 라이브러리 구현해 주셔서 감사 합니다.
벤지 / 2011/11/29 05:45:20 / 추천 0
너무 감사합니다...

메뉴얼 읽고 올려주신것 해보니 신세계 본듯해요...^--^


class Main extends CI_Controller {   <--   class ohead extends CI_Controller {  

쌈닭 / 2012/04/05 09:55:17 / 추천 0
 꿀코드 감사합니다~~~