글쓴사람 템플릿초보자
글쓴시간2004년 8월 20일 오후 8시 26분 22초
    제목다른 경로의 페이지 삽입
보통의 한 화면에는
'상단', '왼쪽', '하단', 그리고 '본문' 으로 구성되어 있습니다.

이 파트들을 모두 분리하여 작업하는 사람이 있는가 하면
또 한 html 내에서 한꺼번에 작업하는 사람들도있습니다.
프레임이 아니라면 보통은 한 페이지에서 작업하겠죠

템플릿의 사용목적은 작업의 편리성이라 생각됩니다.
만일 이 파트들을 모두 분리 한다면 굳이 템플릿을 사용하지 않고
php 로 자체적으로 include 하면 더 편할수도 있습니다.

보통 위의 구조로 되어 있으며, 본문 부분만 바뀌는 경우가 많습니다.
그럼에도 불구하고 디자이너에게는 모두가 붙어있는 상태가 작업이 훨씬 수월해집니다.

여기서 만일 본문부분이 다른것으로 교체될 경우
특히 본 페이지와는 다른 경로의 페이지로 교체될 경우 의문점이 생깁니다.

본질문으로 들어가겠습니다.

위의 래이아웃을 A.php 이라 하고 (본문이 빠진거) 본문을 교체될 부분을 B.php 이라 하겠습니다.

A 와 B 모두 템플릿이 적용되어 있으며, 내부적으로 여러가지 라이브러리나 암튼 피리요한 파일들이 include 되어 있고, 또한 세션,쿠키등도 설정되어 있습니다.

그런데 A.php 과 B.php 는 서로 다른 절대경로를 가집니다.
A 의 위치에서 B는 상대적으로 dir/B 이거나 ../dir/B 에 위치합니다.
B  자체만으로는 당연히 제대로 잘 동작합니다.

그런데 두개를 붙일려고 하니 이만저만한 문제가 아니군요
일단 B 내에서 지정된 tpl 경로부터 다른데다가
세션이 두번 설정(A 에도 있고 B 에도 있음) 되는 문제
그리고 각종 include 파일들의 경로문제 등등이 그것입니다.

템플릿 삽입의 경우
<!--{+ body}--> 형태와 같이 + 를 사용하면 된다고 했는데
예로 B 는 보드라 가정하겠습니다.

그러면 A.html 내에서 위의 코드가 삽입되고
A.php 에서
$tpl->define('bd' => 'A.html?body') 형태로 사용할 경우
A.body.html 이라는게 있어야 할거 같은데
그렇다면 그것을 위해 저 파일을 다시  만들어야 합니다.
또 만든다 하더라도 어떻게 내용을 채워야 할지도 모르겠네요

또는 # 를 이용하여 인클루드를 한다 하더라도
$tpl->define('body' => 'board/index.php')
이런식으로 하게 되면 내부적으로 단순하게 그냥 include 함수를 쓰는거 같던데
당연 문제가 생깁니다.
board/index.php 내에서 정의된 것들과, 인클루드에 대한 경로문제가 발생하거던요
만일 포함해야 할 파일이 php (템플릿처리됨, 안 되어야 상관없음) 가 아닌
순수한 html 이나 js, css 등등이라면 아무런 문제없이 잘 됩니다만...
독립적인 실행이 가능한 코드파일(게시판 같은게 대표저이겠죠) 이 다른경로에 있을 경우 삽입문제를 어떻게 해결하는게 좋을런지요

예전에는 이 문제 때문에(굳이 템플릿을 쓰지 않더라도 마찬가지라 생각됩니다만)
iframe 으로 넣었습니다.. 프래임형식으로 삽입하지 않고 테이블내에 직접 삽입하고 싶거던요
만일 iframe 형태로 삽입한다면 더 이상 고민하지 않아도 되겠지만...

대충 무슨 질문인지는 아시시라 생각됩니다..

좋은 아이디어 혹은 제가 잘 모르는 부분, 잘못 이해하고 있는 부분이 있다면,
답변 부탁 드립니다.

다시 한번 더 말씀드리면
삽입하고자 하는 대상이 템플릿 처리가 되었건 그냥 html 이건 아니면 php 이건
별로 문제 되진 않습니다.(사실 세션 문제는 있습니다) 그런데
경로가 달라지니 잘 안 되는군요..

대충의 트리구조는 이러합니다.

./A.php
./template_dir/htmls.html
./board
./board/B.php
./board/template_dir/htmls.html

위와 같이 되어 있습니다.
관리자 템플릿문제라기 보다 php 파일 인클루드시에 상대경로 문제를 말씀하신 거 같네요.

