CI 묻고 답하기

제목 ci세상님께 물어봤었는데..header, contents, footer 에 대해서
글쓴이 터프키드 작성시각 2009/08/26 15:22:10
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 46260   RSS
해당 컨트롤러에서 (예를들어 blog 컨트롤러)
$this->load->view('header');
$this->load->view('contents');
$this->load->view('footer');

처럼 하시던데요 물론 레이아웃 하나로 쓰는 방식도 있구요
근데 저는 그렇게 view를 불러오는 방법이 궁금한게 아니구요

각각 header, footer 컨트롤러가 필요합니다;
컨트롤러 없이 blog 컨트롤러 안에서 header에 들어갈 php랑 footer에 들어갈 php코드랑 다 짜고

위에처럼 불러오면 되겠지만, 그럼 컨트롤러가 변경될때마다 같은 코드를 계속 중복해서 써줘야하잖아요
게다가 지금 만드는 사이트는 header footer가 섹션별로 달라집니다 (디자인도 바뀌지만 php코드들도..)
이럴땐 어떻게 구조를 세우는게 좋을지 감이 안오네요;

혹시 완전한 사이트 소스같은걸 구할 수있을까요?

 다음글 views 디렉토리를 루트로 빼려다 실패했습니다; (8)
 이전글 Template_ 연동해보는데요 클래스생성이 안되는거 ... (6)

댓글

터프키드 / 2009/08/26 16:41:08 / 추천 0
아 어렵네요 ㅎ
그냥 index.php 최상단 파일에다가 header, footer 에 관련된 php 코드 다 짜놓고 해도 될지
helper에 header_helper.php , footer_helper.php 등록하고 해야할지
도데체 함수, 클래스 외에 디폴트로 사용해야하는 코드는 어디에 넣어야하나요..ㅠㅠ
변종원(웅파) / 2009/08/26 17:21:01 / 추천 0

컨트롤러 파일에서 아래 소스처럼 상단에 넣어놓으시면 됩니다.
전에 ci세상님이 올리셨던 내용을 소스에 적용한겁니다.

주소가 a.com/admin/config/usage 일 경우 $method는 usage 가 됩니다.

function _remap($method)
	{
		//상단
		$this->load->view('admin/header_v', $this->data);
		
		//해당 메소드 호출
		$this->{$method}();
		
		//하단
		$this->load->view('admin/footer_v');
		
	}
	

	/**
	 * function 값이 없을때.
	 */
	function usage() {
		
		//뷰만 선언
                     $this->load->view('usage_v');
	}
ci세상 / 2009/08/26 17:26:38 / 추천 0

1. 공용상수
http://codeigniter-kr.org/qna/view/754/page/2/ 웅파님 댓글 참조

2. 후킹
http://codeigniter-kr.org/tip/view/104/
=> 스킨형태를 어떻게 지정하는지 잘 설명해 두셨습니다. ^^ 너무나 좋은 정보를 주시는 웅파님 ㅎㅎ
터프키드 / 2009/08/26 18:05:02 / 추천 0
헉헉 지금 전에 웅파님이 이전 게시판에 올려두신 글 어찌어찌 찾아서
해외 컨트롤러에서 컨트롤러 불러오는 위젯을 발견했습니다
어찌저찌해서 구현 동작이 완료된것까지 했네요!

두분 신경써주셔서 감사드려요^^
다른 방법도 있겠지만, 일단 되는걸로 빨리빨리 해야하기때문에..ㅠㅠ

아래는 제가 구현한 방법입니다

inc/header.php
class Header extends MY_PageController {
  public function __construct()
    {
        parent::getInstance();    
    }    
	
	function index()
	{
		$this->template_->define('header', 'header_view.php');
		$this->template_->assign('title', '아이어러너너어리');
		$this->template_->print_('header');
	}
}

inc/footer.php
class Footer extends MY_PageController {
  public function __construct()
    {
        parent::getInstance();    
    }    
	
	function index()
	{
		$this->template_->define('footer', 'footer_view.php');
		$this->template_->assign('copyright', '그런쇼쇼쇼');
		$this->template_->print_('footer');
	}
}

main.php (최초 컨트롤러)
class Main extends MY_PageController {

	public function __construct()
    {
        parent::getInstance();    
    }
    
	function index()
	{
		$this->load->controller('_inc/header');
		$this->header->index();
		
		$this->set_contents();
		
		$this->load->controller('_inc/footer');
		$this->footer->index();
	}

