3
2
1

投票機能のような形でいいね!機能を使いたいと思っています。

子ページでいいね!された数をページ毎に親ページで表示することはマクロ等で可能でしょうか?

    Commentコメントを追加...

    1 回答

    1.  
      2
      1
      0

      関連QA

       

      標準でできるとして、Page Properties Report Macro でShow Likes Countカラムを追加すれば表示されますが

      https://confluence.atlassian.com/doc/page-properties-report-macro-186089616.html

      ソートができないんですね。

       

      あとは本家の以下Answersに参考SQL、ユーザーマクロが多数あるので参考になるかと思います。

      like テーブルに入っているので、content テーブルと連携させて、それを集計するのが良いかと思います

       

      ユーザーマクロでもできるとは思いますが、実装にもよりますが集計処理は基本的に重くなる傾向なので…

      別処理にして静的コンテンツにしたほうがいいと思います。

       

      https://marketplace.atlassian.com/plugins/org.swift.confluence.sql/server/overview

      https://marketplace.atlassian.com/plugins/org.swift.confluence.sqlexpress/server/overview

      https://marketplace.atlassian.com/plugins/de.scandio.confluence.plugins.pocketquery/server/overview

      的なアドオンを導入すればSQLを実行した結果をそのまま表示もできます。

       

      いいね(Like)でソートしてくれるアドオンだと以下ですかね。

      https://marketplace.atlassian.com/plugins/precog.favoritesextension/server/overview

       

      あとはSQLの結果取得、集計結果を REST API 使ってConfluenceのページ更新する...

      みたいなスクリプトを作って自動化できると最高ですね。

      (情報) 参考:https://www.ricksoft.jp/document/blog/view-blog-post.action?pageId=180715661

       

      標準機能で集計できることは少ないですが、技術的には色々なやり方ができるかもしれません。

      参考になりましたら幸いです。

      1. 蒼龍

        上記方法を参考にして、ページIDさえ分かればそのページのいいねの数を表示できそうです。

        後はページIDを指定したら子ページの情報を配列のような形で取得できればやりたいことが実現できそうなのですが、指定したページIDから子ページの情報(タイトルやID等)を取得するようなことはユーザーマクロで可能でしょうか?

      2. Kengo Ohsaki

        指定したページIDから子ページの情報(タイトルやID等)を取得するようなことはユーザーマクロで可能でしょうか?

        可能です。たぶん以下のような感じになります。

        ## @param page:title=ページ名|type=confluence-content|required=true|desc=ページ名を指定してください。
        #set($containerManagerClass = $content.class.forName('com.atlassian.spring.container.ContainerManager'))
        #set($getInstanceMethod = $containerManagerClass.getDeclaredMethod('getInstance',null))
        #set($containerManager = $getInstanceMethod.invoke(null,null))
        #set($containerContext = $containerManager.containerContext)
        #set($likeManager= $containerContext.getComponent('likeManager'))
        #set($pageManager=$containerContext.getComponent('pageManager'))
        #set ($ss='')
        #set ($sp='')
        #foreach ($p in $parampage.split(":"))
           #if ($ss=='')
            #set ($ss=$p)
           #else
            #set ($sp=$p)
           #end
        #end
        #if ($sp=='')
          #set ($sp=$ss)
          #set ($ss=$space.key)
        #end
        #set($page  = $pageManager.getPage($ss ,$sp))
          <table class="confluenceTable" width="1100px">
            <tr>
              <th class="confluenceTh" width="220px" style="text-align:center;">ページ名</th>
              <th class="confluenceTh" width="220px" style="text-align:center;">いいね</th>
           </tr>
        #foreach($p in $page.getChildren())
        <tr>
                <td class="confluenceTd">$p.getTitle() </td>
                <td class="confluenceTd">$likeManager.countLikes($p)</td>
        </tr>
        #end
        </table>

        上記は指定したページの子だけですが、子孫すべてが必要であれば

        $page.getChildren() を $pageManager.getDescendants($page) に変更すれば
        指定したページの子孫すべてになります。

        各種リファレンスについては以下を参照ください。

         

        ユーザーマクロについては以下ドキュメントを参照ください。

      3. 蒼龍

        想定通りの動作です!

        ありがとうございました!

         

      4. Kengo Ohsaki

        蒼龍-san,

        参考になりましたら幸いです。

        あとは、お気に入り等でソートしたいとかある場合は・・

        Velocity側でのソートするのは面倒なので

        JavaScript側でtableをソートするようなのを実装したほうがいいと思います。

        そのほうがソートにも柔軟性が持たせれるるかと思います。

      Commentコメントを追加...