웹마스터 팁

원문 링크 : http://www.100kwa.net/zeroboard/zboard.php?id=php&no=47

존칭 생략함을 양해해 주시기 바랍니다.

아래 본인의 글을 삭제하려고 하였다.
그런데 다른 분들의 코멘트 속에 확실하고 간단한 답이 있는 것을 발견하였다.
비록 잘 모르더라도 엔지오에 글을 올린 덕분에 기초를 확실하게 배울 수 있는 즐거음 ...

댓글 주신 분들께 진심으로 감사를 드리며, 정리해 보자면

1. 인클루드될(백과넷의 경우 상당 85픽셀 내용)파일의 맨 위를
<?
  $_zb_url = "http://www.100kwa.net/zeroboard/";
  $_zb_path = "/home/hosting_users/4nara/www/zeroboard/";
if($included) return false;
else $included = 1;
  include $_zb_path."outlogin.php";
?>

<html>
와 같이 시작한다.

2. 위 파일을 인클루드하는 다른 파일들에서는 단순히 include만 해 주면 된다.

3. 주의할 사항
<? include "http://www.100kwa.net/master/가나다.htm"; ?>과 같이 하면 안 된다.
이렇게 사용해 보니, $included값을 무시하고(적당한 표현인가?) 거듭 불러들였다.
<? include "../master/가나다.htm"; ?>과 같이 상대경로를 사용해야 된다.

4. 잔소리 : 위 몇 줄의 정리는 나처럼 헤매는 초보자들을 위한 배려이다.

아래 본인의 글을 보기 전에, 먼저 댓글들을 보시기 바란다.
---
제로보드에는 그룹 상단에 포함시킬 파일, 각 게시판의 상단에 포함시킬 파일 등을 설정하여 편하게 디자인할 수 있는 기능을 제공한다.
PHP의 include 명령을 이용하거나, 헤더 파일에서 정의하는 것 같은데 헤더 파일 운운은 아직 이해하지 못한 부분이고, 인클루드 명령을 사용하면 노프레임 페이지마다 같은 메뉴파일을 삽입하여 일관된 디자인을 유지할 수 있다.
뿐만 아니라, 메뉴파일에서 스타일시트 등을 일괄 정의할 수 있고 배경이미지를 한 번만 삽입해도 모든 파일에 나타나며, 레이어를 띄워서 디자인의 폭을 넓힐 수도 있다.
이 모든 내용을 며칠 사이에 터득하고는 상당히 기뻤다.

1. 전제가 되는 상황
백과넷을 방문하면 디자인을 볼 수 있으므로 그림 업로드는 생략한다.
1)
메뉴 파일 : /master/가나다.htm
- 이 파일에 /master/가나다_link.htm(ㄱ,ㄴ,...), /master/family_top.htm(사이트GO-링크100,홈피100,...), print_outlogin("kim",1,10) 등 3개의 인클루드 또는 프린트가 있다.
2)
개개의 파일에서 /master/가나다.htm (메뉴)파일을 인클루드한다.

2. 문제 상황
신문.htm 파일에서도 메뉴파일을 인클루드하고 전문신문.htm 파일에서도 메뉴파일을 인클루드한다. 모든 개별 파일에서 메뉴파일을 인클루드해야 사이트 내부 또는 패밀리에 속한 다른 사이트로의 이동을 위한 내비게이션이 가능하기 때문이다.
그런데 신문.htm 파일에서 전문신문.htm 파일을 인클루드하면 어떤 상황이 발생할까?
메뉴 파일을 2번 인클루드하는 결과, 메뉴 파일에 인클루드 또는 프린트된 객체들이 같은 이름으로 2번 떠오르면서 객체성을 상실하고 다양한 에러의 발생원인으로 변질된다.

3. 유저를 위한 고민
손님이 찾지 않는 가게는 망한다고 보아야 할 것이다.
손님은 신문.htm 파일을 찾기도 하고 전문신문.htm 파일을 찾기도 한다.
그런데 신문.htm 파일에 전문신문.htm 파일을 인클루드하면 더 좋아할 것 같다.


3. 초보적인 해결책
그래서 궁여지책으로 생각한 방법이 전문신문.htm 파일의 내용만 뽑아서 전문신문@.htm 파일을 추가로 만들고 전문신문.htm 파일에서도 그 새 파일을 인클루드하고, 신문.htm 파일에서도 그 새 파일을 인클루드하는 방법을 사용하면 문제는 해결된다.
그러나 만족할 수 없는 지나치게 초보적인 방법이다.

4. 객체의 존재여부를 따져서 같은 파일은 2번 인클루드하지 않기
HTML에서 객체의 존재여부를 확인하려면 document.all['이름']=='[object]'와 같은 비교식으로 처리하며, PHP에서 객체의 존재여부를 확인하는 함수로는 is_object가 있다.
그러나 필자와 같은 초보로서는 아무리 짜맞추어 보아도 명쾌한 답이 떠오르지 않았다.

5. 변수 전달하여 해결
인클루드된 파일에서 $로 시작하여 정의한 변수는, 메인 파일에서도 그대로 인식한다.
메뉴 파일에 들어가는 하나의 객체 정의 뒤에 그 객체를 변수에 담는 것이다.
        <td width="200" valign="top" rowspan="2">
            <div id="lay_가나다" style="width:180px; height:2000px; position:absolute; left:0px; top:0px; z-index:1;">
                <table border="0" cellpadding="0" cellspacing="0" width="180" height="2000" bgcolor="#CDDEEF">
                    <tr>
                        <td width="994">
                            <p> </p>
                        </td>
                    </tr>
                </table>
            </div>
        <? $log100 = document.all.lay_가나다; ?>
        </td>
이제 메뉴 파일을 인클루드하는 개별 파일에 무조건 인클루드하는 다음 구문 대신
<?
include "../master/가나다.htm";
?>
변수 $log100이 존재하지 않으면 인클루드하는 구문으로 바꾸자.

<?
if (!$log100) include "../master/가나다.htm";
?>
이것으로 해결되었다.
누구나 다 아는 사실일지 모르지만, 모르는 분도 있을 것이다.
기쁜 마음에 공유하고파 이 글을 올린다.

글 보아 주셔서 감사합니다.