사용자 스킨 지원
- 말그대로 스킨입니다.
- WikiX패치처럼 사용자가 스킨사용여부를 선택가능하게 함.
- config.pl에서 기본스킨사용설정 선택가능.
(스킨기능을 끄고 켜는 것이 아니라, 손님에게 기본적으로 어떤 화면을 보일지를 선택하는 것입니다.
스킨을 아예 사용하지 않으려면 config.pl에서 헤더/푸터경로를 공란으로 두면 됩니다.)
- 테이블로 씌워 스킨을 구성할 경우 페이지본문을 기준으로 || 헤더 || 본문 || 푸터 || 식으로 만들어야 한다.
- 함수로딩순서가 htmlheader->사이트로고/페이지이름링크->메뉴판->페이지본문->htmlfooter 로 고정되어 있고, htmlheader부터 메뉴판까지 서로 얽히고 설켜있기 때문
- 따라서 푸터에 메뉴나 페이지 이름을 넣어봤자 평생가도 메뉴를 구경할 수 없다. :)
- 출력되는 변수들은 샘플스킨을 참고.
- 페이지 하단의 <hr> 태그가 나왔다 안나왔다 제맘대로 이므로,
소스에서 이부분을 모두 찾아 없애주고, Footer쪽 함수출력부분에 <hr>을 넣어주면 쫌더 산뜻해 보일겁니다.
- 사용할 수 있는 메뉴 목록은 소스의 치환부분을 보세요. (-.-a)
- 허접하게 급조된거지만, 웬만큼 만들고자 하는 것은 모두 만들 수 있을 것입니다. 물론 푸터와 헤더의 위치를 맞바꿔버리는 엽기적인 짓거리도 소스수정을 하면 어느정도 가능합니다.(헤더부분을 모조리 전역변수로 두었기 때문에 치환되는 부분만 약간 추가해주면 메뉴를 아래로 나오게끔 할 수 있습니다.)
- EXTERN처럼 스킨을 사용하지 않고 원래의 화면으로 출력하고자 한다면 소스에서 액션 들어가기 직전에 아래의 구문을 넣어주면 됩니다.
$SkinStats = 0;
단점
- action=maintain이나 action=remotepage(리모트위키패치) action=link action=index 같은 것을 할 때, 원래는 메뉴나오고 그아래로 내용이 주루룩~ 흐르듯이 나왔는데, 스킨을 사용하면 브라우저가 본문뒤에 </table>태그가 나올때까지 기다렸다가 </table>태그가 떨어지자마자 한꺼번에 내용을 표시해주기 때문에 무겁다는 느낌이 들게 됩니다.
- 스킨 화일을 따로 불러들이고 치환까지 수행하기 때문에 속도도 당연히 느려집니다. 거기다가 화면에 내용을 뿌려주는 방식이 위와 같이 달라짐으로 해서 체감속도는 더 느려집니다.(action=remotepage의 경우에는 완전 극악입니다.)
- 혹시나 개선사항이나 문제점이 있다면 꼭(!) 알려주세요.
-
- 1. 들어갈 변수목록
-
-
- 1.1. 헤더
-
- 1.2. 본문
-
- 1.3. 푸터
-
2. 수정되거나 추가된 소스
-
-
- 2.1. 컨피그화일
-
- 2.2. 처음
-
- 2.3. 헤더
-
- 2.4. 본문/푸터
-
1. 들어갈 변수목록
- $SkinSiteLogo - 사이트로고 그림
- $SkinHeader - 페이지 제목
- $SkinMenuSiteName - 메뉴에 들어가는 사이트이름
- $SkinMenuHomePage - 메뉴에 들어가는 FrontPage
- $SkinMenuUserGotoBar2 - 사용자정의메뉴
- $SkinMenuUserGotoBar3 - 사용자정의메뉴
- $SkinMenuUserGotoBar4 - 사용자정의메뉴
- $SkinMenuIndex - 페이지목록
- $SkinMenuRecentChange - 최근변경내역
- $SkinMenuLinks - 링크목록
- $SkinMenuSearchForm - 검색입력창
- $SkinMenuSearch - 검색링크
- $SkinMenuPref - 환경설정
- $SkinMenuRandom - 랜덤페이지
- $SkinMenuHistory - 변경내역(메뉴에 붙는 것)
- $SkinMenuLogin - 로그인
- $SkinMenuAdmin - 관리자
- $SkinMenuUserGotoBar - 사용자정의메뉴
- $SkinMenuMain - 상위페이지링크
- $SkinMenuCurrentUser - 현재사용자
- $SkinMenuRemotePage - 원격위키페이지 받아오는 액션 링크
- $SkinPage - 페이지의 헤더/푸터 사이에 들어갈 페이지본문
- $SkinEditGuide - 페이지편집가이드(헤더가 불린 후에 페이지본문이 불리기 때문에 어쩔 수 없이 푸터로 들어가야된다.)
- $SkinFooter - $SkinPage이후 푸터에 들어가는 모든요소 (+ $SkinHeader에 들어가는 모든요소)
- $SkinGoTop - 페이지 위끝으로 올라가는 링크
2. 수정되거나 추가된 소스
$SkinFile = "./skin/skin.htm";
$UseSkin = 1;
- 환경변수 - 모두 전역변수. (헤더의 내용을 푸터에도 담을수 있게 하기 위함이다.)
use vars qw(@RcDays @HtmlPairs @HtmlSingle
....
## 추가 skin patch bab2
use vars qw($UseSkin $SkinFile);
## 추가 skin patch
....
## 추가 skin patch bab2
use vars qw($SkinHeaderFile $SkinFooterFile $SkinStats
$SkinSiteLogo $SkinHeader $SkinMenuSiteName
$SkinMenuHomePage $SkinMenuUserGotoBar2
$SkinMenuUserGotoBar3 $SkinMenuUserGotoBar4 $SkinMenuIndex
$SkinMenuRecentChange $SkinMenuLinks $SkinMenuSearchForm
$SkinMenuSearch $SkinMenuPref $SkinMenuRandom
$SkinMenuHistory $SkinMenuLogin $SkinMenuAdmin
$SkinMenuUserGotoBar $SkinMenuMain $SkinMenuCurrentUser
$SkinMenuRemotePage $SkinPage $SkinEditGuide $SkinFooter
$SkinGoTop); # for skin
## 추가 skin patch
- sub DoWikiRequest - GetSKin함수 로드.
sub DoWikiRequest {
....
$SkinStats = &GetSkin();
if (!&DoCacheBrowse()) {
eval $BrowseCode;
&InitRequest() or return;
if (!&DoBrowseRequest()) {
eval $OtherCode;
&DoOtherRequest();
}
}
}
- sub GetHtmlHeader - 사용자 설정에 따라 스킨사용을 결정한다.
sub GetHtmlHeader {
....
if (($UserData{'menulayout'})
|| (($UserID eq "113")
|| ($UserID eq "112")
|| ($UserID eq "")) && ($UseSkin)) {
} else {
$SkinStats = 0;
$SkinHeaderFile = "";
$SkinFooterFile = "";
}
if ($StyleSheet ne '') {
....
- sub GetSkin - 스킨화일을 읽어서 헤더와 푸터로 짜른다.
sub GetSkin {
my (@skintext);
my $skinTemp;
open(SKINFILE, "<$SkinFile") or return 0;
@skintext = <SKINFILE>;
$skinTemp = join('', @skintext);
($SkinHeaderFile, $SkinFooterFile) = split(/\$SkinPage/, $skinTemp);
close(SKINFILE);
return 1;
}
- sub BrowsePage - EXTERN사용시 스킨 끔.
sub BrowsePage {
....
if (substr($Text{'text'}, 0, 8) eq '#EXTERN ') {
$oldId = &GetParam('oldid', '');
$SkinStats = 0;
my ($externURL) = ($Text{'text'} =~ /\#EXTERN\s+([^\s]+)/);
....
- sub GetHeader - 스킨부분은 별도의 함수로부터 값을 받아온다.
sub GetHeader {
....
if ((&GetParam('InFrame','') eq '1') && (&UserIsAdmin())) {
$topMsg .= '('.Ts('%s includes external page',&GetEditLink($id,$id)).')';
$result .= $q->h3($topMsg) if (($oldId ne '') || (&GetParam('InFrame','') eq '1'));
} elsif ($SkinStats) {
$result .= &GetSkinHeader($id, $title, $oldId);
return $result;
}
....
}
- sub GetSkinHeader - 스킨을 사용할 때 불려질 헤더처리 함수.
sub GetSkinHeader {
my ($id, $title, $oldId) = @_;
my $logoImage = "";
my $result = "";
my $embed = &GetParam('embed', $EmbedWiki);
my $altText = T('[Home]');
$result .= $SkinHeaderFile;
if ((!$embed) && ($LogoUrl ne "")) {
$logoImage = "img src=\"$LogoUrl\" alt=\"$altText\" border=0 height=60 valign=middle";
$SkinSiteLogo = "<a accesskey=\"w\" href=\"$ScriptName?$TitlePage\">\n<$logoImage></a>";
}
if ($id ne '') {
$SkinHeader = &GetReverseLink($id);
} else {
$SkinHeader = $title;
}
$result .= &GetSkinGotoBar($id);
$result =~ s/\$SkinSiteLogo/$SkinSiteLogo/g;
$result =~ s/\$SkinHeader/$SkinHeader/g;
$result =~ s/\$SkinMenuSiteName/$SkinMenuSiteName/g;
$result =~ s/\$SkinMenuHomePage/$SkinMenuHomePage/g;
$result =~ s/\$SkinMenuUserGotoBar2/$SkinMenuUserGotoBar2/g;
$result =~ s/\$SkinMenuUserGotoBar3/$SkinMenuUserGotoBar3/g;
$result =~ s/\$SkinMenuUserGotoBar4/$SkinMenuUserGotoBar4/g;
$result =~ s/\$SkinMenuIndex/$SkinMenuIndex/g;
$result =~ s/\$SkinMenuRecentChange/$SkinMenuRecentChange/g;
$result =~ s/\$SkinMenuLinks/$SkinMenuLinks/g;
$result =~ s/\$SkinMenuSearchForm/$SkinMenuSearchForm/g;
$result =~ s/\$SkinMenuSearch/$SkinMenuSearch/g;
$result =~ s/\$SkinMenuPref/$SkinMenuPref/g;
$result =~ s/\$SkinMenuRandom/$SkinMenuRandom/g;
$result =~ s/\$SkinMenuHistory/$SkinMenuHistory/g;
$result =~ s/\$SkinMenuLogin/$SkinMenuLogin/g;
$result =~ s/\$SkinMenuAdmin/$SkinMenuAdmin/g;
$result =~ s/\$SkinMenuUserGotoBar/$SkinMenuUserGotoBar/g;
$result =~ s/\$SkinMenuMain/$SkinMenuMain/g;
$result =~ s/\$SkinMenuCurrentUser/$SkinMenuCurrentUser/g;
$result =~ s/\$SkinMenuRemotePage/$SkinMenuRemotePage/g;
return $result;
}
- sub GetSkinGotoBar - 스킨모드에서 sub GetSkinGotoBar 대신 사용될 함수.
sub GetSkinGotoBar {
my ($id) = @_;
my ($main, $bartext);
$bartext = "";
$SkinMenuSiteName = &T("<b>"."$SiteName"."</b>");
$SkinMenuHomePage = &GetPageLink($HomePage);
if ($UserGotoBar2 ne '') {
$SkinMenuUserGotoBar2 = &GetPageLink($UserGotoBar2);
}
if ($UserGotoBar3 ne '') {
$SkinMenuUserGotoBar3 = &GetPageLink($UserGotoBar3);
}
if ($UserGotoBar4 ne '') {
$SkinMenuUserGotoBar4 = &GetPageLink($UserGotoBar4);
}
$SkinMenuIndex = &ScriptLink("action=index", T('Index'));
$SkinMenuRecentChange = &GetPageLink(T($RCName));
$SkinMenuLinks = &ScriptLink("action=links", T('Links'));
$SkinMenuSearchForm = &GetFormStart() . &GetSearchForm() . $q->endform;
$SkinMenuSearch = &GetPageLink(&T('Search'));
$SkinMenuPref = &GetPrefsLink();
if (&GetParam("linkrandom", 0)) {
$SkinMenuRandom = &GetRandomLink();
}
$SkinMenuHistory = &GetHistoryLink($id, T('History'));
if (($UserID eq "113") || ($UserID eq "112") || ($UserID eq "")) {
$SkinMenuLogin = &ScriptLink("action=login", T('Login'));
} else {
$SkinMenuLogin = &ScriptLink("action=logout", T('Logout'));
}
if (&UserIsAdmin()) {
$SkinMenuAdmin = &ScriptLink("action=editlinks", T('Admin'));
}
if ($UserGotoBar ne '') {
$SkinMenuUserGotoBar = $UserGotoBar;
}
if ($id =~ m|/|) {
$main = $id;
$main =~ s|/.*||;
$SkinMenuMain .= "<img src=\"$EmoticonPath/msn/thumbs_up.gif\" border=\"0\" alt=\""
. T('Main Page:') . " $main\" align=\"absmiddle\">" . &GetPageLink($main);
}
if (($UserID ne "") && ($UserID ne "112") && ($UserID ne "113")) {
$SkinMenuCurrentUser .= &T('Current User :')." ".&ScriptLink($UserID,$UserID)."\n";
} else {
$SkinMenuCurrentUser .= &T('Current User :')." ".$ENV{REMOTE_ADDR}."\n";
}
if (&UserIsAdmin() && $UseRemoteWiki) {
$SkinMenuRemotePage .= &ScriptLink("action=remotepage", &T("\.Get Remotepages\."))." ";
}
if (&GetParam('InFrame','') eq '') {
$bartext .= "\n<div align=right><a accesskey=\"z\" name=#PAGE_TOP href=#PAGE_BOTTOM>"
. T('[▼]') . "</a></div>\n";
}
return $bartext;
}
- sub GetEditGuide - 편집가이드를 $SkinEditGuide에 저장하여 footer에서 사용 가능하게 해준다.
sub GetEditGuide {
....
if ($SkinStats) {
$SkinEditGuide = $result;
return "";
}
return $result;
}
- sub GetMinimumFooter - 스킨을 사용할 경우 별도의 스킨처리 함수를 불러들인다.
sub GetMinimumFooter {
....
if ($SkinStats) {
$SkinGoTop = $result;
$result = &GetSkinMinimumFooter;
} elsif ($FooterNote ne '') {
$result .= T($FooterNote);
}
$result .= $q->end_html;
return $result;
}
- sub GetSkinMinimumFooter - 스킨을 사용할 경우 별도의 스킨처리 함수를 불러들인다.
sub GetSkinMinimumFooter {
my $footer_note = T($FooterNote);
$SkinFooterFile =~ s/\$SkinGoTop/$SkinGoTop/g;
$SkinFooterFile =~ s/\$SkinFooter/$footer_note/g;
$SkinFooterFile =~ s/\$SkinMenuSiteName/$SkinMenuSiteName/g;
$SkinFooterFile =~ s/\$SkinEditGuide/$SkinEditGuide/g;
$SkinFooterFile =~ s/\$SkinFooter/$footer_note/g;
return $SkinFooterFile;
}
정말 이대로 해버려도 되는건지 모르겠습니다.
이걸 적용시킬 누군가가 분명히 피를 볼 것 같은 불길한 예감..;; -_-; --
Bab2 2003-3-8 12:35 am
좀만 더 손대면... 아싸~ ㅡ,.ㅡ --
Bab2 2003-3-10 7:07 pm
GetEditGuide, DoEdit를 함 손대봐야겠네요 -_-; --
Bab2 2003-3-11 12:51 am
- 포기 -_-;;
--
Bab2 2003-3-11 1:12 pm
의견받습니다.
스킨좀 만들어주세요. ㅜㅡ
기본적으로
또는
이렇게 해서, 위에 명시한 변수들을 원하는 위치에 집어넣으면 됩니다.
EMBED 는 어떻게 처리하게 되죠?
- 어떤종류의?? EmbedWiki변수는 선언되면 그냥 원래상태 그대로 처리하게 했습니다만.. 한거도 아니죠 그냥 원래 그렇게 처리가 되게끔 되어 있으니 ㅡ,.ㅡ;;;
--
Bab2 2003-3-12 1:31 am
- 핫. EXTERN을 쓴다는게 EMBED를 썼습니다. -_-; DateBk5매뉴얼 같은 페이지의 경우를 어떻게 할지 궁금하네요. 좀 많이 고쳐야 하지 않을까 걱정이 되는군요.
- 아.. 그쪽은 일단 포기했습니다. ㅡ.,ㅡ;; 원래 생각했던게 지금처럼 헤더랑 푸터부분만 치환을 할 것인가. 와 WikiReqest관련부분을 모조리 찾아내서 각 함수를 개별적으로 치환할 것인가(이게 더 완전합니다) 인데, 후자의 경우는 출력되는 거의 모두를 손대야 하기 때문에 그냥 넘어가기로 한거죠.(그래서 전자의 방법으로 스킨 소스를 만들었죠,) 아마도 EXTERN 매크로는 제대로 나오지 않을 겁니다. 내일 저녁쯤에 한번 보도록 하죠. 아침이랑 오후에는 친구놈 일도와주러 가야되기 때문에 ㅡ.,ㅡ;; (취직좀 시켜주세요...ㅜㅡ)
--
Bab2 2003-3-12 2:37 am
덮어씌울수 있도록 다시 만들어 봤습니다. 하는김에 유즈모드 ext1.38a를 따로 받아서 같이 수정했습니다.
[위키본체], [컨피그], [샘플스킨], [샘플스킨2]
--
Bab2 2003-3-12 11:31 pm
위키위키분류