view action 추가 및 잠긴 페이지의 소스를 볼 수 있게 함
- $EditAllowed = 0 일 때 로그인하지 않은 사용자의 경우나, 특정한 페이지가 잠겨 있는데 관리자 권한이 없는 사용자의 경우 등 페이지를 수정할 수 없는 경우는 페이지 소스 자체를 보는 것 조차 불가능하다.
- WikiX 에서처럼, 수정 권한이 없더라도 페이지 소스를 보는 것은 가능하게 하였다.
- 소스를 보는 것조차 금지하고 싶은 페이지도 있지 않겠는가..라고 할 수가 있겠는데, diff 만 봐도 소스의 일부분 또는 전부가 드러나고, 어차피 최종 html 출력을 보면 그만이기 때문에 굳이 막는 것이 의미가 없다고 판단하였다.
- 필수 요구 사항 : 없음
- 선택 요구 사항 : 없음
- 사용법 :
- 이 패치를 적용하면, 기존에 "This page is read-only (이 페이지는 수정이 불가능합니다)" 라고 나오던 자리에 "View text of this page (페이지 소스 보기)" 란 링크가 나온다. 이 링크를 클릭하면 페이지 소스를 볼 수 있다.
- 마우스를 더블 클릭했을 때 역시, 페이지 수정 권한이 있는지 여부에 따라서 자동으로 편집 창 또는 소스 보기 창을 띄워준다. (따라서 /마우스더블클릭 패치는 더 이상 유용하지 않다)
- 부작용 : 테스트하는 동안에는 별다른 문제가 발견되지는 않았다.
- /마우스더블클릭 패치에서 편집 권한이 있을 때만 더블 클릭이 통하게 했던 것을 되돌림
sub GetHtmlHeader {
...
$bodyExtra .= qq(ondblclick="location.href='$ScriptName?action=edit&id=$id'");
...
}
- 편집 가이드에서 기존에는 읽기 전용이라고 메시지만 나왔던 것을 링크가 걸리도록 수정
sub GetEditGuide {
...
if (&UserCanEdit($id, 0)) {
if ($rev ne '') {
$result .= &GetOldPageLink('edit', $id, $rev,
Ts('Edit revision %s of this page', $rev));
} else {
$result .= &GetEditLink($id, T('Edit text of this page'));
}
} else {
if ($rev ne '') {
$result .= &GetOldPageLink('edit', $id, $rev,
Ts('View revision %s of this page', $rev));
} else {
$result .= &GetEditLink($id, T('View text of this page'));
}
}
$result .= "</DIV>";
...
}
- DoEdit 함수를 고쳐 준다. 주석문을 참조하여 바뀐 곳을 찾아서 고쳐 줄 것. 중간 중간에 보면 원래의 코드를 if 문으로 둘러싼 부분들이 있다. 앞뒤 괄호가 맞게 추가되는지 잘 살피지 않으면 나중에 에러가 날 수 있으니 주의
sub DoEdit {
my ($id, $isConflict, $oldTime, $newText, $preview) = @_;
my ($header, $editRows, $editCols, $userName, $revision, $oldText);
my ($summary, $isEdit, $pageTime);
my $canEdit = &UserCanEdit($id,1);
&OpenPage($id);
&OpenDefaultText();
$pageTime = $Section{'ts'};
$header = Ts('Editing %s', $id);
$header = Ts('Viewing %s', $id) if (!$canEdit);
$revision = &GetParam('revision', '');
$revision =~ s/\D//g;
if ($revision ne '') {
&OpenKeptRevisions('text_default');
if (!defined($KeptRevisions{$revision})) {
$revision = '';
} else {
&OpenKeptRevision($revision);
$header = Ts('Editing revision %s of', $revision) . " $id";
$header = Ts('Viewing revision %s of', $revision) . " $id" if (!$canEdit);
}
}
$oldText = $Text{'text'};
if ($preview && !$isConflict) {
$oldText = $newText;
}
$editRows = &GetParam("editrows", 20);
$editCols = &GetParam("editcols", 65);
print &GetHeader('', &QuoteHtml($header), '');
if (!$canEdit) {
if (&UserIsBanned()) {
print T('Editing not allowed: user, ip, or network is blocked.');
print "<p>";
print T('Contact the wiki administrator for more information.');
} else {
print Ts('Editing not allowed: %s is read-only.', $id);
}
print "<br>\n";
}
if ($canEdit && ($revision ne '')) {
print "\n<b>"
. Ts('Editing old revision %s.', $revision) . " "
. T('Saving this page will replace the latest revision with this text.')
. '</b><br>'
}
if ($canEdit && $isConflict) {
$editRows -= 10 if ($editRows > 19);
print "\n<H1>" . T('Edit Conflict!') . "</H1>\n";
...
var w = window.open(s, "Help", "width=500,height=400, resizable=1, scrollbars=1");
w.focus();
}
//-->
</script>
|;
if ($canEdit) {
print T('Editing Help :') . " ";
use vars qw(@HelpItem);
require mod_edithelp;
foreach (0 .. $#HelpItem) {
print &HelpLink($_, T("$HelpItem[$_]"));
print " | " if ($_ ne $#HelpItem);
}
print "<br>\n";
}
print &GetFormStart("form_edit");
if ($canEdit) {
print &GetHiddenValue("title", $id), "\n",
&GetHiddenValue("oldtime", $pageTime), "\n",
&GetHiddenValue("oldconflict", $isConflict), "\n";
if ($revision ne "") {
print &GetHiddenValue("revision", $revision), "\n";
}
print &GetTextArea('text', $oldText, $editRows, $editCols);
$summary = &GetParam("summary", "*");
...
&GetTextArea('newtext', $newText, $editRows, $editCols),
"<p>\n";
}
} else {
print $q->textarea(-class=>'view', -accesskey=>'i', -name=>'text',
-default=>$oldText, -rows=>$editRows, -columns=>$editCols,
-override=>1, -style=>'width:100%', -wrap=>'virtual',
-readonly=>'true');
}
print "<hr class='footer'>\n";
if ($preview) {
...
print &GetMinimumFooter();
}
Notes
그냥 DoEdit 함수를 수정해서, 수정권한이 없으면 DoEdit 내에서 다시 DoView 를 호출하게 한다면 기존에 GetEditLink 가 들어간 부분들을 일일이 GetEditLink 또는 GetViewLink 로 분기하도록 고치지 않아도 되었을 것이다. 그렇지만 수정 권한이 없더라도 edit 로 링크가 걸리게 하고 싶은 경우도 있을 것이라 생각했고, 결정적으로 수정 권한이 있는 경우와 없는 경우에 각각 링크가 걸리는 안내문 자체가 달라져야 하기 때문에 어쨌거나 if 문이 추가되어야 했다. 뭐... 그렇다는 얘기. 여전히 DoEdit 또는 하다못해 GetEditLink 자체를 수정해서 권한 여부에 따라 DoEdit 또는 DoView 를 자동으로 결정하게 하고 싶은 유혹이 강하다.. 어느게 좋으려나...
소스용량을 생각한다면 그냥 권한여부에 따라서 버튼만 막는게 좋을거 같네요. 지금 BCN에서 디지털맨이라는 영화 상영중 --v
- ^^; 그 생각도 했었는데... DoEdit 가 생긴게 복잡해 보여서 건드리기 싫었고, action=edit 를 했을 때는 명확히 거부된다는 것을 보이는 게 더 모양새도 좋아 보이더라고요. 용량은 뭐... 도움말하고 환경변수 초기화 루틴을 빼면서 10KB 정도를 벌고 이걸로 3.7KB 정도 늘었으니 뭐.. ^_^ 그리고 어쨌거나 링크를 거는 시점에서 텍스트가 바뀌어야 하니 if 문도 들어가야 되겠고요. (아니면 말씀하신 것처럼 구현한 후에 링크 자체를 "수정 또는 소스 보기" 라고 이름을 붙일까요? 으음..
- 음... 아무래도 말씀하신 것처럼 하는 게 낫겠습니다. 짧게 고치고 끝낼 수 있는 방법을 놔두고 굳이 이렇게 할 필요가 없을 것 같네요. 다시 고치죠 뭐...
- 편집불가메세지는 일단 소스보기로 대체하고 편집화면에서 편집불가임을 알리는 메세지를 넣어주는게 좀 더 친절해 보일듯 싶네요. 개인적으로 WikiX에서 처음 소스보기 눌러보고 느낀 것이었습니다.
위의 내용대로 소스를 재수정했습니다. action=edit 했을 때 편집권한이 없다면 기존에는 편집 불가 메시지가 출력되고 끝났는데, 여기서는 페이지 소스를 read-only 로 볼 수 있게 했습니다.