이 홈페이지에서 답변할 내용은 아닌 거 같은데.. 절대 경로를 사용하는 방법이 있죠.. DOCUMENT_ROOT 값을 쓴다거나 __file__ 상수를 이용한다거나 php.ini 파일에서 include_path 값을 추가한다거나 ini_set() 함수로 include_path 값을 php 파일에서 수정한다거나 공통 인클루드(config.inc) 파일에서 라이브러리 디렉토리의 절대경로를 정의한다거나.. include_path 사용하면 상대경로를 쓰더라도 잘 처리할 수 있겠네요.

그리고 템플릿 분할 {+ div} 기능의 용도는.. 설명서에도 나와 있지만.. 다른 예를 들어 본다면.. 게시판에서 내용읽기와 목록출력을 같이 해줄 때도 있고 목록출력만 할 때도 있는데.. 이럴 때 템플릿을 파일 한 개만 작성해도 두 가지 경우 모두에 사용할 수 있다는 것입니다.

일단 여기까지 말씀드리구요.. 해결이 안됐다면 다시 질문하시기 바랍니다.
04-08-21 08:55
템플릿초.. 네 맞는 말입니다. 당연히 저 역시도 절대경로를 쓰고 있습니다. 공통적으로 쓰이는 부분은 당연히 그러한데
개개마다의 인클루드 되는 파일이 각각 다른곳에 위치하고 있습니다. 또한,

A 와 B 는 공존하지만 성격이 다른 것이므로 tpl 파일들도 역시나 다른곳에 위치합니다.
A 의 템플릿들은 A 아래에 위치하며
B 의 템플릿들은 B 아래에 위치합니다.
그리고 B 는 이미 템플릿 처리가 되어 있고요
근데 A 에서 B 를 로드하면
$template_dir 경로때문에
B 의 템플릿들을 읽어내지를 못하네요
(당연한지도 모르지요 A 에서 B 를 include() 하니깐요
또한,
A 에서 $tpl = new xxx 하고 B 에서도 역시나
$tpl = new xxxx 입니다.
$tpl 역시나 변수명도 같고요(scope 는 아직 사용해보진 않았습니다.)
아뭏튼 여러 문제가 좀 생기는거 같습니다.
제 능력이 부족해서 그런지는 모르겠찌만..
분명 소스상에서도
include_php() 였나..이것을 사용하고있고
그 메서드에서는 단순 include() 를 호출하고 있으니깐요

require_once 를 했는데도 로딩이 이미 되었다고 나올때도 가끔 있고요.. (A 와 B 에서 같은 파일을 include 하는 경우가 허다합니다.)
04-08-21 18:08
템플릿초.. 위에서 잠시 해갈릴거 같아서 덧붙입니다.
개개마다다르게 위치 한다는 말은
공통 include 는 당연 같은 곳에 있으며,
설정이나 기타 내용이 틀린것들도 있는데
이것들이 A 와 B 가 서로 다른곳에 위치합니다.
04-08-21 18:10
관리자 A.php 파일이나 B.php 파일에서

$tpl = new Template_;
$tpl->template_dir = dirname(__file__)."/template_dir";

하시면 되겠네요.
04-08-21 19:09
템플릿초.. 그런 의미가 아닌데요..쩝..

물론 그렇게 하고 있죠 --;

암튼 답변 감사드립니다.
04-08-23 15:35
관리자 A 에서 B 를 인클루드했으므로..

B에서의 상대경로가 B가 아닌 A를 기준으로하기 때문에 문제가 된다는 말씀이 아닌가요..

B 에다가 템플릿 경로를 __file__ 사용해서 위와 같이 지정하면 어떤 경로에서 B를 인클루드해도 B가 B의 템플릿들을 읽어낸다는 이야기 입니다.

그런 의미가 아니면 어떤 의미인가요.
04-08-23 16:09
거친마루 A도 완전한 구조를 가지고 있고 B도 완전한 구조를 가지고있는데 A가 B를 인클루드 하게될경우 같은 작업을 두번 중복하게 되는 문제를 말하는거같습니다.

1. A와 B를 포함할수 있는 컨트롤러를 다시 작성하셔서
경우에 따라 A또는 B를 인클루드하도록 로직 수정
두파일 동일하게 적용되는 부분은 그 컨트롤러에서 한번 처리해줄수도 있겠죠.

2. 객체 생성, 세션정의 등은 한번만 일어나도록 singleton 처리해주는 방법입니다.
if (!defined(__SESSION_REGISTERED)) {
 // process
}

역시 첫번째 방법이 Template_의 목적이나 여러가지 면에서 나아보이지만..
지금 구조를 많이 변경할수 없는 상황이라면 두번째 방법을 생각해보시는것도 괜찮겠네요
04-08-25 18:16
    이름
비밀번호
 
Since 2003-03-03 hosted on vultr.com