ページ化

コメントは初期状態ではネストされて全部まとめて表示されるので、これを平坦にし10コメントごとページを分けて表示するようにします。

takanori

目次

概要[overview]

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

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

A lot of comments

ページ対応[page]

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

コメントのページ単位表示を行うために、 フラット化 でも使用した 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