UseModWiki소스수정/스킨 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: UseModWiki소스수정/스킨 는 읽기 전용 페이지입니다.
== 사용자 스킨 지원 == * 말그대로 스킨입니다. * WikiX패치처럼 사용자가 스킨사용여부를 선택가능하게 함. * config.pl에서 기본스킨사용설정 선택가능. \\ (스킨기능을 끄고 켜는 것이 아니라, 손님에게 기본적으로 어떤 화면을 보일지를 선택하는 것입니다. \\ 스킨을 아예 사용하지 않으려면 config.pl에서 헤더/푸터경로를 공란으로 두면 됩니다.) * 테이블로 씌워 스킨을 구성할 경우 페이지본문을 기준으로 || 헤더 || 본문 || 푸터 || 식으로 만들어야 한다. ** 함수로딩순서가 '''htmlheader->사이트로고/페이지이름링크->메뉴판->페이지본문->htmlfooter''' 로 고정되어 있고, htmlheader부터 메뉴판까지 서로 얽히고 설켜있기 때문 ** 따라서 푸터에 메뉴나 페이지 이름을 넣어봤자 평생가도 메뉴를 구경할 수 없다. :) * 출력되는 변수들은 샘플스킨을 참고. * 페이지 하단의
태그가 나왔다 안나왔다 제맘대로 이므로, \\ 소스에서 이부분을 모두 찾아 없애주고, Footer쪽 함수출력부분에
을 넣어주면 쫌더 산뜻해 보일겁니다. * 사용할 수 있는 메뉴 목록은 소스의 치환부분을 보세요. (-.-a) * 허접하게 급조된거지만, 웬만큼 만들고자 하는 것은 모두 만들 수 있을 것입니다. 물론 푸터와 헤더의 위치를 맞바꿔버리는 엽기적인 짓거리도 소스수정을 하면 어느정도 가능합니다.(헤더부분을 모조리 전역변수로 두었기 때문에 치환되는 부분만 약간 추가해주면 메뉴를 아래로 나오게끔 할 수 있습니다.) * EXTERN처럼 스킨을 사용하지 않고 원래의 화면으로 출력하고자 한다면 소스에서 액션 들어가기 직전에 아래의 구문을 넣어주면 됩니다. {{{#!vim perl $SkinStats = 0; }}} = 단점 = * action=maintain이나 action=remotepage(리모트위키패치) action=link action=index 같은 것을 할 때, 원래는 메뉴나오고 그아래로 내용이 주루룩~ 흐르듯이 나왔는데, 스킨을 사용하면 브라우저가 본문뒤에 태그가 나올때까지 기다렸다가 태그가 떨어지자마자 한꺼번에 내용을 표시해주기 때문에 무겁다는 느낌이 들게 됩니다. * 스킨 화일을 따로 불러들이고 치환까지 수행하기 때문에 속도도 당연히 느려집니다. 거기다가 화면에 내용을 뿌려주는 방식이 위와 같이 달라짐으로 해서 체감속도는 더 느려집니다.(action=remotepage의 경우에는 완전 극악입니다.) ---- * 혹시나 개선사항이나 문제점이 있다면 꼭(!) 알려주세요.
== # 들어갈 변수목록 == === # 헤더 === *
$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 - 페이지 위끝으로 올라가는 링크
== # 수정되거나 추가된 소스 == === # 컨피그화일 === * config.pl {{{#!vim perl ## 추가 skin patch bab2 $SkinFile = "./skin/skin.htm"; # 스킨경로 $UseSkin = 1; # 0=스킨안사용, 1=스킨사용 ## 추가 skin patch }}} === # 처음 === * 환경변수 - 모두 전역변수. (헤더의 내용을 푸터에도 담을수 있게 하기 위함이다.) {{{#!vim perl 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함수 로드.
{{{#!vim perl sub DoWikiRequest { .... ## 추가 skin patch bab2 $SkinStats = &GetSkin(); ## 추가 skin patch if (!&DoCacheBrowse()) { eval $BrowseCode; &InitRequest() or return; if (!&DoBrowseRequest()) { eval $OtherCode; &DoOtherRequest(); } } } }}} *
sub GetHtmlHeader - 사용자 설정에 따라 스킨사용을 결정한다.
{{{#!vim perl sub GetHtmlHeader { .... ## 추가 skin patch bab2 if (($UserData{'menulayout'}) || (($UserID eq "113") || ($UserID eq "112") || ($UserID eq "")) && ($UseSkin)) { } else { $SkinStats = 0; $SkinHeaderFile = ""; $SkinFooterFile = ""; } ## 추가 skin patch if ($StyleSheet ne '') { .... }}} *
sub GetSkin - 스킨화일을 읽어서 헤더와 푸터로 짜른다.
{{{#!vim perl ## 함수 통째로 추가. sub GetSkin { my (@skintext); my $skinTemp; open(SKINFILE, "<$SkinFile") or return 0; @skintext =
; $skinTemp = join('', @skintext); ($SkinHeaderFile, $SkinFooterFile) = split(/\$SkinPage/, $skinTemp); close(SKINFILE); return 1; } }}} *
sub BrowsePage
- EXTERN사용시 스킨 끔. {{{#!vim perl sub BrowsePage { .... if (substr($Text{'text'}, 0, 8) eq '#EXTERN ') { $oldId = &GetParam('oldid', ''); ## 추가 skin patch bab2 $SkinStats = 0; ## 추가 skin patch my ($externURL) = ($Text{'text'} =~ /\#EXTERN\s+([^\s]+)/); .... }}} === # 헤더 === *
sub GetHeader
- 스킨부분은 별도의 함수로부터 값을 받아온다. {{{#!vim perl 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')); ## 추가 skin patch bab2 } elsif ($SkinStats) { $result .= &GetSkinHeader($id, $title, $oldId); return $result; ## 추가 skin patch } .... } }}} *
sub GetSkinHeader
- 스킨을 사용할 때 불려질 헤더처리 함수. {{{#!vim perl ## 함수 통째로 추가 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 = "
\n<$logoImage>
"; } 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 대신 사용될 함수.
{{{#!vim perl ## 함수 통째로 추가. sub GetSkinGotoBar { my ($id) = @_; my ($main, $bartext); $bartext = ""; $SkinMenuSiteName = &T("
"."$SiteName"."
"); $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|/.*||; # Only the main page name (remove subpage) $SkinMenuMain .= "
" . &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
" . T('[▼]') . "
\n"; } return $bartext; } }}} === # 본문/푸터 === *
sub GetEditGuide - 편집가이드를 $SkinEditGuide에 저장하여 footer에서 사용 가능하게 해준다.
{{{#!vim perl sub GetEditGuide { .... ## 수정/추가 skin patch bab2 if ($SkinStats) { $SkinEditGuide = $result; return ""; } ## 수정/추가 skin patch return $result; } }}} *
sub GetMinimumFooter
- 스킨을 사용할 경우 별도의 스킨처리 함수를 불러들인다. {{{#!vim perl sub GetMinimumFooter { .... ## 수정/추가 skin patch bab2 if ($SkinStats) { $SkinGoTop = $result; $result = &GetSkinMinimumFooter; } elsif ($FooterNote ne '') { ## 수정/추가 skin patch $result .= T($FooterNote); # Allow local translations } $result .= $q->end_html; # 이것이