CI 묻고 답하기

제목 레이아웃 질문
글쓴이 헛발이 작성시각 2009/10/30 10:36:14
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 33425   RSS
CI에서는 레이아웃을 어떤 방식으로 만드는게 좋은가요?

메뉴부분이라던지....

음..
 다음글 select 박스 만들때 최초 기본 선택값 문제 (1)
 이전글 controller의 함수 호출 질문입니다. (3)

댓글

ci세상 / 2009/10/30 11:39:23 / 추천 0

컨트롤러에서 레이아웃이 결정될것 같은데요..

레이아웃으로 상단, 좌측, 본문, 하단 총 4개로 분할되었다고 가정했을때
=> 4개의 출력유무를 선택적으로 사용할 수 있어야 할것 같습니다.

<예>
1. 4개 전체 사용
2. 상단만 사용
3. 팝업창 사용시 4개모두 사용안함
4. 실행처리시 4개모두 사용안함

ci세상 / 2009/10/30 11:56:41 / 추천 0
샘플소스를 원하신것 같은데 말로만 드린것 같아서 예제를 함 올려봅니다.^^

<?
class Layout extends Controller {

	function Layout()
	{
		parent::Controller();	
	}
	

	function _remap($method)
	{

		// 상단정의
		if (strpos($method, '_pop') == false)	$this->load->view('head');

		// 메쏘드 유무를 체크해서 가변함수 처리하기
		if ( method_exists($this,$method.'_method'))
		{
			$this->{"{$method}_method"}();
		}
		else
		{
			$data['title']= '본문'; 
			$this->load->view($method,$data);
		} 		


		// 하단정의
		if (strpos($method, '_pop') == false) 	$this->load->view('foot');	

	}
<사용방법>
1. 상하단 사용시
http://도메인/layout/list
=> list_method 메쏘드가 있으면 참조하고 아니면 바로 views 파일을 호출합니다.

2. 상하단 미사용시
http://도메인/layout/search_pop
=> view파일에 _pop이라고 들어가면 상하단을 호출안하게 하였습니다.

개발자 스타일대로 다양하게 레이아웃을 사용하실 수 있으니 멋진 레이아웃 컨트롤러 함 만들어 보세요^^
헛발이 / 2009/10/30 13:49:46 / 추천 0
감사합니다..
그냥 레이아웃을 몇개 만들어 놓고 상단에서 어떤 레이아웃을 사용할것인지 정의만 하는 방법은 없나요?
또 질문 드리게 되네요...
케이든 / 2009/10/30 14:49:50 / 추천 0

현재 쓰고있는 방법인데요

HOOK으로 한방에 훅 갑니다~

훅폴더에 아래소스 넣어주시구요

Yield.php

 

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

class Yield
{
	function doYield()
	{
		global $OUT;
		$CI =& get_instance();
		$output = $CI->output->get_output();
		$CI->yield = isset($CI->yield) ? $CI->yield : TRUE;
		$CI->layout = isset($CI->layout) ? $CI->layout : 'default';
		if ($CI->yield === TRUE)
		{
			if (!preg_match('/(.+).php$/', $CI->layout))
			{
				$CI->layout .= '.php';
			}
			$requested = APPPATH . 'views/layouts/' . $CI->layout;
			$layout = $CI->load->file($requested, true);
			$view = str_replace("{yield}", $output, $layout);
		}
		else
		{
			$view = $output;
		}
		$OUT->_display($view);
	}
}
?>



그다음 hooks.php에 훅 추가해주세요


 

$hook['display_override'][] = array(
	'class'    => 'Yield',
	'function' => 'doYield',
	'filename' => 'Yield.php',
	'filepath' => 'hooks'
);

끝입니다.

소스에서 보이는것처럼 레이아웃파일은 views/layouts/ 에 저장하게 되있고, default 레이아웃은 default.php 입니다.

사용방법은 컨트롤러 상단에

var $layout = 'myLayout';
어떤 레이아웃 쓸지 변수 선언해주시면 됩니다.

메소드마다 따로 설정해 주셔두 되구요.


레이아웃을 쓰지않을땐 메소드에 $this->yield = false; 선언하시면 레이아웃없이 렌더링  됩니다~

참 쉽죠잉

입맛대로 바꿔써보아요
케이든 / 2009/10/30 14:55:59 / 추천 0

레이아웃 파일은 대충 요딴식으로 {yield}가 포함되있어야겠지요?

 

<html>
<header>
</header>
<body>
<div id="an_exmaple">
  <div id="anoter_ex">
  <div/>
  {yield}
  <div>
  </div>
</div>
</body>
</html>
헛발이 / 2009/10/30 15:32:49 / 추천 0
역시 세상엔 대단한 분들이 많은거 같아요...
ci세상 / 2009/10/30 23:20:45 / 추천 0
케이든님께서 좋은 팁을 공개해 주셨네요 ~~ ci코드자료실에도 옮겨주시면 좋을것 같습니다. ^^

레이아웃을 정의하는 부분이 보통은 상단, 하단 파일만 있으면 어느정도 다 구현이 된다는 가정하에서

head_blue.php
foot_blue.php

head_red.php
foot_red.php

등등 이렇게 파일을 만들어 두고 심플하게 아래와 같이 지정해서 써도 될것 같습니다.^^

<?
class Layout extends Controller {

