Discussionプラグイン

ページにコメント欄を追加する。pagelistプラグインが必要。

セキュリティ上の注意

Dokuwikiの設定で「HTML埋め込み」「PHP埋め込み」が有効になっている状態で、Discussionプラグインの設定で「コメント内でもwiki文法を許可」すると、任意のJavaScriptやPHPコードを実行されてしまうため、どちらかは必ず無効にしておく。

スパム対策

DiscussionプラグインはCAPTCHAプラグインまたはreCAPTCHAプラグインを組み込みでサポートしているため、インストールするだけでコメントフォームに人間であることを確認するための文字入力欄が作られる。

逆に言うと、プラグインが入っていながら使わずにいることは出来ない。

CAPTCHAプラグイン

CAPTCHAプラグインのデフォルト設定は「Text (prefilled with JavaScript)」で、これは閲覧者のJavaScriptが有効なら入力欄を出さず、本来入力すべき文字のコピーを勝手に行ってくれる。スパムボットの多くはJavaScriptを解釈しないためこれでもまぁまぁ有効で、かつ閲覧者に余計な手間をかけさせない仕様となっている。入力欄が現れないが、裏ではちゃんと効いているので安心しよう。

「image」にすると、よくある、ゆがんだ文字とダミーの線が入った画像が生成される。これには、サーバのPHPにGD拡張がインストールされている必要がある。

@pagesではGD拡張をサポートしていて、実際にテスト用のPHPコードを書いても問題なく使えた。だが、何故かCAPTCHAプラグインで「image」にしても画像が生成されない問題が生じている(500 errer)。前回も画像関係で表示されないことがあったが、その時は時間をおけば自然になおっていたため、今回もしばらく置いてみる。

reCAPTCHAプラグイン

reCAPTCHAはgoogleが提供しているスパム避けシステム。ここでアカウント登録してキーを取得し、Dokuwikiの設定画面にコピーする必要があるが、実装は楽。だが、単なるWikiのスパム避けにはちょっと物々しすぎるか。

CAPTCHAの画像が生成されない問題から、ひとまずはreCAPTCHAを使う事にする。

メールアドレス欄廃止

メールアドレス入力を求められると、コメントしたくても躊躇しちゃう。というわけでそれを消したい。

でも完全に存在を消してしまうと、他の部分でメール欄の内容を取得しようとした時にエラーになる可能性がある。メール欄にまつわる処理全てを書き換えるのは困難なので、表示だけ消すと同時に、空白でも投稿可能に変える。

action.phpからメールアドレス欄に関わる部分を非表示。

action.php
854
855
856
857
858
859
<div class="comment_mail" style="display:none;">
  <label class="block" for="discussion__comment_mail">
    <span><?php echo $lang['email'] ?>:</span>
    <input type="text" class="edit<?php if($_REQUEST['comment'] == 'add' && empty($_REQUEST['mail'])) echo ' error'?>" name="mail" id="discussion__comment_mail" size="50" tabindex="2" value="<?php echo hsc($_REQUEST['mail'])?>" />
  </label>
</div>

メール欄空白チェック無効。http://pastebin.com/kqaAQv1vを参考に。

action.php(変更前)
240
241
242
243
if(empty($_REQUEST['name']) or empty($_REQUEST['mail'])) return; // don't add anonymous comments
if(!mail_isvalid($_REQUEST['mail'])) {
    msg($lang['regbadmail'], -1);
    ...
action.php
240
241
242
243
if(empty($_REQUEST['name'])) return; // don't add anonymous comments
if(!empty($_REQUEST['mail']) && !mail_isvalid($_REQUEST['mail'])) {
    msg($lang['regbadmail'], -1);
    ...

script.js
35
36
37
38
39
40
41
42
43
/* この部分をコメントアウト
if (isBlank(form.mail.value) || form.mail.value.indexOf("@") == -1){
    form.mail.focus();
    form.mail.style.backgroundColor = '#fcc';
    return false;
} else {
    form.mail.style.backgroundColor = '#fff';
}
*/

スタイル調整

コメントフォームを見ると、なんか[保存][プレビュー]ボタンの下がやけに空いてる。

これはプレビューの表示域なのだが、スタイル指定に「visibility: hidden」はあるものの「display: none」がないため、プレビューを表示していない時もスペース分だけ空けて表示されてしまっている。1)

プラグインのJavaScriptでは、プレビューを表示しなくてよい時はdisplay: noneを指定するようになっている。試しに一旦プレビューを表示→再度非表示にすると、ちゃんと下部のスペースもなくなる。要はJavaScriptが呼ばれない、最初の指定だけが足りないようだ。

dokuwiki\conf\userstyle.cssに追加。ついでにフォーム上部のマージンも縮める。

1
2
3
4
5
6
7
8
9
10
/* discussion plugin */
div.dokuwiki div#discussion__comment_preview {
    display: none;
}
div.dokuwiki div.comment_form {
    margin-top: 0.5em !important;
}
#comment_wrapper > h2 {
    margin-bottom: 0;
}

また、コメント入力欄もちょっと縦に長すぎるので、縮める。<textarea>タグのrows=“10”→“4”くらいに。

FirefoxやChromeならテキストエリアの大きさをユーザが変えられるから、いっぱい入力する時は広げてもらうってことで…。

action.php
917
918
919
920
<textarea class="edit<?php if($_REQUEST['comment'] == 'add' && empty($_REQUEST['text'])) echo ' error'?>" name="text" cols="80" rows="4" id="discussion__comment_text" tabindex="5"><?php
  if($raw) {
      echo formText($raw);
  ...

1)
visibility: hiddenは表示は消すが、本来表示されるはずだったスペースは残す。display: noneはスペースも消す。
dokuwiki/plugin/discussion.txt · 最終更新: 2016/08/01 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0