CI 묻고 답하기

제목 layout설정 관련 질의 드립니다.
글쓴이 코초보 작성시각 2010/09/13 11:46:14
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 23108   RSS
안녕하세요 초보 질문 드립니다.

이번 작업중에 layout을 적용하려고 하기 경로에 layout 사용법을 따라 하는데
문제가 발생해서 고수님들께 질문 드립니다.
http://www.codeigniter-kr.org/source/view/313/page/1/q/hook

상기 경로에 있는 곳과 똑같이 설정을 했는데
문제가 되는건 controller 에서 하기와 같이 설정을 하면
============================
//레이아웃 파일 설정
var $layout = 'my_layout_file';
============================

hooks/Yield.php
에서 $CI->layout을 못 읽어 들입니다.
별 수를 다 써봤는데도 읽은 수가 없는데 왜이런 건지요????

참고로 hmvc를 사용하고 있습니다.



 다음글 세션 질문입니다.. (4)
 이전글 세션질문 좀 드립니다. (4)

댓글

코초보 / 2010/09/13 11:55:54 / 추천 0
추가적으로 설명을 더 드리자면 layout을 읽어 오는데 문제는 없는데
$CI->layout을 못읽어 오니 무조건 default layout만 가져와서 문제가 되고 있습니다.
달뚱이 / 2010/09/13 12:44:10 / 추천 0
잘 모르지만 한가지 말씀드리자면..

혹시 matchbox 쓰시나요?

그렇다면 controller에서 $this->layout으로 쓰시면 안되고,

$CI =& get_instance();
$CI->layout = 'some';

이런식으로 하셔야 할겁니다.

저도 계속 안됐는데 이런식으로 하니까 되더라구요...
코초보 / 2010/09/13 13:22:44 / 추천 0

layout에서 hmvc경로는 찾습니다. 그래서 layout은 설정 되나 무조건 default layout만 가져오는 현상이 나오는 거구요
달뚱이님 말과 같이 하니 이상 없이 작동합니다.
근데 parent::Controller();로 받아서 쓸텐데 왜 $CI =& get_instance(); 로 해야 이상 없이 동작하는지
이유를 알 수 있을까요?

그럼 모든 페이지를 그 방식으로 사용해야 하기 때문에 질의 드립니다.
 

달뚱이 / 2010/09/13 13:45:33 / 추천 0

저도 그 이유를 찾기 위해서 여기 저기 뒤져봤는데 실력이 딸려서 ㅜㅜ 알수가 없더라구요..

hook이 설정되는 시점이 달라서 인가 싶어서 hook도 변경해보고,

hmvc로 작업할 적엔, hmvc내부도 보고 해봤는데..영....ㅜㅜ

정말 왜그런걸까요?? 궁금하네요...

코초보 / 2010/09/13 13:50:39 / 추천 0
달뚱이님 때문에 어떤 것이 문제인지는 알게 되었네요...
정말 감사합니다.
달뚱이 / 2010/09/13 13:56:16 / 추천 0
허거걱... 찾았습니다...

글 달고 저도 궁금해서 다시 파일 열어보다 찾았습니다...

$output = $CI->output->get_output();

이 부분을

if ($CI->yield === TRUE)

바로 위로 올려주면 됩니다..

$CI->output->get_output(); 이 부분이 컨트롤러에 의해서 생성된 페이지인데,

이부분을 불러온 후 다시 아래에서 정의를 해서 그런것 같습니다.

정확하지는 않구요.. 여튼 이렇게 하니까 말끔하게 되네요...
코초보 / 2010/09/13 14:02:45 / 추천 0

흠.....전 그렇게 바꿔도 안되네요...
<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
class Yield {
 function doYield()
 {
  global $OUT;
  $CI =& get_instance();

  $CI->yield = isset($CI->yield) ? $CI->yield : TRUE;
  $CI->layout = isset($CI->layout) ? $CI->layout : 'default';
  $output = $CI->output->get_output();
  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);
 }
}
?>

코초보 / 2010/09/13 14:21:21 / 추천 0

흠.....테스트 해 본 결과
$CI =& get_instance(); 로 생성되는 오브젝트 정보와
parent::Controller(); 로 공유 되는 $this 오브젝트 정보가 다르던데요..
그게 무슨 영향을 끼치는 건가여??
흠.....

달뚱이 / 2010/09/13 14:21:53 / 추천 0
방금 해보니까 hmvc에서는 안되네요...

저는 matchbox를 사용하고 있는데, matchbox에서도 안됐었거든요..

현재 matchbox에서는 잘 되고 있는데, hmvc로 해보니 안되네요...ㅜㅜ
코초보 / 2010/09/13 14:24:32 / 추천 0
전체 controller에 &get_instance()를 사용하기에는 부담이 되어서...
그럼 전달 방법을 바꿔야 할 거 같은데 그냥 global 변수를 정해서 변수값을 전달하는 방법 밖에는 없는 건가요??
계속 되는 초보 질문이네요....ㅠ.ㅠ
달뚱이 / 2010/09/13 15:00:37 / 추천 0
다시 또 시도해봤는데요...

controller에서

CI::APP->yield = FALSE

해 보세요...

음 이것으로는 돼는데...왜 그런지는....ㅜㅜ
코초보 / 2010/09/13 15:18:55 / 추천 0
달뚱이님 너무 감사합니다.
잘됩니다.