	function Layout()
	{
		parent::Controller();	

		$this->skin_name = "blue"; // 스킨명
	}
	

	function _remap($method)
	{

		// 상단정의
		if (strpos($method, '_pop') == false)	$this->load->view('head_'.$this->skin_name);

		// 메쏘드 유무를 체크해서 가변함수 처리하기
		if ( method_exists($this,$method.'_method'))
		{
			$this->{"{$method}_method"}();
		}
		else
		{
			$data['title']= '본문'; 
			$this->load->view($method,$data);
		} 		


		// 하단정의
		if (strpos($method, '_pop') == false) 	$this->load->view('foot_'.$this->skin_name);	

	}
헛발이 / 2009/11/05 18:56:11 / 추천 0
ci세상님께서 알려 주신데로 해 보려고 하는데요.. 프레임 워크가 처음이라 그런지 아직 물어 보고 싶은게 많은데요... ^^;

보통 일반적인 PHP를 사용한다면

top.php (윗부분)
left.php (왼쪽부분)
bottom.php (아랫부분)
(파일명은 대충...)

이렇게 만들어 놓고 index.php에서 3개의 파일을 모두 인크루드 시켜 페이지를 구성하잖아요..
뭐 그렇게 하지 않아도 되지만.. 예를 들면요..
그렇게 되면 페이지에서 인쿠르드 시켜면서 top.php, left.php, bottom.php에 값을 전달(?)해서
메뉴가 선택되게 한다던지... login을 logout으로 보여준다던지..등등..

그런데...케이든님께서 알려주신 것으로 해 보려고 하니...
layout.php파일을 만들어 놓고 top.php, left.php, bottom.php 를 만들어서 인쿠르드 시켜야 하는건가요?
인쿠르드 시켜야 한다면 ... 그쪽으로 값전달 같은거 어떻게 해야 하는지...

개념이 잘 들어 서지 않아서리.... ㅡ.ㅡ;

ci세상 / 2009/11/06 09:28:28 / 추천 0
케이든님의 훅 방식 질문하신것이지요?^^

훅관련해서 케이든님께서 http://codeigniter-kr.org/source/view/313/page/1 여기 자세하게 정리해 주셨네요

1. 인크루드 방법
2. 값전달 방법
이 나와있습니다.^^

login, logout은 ci세션이 view 까지 전달이 되기때문에 view에서 바로 처리하셔도 되겠습니다.

codeigniter 소스가 MVC로 나눠지면서 한개의 파일로 처리할때보다 지정하고 호출하는 부분에서 조금 혼동을 하시는것으로 보여집니다.

근데 .. 결론은 동일합니다. 컨트롤러라는 놈이 모든것을 다 제어하는데요 이놈이 모델을 참조할지 뷰에 노출할지 결정하게 되는데요 ~~ 그래서 컨트롤러에 정확하게 명령을 내려줘야 한답니다.

하여튼 뭐든지 컨트롤러에게 정확한 지령을 내릴 수 있도록 해주세요^^

개발하시면서 해결이 안되는 부분은 간략히 정리하셔서 ci 폴더 통채로 압축하셔서 올려주시면 여기 운영진분들께서 직접적으로 로컬테스트를 통하여 문제점과 좋은 해답방안을 다시 드릴 수 있사오니 참조해 주시기 바랍니다.^^

헛발이 / 2009/11/06 09:57:31 / 추천 0
오호 감사합니다.. ^^ 참조 하겠습니다...