	function set_contents(){
		$data['bank_result'] = $this->db->get('pb_user_bank_account')->result_array();
		
		$this->template_->define('main', 'main_view.php');
		$this->template_->assign('data', $data);
		$this->template_->print_('main');
	}
}
이렇게 해봤습니다

My 관련된 클래스들은 application/libraries 에 넣어뒀구요
template_ 와 my_pagecontroller는 autoload 해뒀습니다


변종원(웅파) / 2009/08/26 19:31:52 / 추천 0
현재 개발중인 CMS에서는 widget 플러그인(컨트롤러에서 다른 컨트롤러 호출)을 이용해서
각각의 플러그인들을 호출하여 만들어진 html을 조합해서 사이트를 표현해줍니다.
현재 구현하신 것도 페이지(메소드)마다 상하단을 선언해줘야 하는 구조입니다.
시간 되실때 _remap으로 바꿔보시기 바랍니다.
그러면 한번만 선언해놓으면 나머지 메소드에서는 선언할 필요없습니다.
터프키드 / 2009/08/26 23:17:02 / 추천 0
웅파 // 넵 정말 감사합니다^^
근데 remap 은 한번 선언해놓으면 나머지 메소드에서 선언할 필요가 없다고 하셨는데요
만약 header, sidebar, footer 등이 필요없는 팝업창 같은 경우에는 어떻게 제외해줄 수 있나요?
제가 한 방법은 좀 귀찮긴 하지만, 제가 아직 수준이 낮아서 ㅎㅎ;
저런방법밖에 생각이 나지 않네요

그리고 remap을 넣을 파일이 컨트롤러 파일이라고 하셨는데요..
system/libraries/Controller.php 파일을 말씀하시는건가요?
그럼 $this->load->view('admin/header_v', $this->data) 하게되면 모든 자식 컨트롤러에서 사용되는데
admin 부분을 대체할수 있는 변수가 있는지.. (admin 일수도 service 일수도.. 여러가지 디렉토리가 있어서요..)
segment(1)."/header_v" 하면 되려나요 ㅎㅎ;

아 정말 어렵고도 먼 CI와 MVC 패턴이군요..ㅠㅠ

ci세상 / 2009/08/27 00:22:07 / 추천 0
_remap 재매핑을 이용하면 메쏘드를 체크해서 있으면 상하단 적용 없으면 팝업처리

## 컨트롤러 예제 ##

<?
function _remap($method)
{
	// 메쏘드가 있으면 상하단 적용 없으면 팝업창
	if ( method_exists($this,$method.'_method'))
	{
		$this->load->view(''.$this->uri->segment(1).'/header_v');
		$this->{"{$method}_method"}();
		$this->load->view(''.$this->uri->segment(1).'/footer_v');	
	}
	else
	{
		if(!$this->uri->segment(3))
		{
			$this->_CreatePopup();
		} else {
			$this->_CreateExe();
		}
	} 		
}

function list_method()
{
	echo "목록";
}


function _CreatePopup()
{
	echo "팝업창 띄우기";
}


function _CreateExe()
{
	echo "팝업창 실행";
}
사용예)

http://domain.com/member/list 라고 하면
=> view폴더에 member 폴더에 header, footer가 열리고 list 메쏘드를 사용

http://domain.com/member/id_search 라고 하면
=> _CreatePopup 메쏘드가 실행되면서 지정된 새창이 열리게 될것이구요

http://domain.com/member/id_search/exe  라고 하면
=> _CreateExe 메쏘드가 실행되면서 팝업창을 처리완료후 닫게 만들게 됩니다.




케이든 / 2009/08/27 00:50:25 / 추천 0
만약 header와 footer가 페이지마다 정말! 많이! 다이나믹 하다면

컨트롤러에서 컨트롤러를 부르는 hmvc나

좀더 나아가서는 모듈 방식으로 개발하면

관리하기가 좀 더 수월할겁니다..
터프키드 / 2009/08/27 08:51:51 / 추천 0
ci세상 // 자세한 설명 감사드립니다^^ Controller.php 에 넣는게 아니군요!
관련부분에 대해서 좀 더 찾아보고 실 개발 전에 선택해야겠습니다^^

케이든 // 그다지 완전 심하게 다이나믹하진 않지만, 레이아웃 자체가 달라지는 경우도 많고 그렇네요..ㅠㅠ
변종원(웅파) / 2009/08/27 09:55:00 / 추천 0
ci세상님이 자세하게 올려주셨네요. ^^