コメント

コメントの表示方法を変えたり、URL を入力したら自動的にリンクされるようにする方法について記述します。

takanori

フラット化

目次

概要[overview]

plone では最初からアイテムにコメントがつけられる機能(discussion)が存在します。

このコメントがつけられる機能を使用して議論してもらうためには、以下の点が気になります。

  • コメントがネストできる。(いい点でもあるが、最新のコメントがどれかわからなくなります。)
  • ネストしたコメントはタイトルしか表示されず、内容がわからない。(赤丸で囲んだ部分)

    Nested comments

    (ちなみに plone 2.1 ではネストしたコメントの中身も表示されるように変わっています。)

そこで、コメントに対してのコメントを書き込めないようにし、結果的にコメントをフラットにします。

フラット化[flat]

コメントをフラットにするためには、そもそもコメントにぶらさがった(ネストした)コメントを作成できなくすればよいのです。

そこで、各コメントの下の「これに返答」ボタン(赤丸で囲んだ部分)を表示しないようにします。

Add comment to comment

このボタンを表示しないようにするために plone_templates/viewThreadsAtBottom をカスタマイズします。

カスタマイズする場所は、下記のコメントの本文を表示している場所です。:

    <div class="commentBody"
         tal:content="structure reply/CookedBody">
         This is the body text of the comment.
    </div>

その下にある、<form name="reply" から </form> までが これに返答 ボタンを表示している部分なので、この部分をまとめて削除します。:

    <form name="reply"
          action="discussion_reply_form"
          method="post"
          style="display: inline;"
          tal:attributes="action string:${reply/absolute_url}/discussion_reply_form"
          tal:condition="python:checkPermission('Reply to item', reply)">

        <input class="standalone"
               type="submit"
               value="Reply to this"
               i18n:attributes="value"
               />
    </form>

すると下記のように、各コメントの下の これに返答 ボタンが表示されないようになります。

Disable add comment button

また、コメントのみを表示するときに使用される plone_content/discussionitem_view についてもカスタマイズを行います。

ここでは、ボタンとネストしたコメントが表示されないようにするために、下記の行を削除します。:

    <metal:block use-macro="here/viewThreadsAtBottom/macros/discussionView" />

以上で、コメントのネストがされずフラットなコメントしか作成できなくなります。なお、すでにネストされたコメントが存在する場合はどうにもならないので、削除するが気にしないようにしてください。

ページ化

目次

概要[overview]

plone では最初からアイテムにコメントがつけられる機能(discussion)が存在します。

このコメントがつけられる機能を使用して議論する場合、多数のコメントがついても1ページに全てのコメントが表示されるため、ページが長くなり見づらくなります。 (下の画像の右側に表示されているスクロールバーを見ると、ページの長さがわかります)

A lot of comments

ページ対応[page]

ページ対応は以下のような仕様で実装します。

  • 10コメントごとにページとしてまとめ表示をする。
  • 前後のページに移動できるようにする。
  • 初期表示時は最新のコメントが表示されるように最後のページにする。

コメントのページ単位表示を行うために、 フラット化 でも使用した plone_templates/viewThreadsAtBottom をさらにカスタマイズします。

初期状態ではコメントを取得する部分は下記のように記述されていて、単純に repeat でループして全権を表示しています。:

    <tal:getreplies repeat="reply python:portal.sort_modified_ascending(
                                         portal_discussion.getDiscussionFor(here).getReplies())">
      <!-- コメント表示部分 -->
    </tal:getreplies>

この部分を PloneBatch を使用して、10件単位で表示するように変更します。:

    <tal:getreplies define="results python:portal.sort_modified_ascending(
                                           portal_discussion.getDiscussionFor(here).getReplies());">
      <div tal:condition="results"
           tal:define="Batch python:modules['Products.CMFPlone'].Batch;
                       b_size python:10;
                       b_start python:(len(results) - 1) / b_size * b_size;
                       b_start request/b_start | b_start;
                       batch python:Batch(results, b_size, int(b_start), orphan=1);">
        <div metal:use-macro="here/batch_macros/macros/navigation" />
        <div tal:repeat="reply batch">
          <!-- コメント表示部分 -->
        </div>
      </div>
    </tal:getreplies>

上記のコードでは、b_size に1ページごとのコメントの件数を設定し、python:(len(results) - 1) / b_size * b_size の部分で初期表示時の開始位置を計算しています。

例えば、32件のコメントがついているアイテムの場合、以下のようにコメントが4ページに分かれて表示されるようになります。

1ページ目 2ページ目
Page 1 Page 2
3ページ目 4ページ目(初期表示)
Page 3 Page 4

自動リンク化

plone では各アイテムにコメントをつけることができますが、基本的にコメントはテキストのみです。

そこで、URL っぽい文字列を入れたら勝手にリンクしたりとか、ISBN(国際標準図書番号)を入力したら amazon へのリンクをはったりとかするようにしました。

目次

できること[goal]

コメントで下記のような記述をすると、自動的にリンクがはられるようになります。

  • http://takanory.net のように URL を書く → http://takanory.net
  • www.asahi.com のように www. からはじまる URL を書く → www.asahi.com
  • ftp.ring.gr.jp/pub/ のように ftp. からはじまる URL を書く → ftp.ring.gr.jp/pub/
  • foo@takanory.net のようにメールアドレスを書く → foo@takanory.net
  • id:XXXXXX と書く → その plone のメンバーのホーム(/Members/XXXXXX)にリンク
  • isbn:4756146090 と書籍の番号を書く → isbn:4756146090 (amazon の商品へリンク)
  • asin:B000BL84JM と amazon の商品コードを書く → asin:B000BL84JM
  • "すらど":http://slashdot.jp/ のように構造化テキストっぽく書く → すらど
  • "plone ロゴ":img:http://plone.org/logo.jpg のように構造化テキストっぽく書く → plone ロゴ

DiscussionTool.py を書き換え[discussion]

コメントの処理は CMFPlone/DiscussionTools.py の中で行っているのですが、これを書き換えます。

書き換えは ZMI からではなくソースコードを直接編集します。

まず、頭の方にあとで作成するコメント処理用の関数を import します。

変更前

from Products.CMFCore.utils import format_stx
from DocumentTemplate.DT_Util import html_quote

変更後

from Products.CMFCore.utils import format_stx
from DocumentTemplate.DT_Util import html_quote
from utils import comment_parser

次に、コメントを表示用に処理する部分で、import した comment_parser を使用するように変更します。

変更前は、html_quote を通して、改行があったら <br> タグに変更してました。:

    elif text_format == 'plain':
        reply.text = text
        reply.cooked_text = html_quote(text).replace('\n','<br>')

変更後は、その代わりに自作の comment_parser でコメントを処理するようになってます。:

    elif text_format == 'plain':
        reply.text = text
        reply.cooked_text = comment_parser(text)

comment_parser 作成[parser]

utils.py のソースコードをダウンロードして、CMFPlone の下におきます。

その後 zope を再起動して、修正した DiscuttionTools.pyutils.py を zope に読み込ませます。

あとはためしにコメント書いたりして、リンクが作成されるか確認してください。

また、utils.py を見てもらえばわかるのですが、変換処理は基本的にこんな感じで単純です。

  1. 正規表現でパターンマッチ
  2. パターンがみつかったら置換
  3. 同じパータンにパッチするものがないか探す
  4. なくなるまでさがしたら次のパターンに

なので、それぞれの環境にあわせて、マッチする正規表現を変えたり、あたらしいパターンを追加したりとかもできると思います。

参考[reference]

下記のサイトとコードを参考にしました。