アクションの出力をカスタマイズする

mixiのMovable Typeのコミュニティで、以下の質問がありました。

MTStreamActionタグが出力する内容で、「××は○○(記事名)にコメントしました」というActionがあるのですが、MTにログインしてないユーザのコメントの場合、××の部分がMTの管理者の名前になってしまうようです。

MTStreamActionタグを使わずに、タグを組み合わせてアクションの情報をカスタマイズして出力するようにすれば、この問題を解決することができます。
その方法を紹介します。

1.MTStreamActionタグの動作

MTStreamActionタグは、個々のアクションについて収集した情報を、標準で用意されている書式で出力する働きをします。
大半のアクションでは、収集される情報と、標準の書式は、ActionStreamsプラグインのstreams.yamlファイルに定義されています(「plugins」→「ActionStreams」ディレクトリの「streams.yaml」ファイル)。
また、ブログ記事の投稿やコメントの受信などのアクションでは、CommunityActionStreamsプラグインのconfig.yamlファイル(「plugins」→「CommunityActionStreams」ディレクトリの「config.yaml」ファイル)。

例えば、Twitterのfavoritesでは、収集する情報と標準の書式は、以下のように定義されています。
「html_params」が収集する情報で、「html_form」が標準の書式です。

html_form: '[_1] saved <a href="[_2]">[_3]''s tweet</a>, "[_4]" as a favorite'
html_params:
    - url
    - tweet_author
    - title

html_form内の[_1]~[_4]が、html_paramsの1番目~4番目に置き換えられます。
ただし、上の例のように、html_paramsの数が1つ足りない場合は、[_1]はユーザー名に置き換えられ、[_2]以降がhtml_paramsに置き換えられます。
上の例だと、MTStreamActionタグでは、以下のようなHTML(を日本語に翻訳したもの)が出力されます。

ユーザー名 saved <a href="メッセージのURL">メッセージを投稿したユーザーの名前's tweet</a>, "メッセージの内容" as a favorite

2.タグを組み合わせてメッセージを出力する

MTStreamActionタグを使わずに、他のテンプレートタグを組み合わせて、メッセージを出力することもできます。
アクションの情報を出力するテンプレートタグには、以下の表のものがあります。

テンプレートタグ動作
MTStreamActionTitleアクションのタイトル(html_paramsのtitleの情報)を出力します。
MTStreamActionViaアクションの詳細ページのアドレス(html_paramsのurlの情報)を出力します。
MTStreamActionVarhtml_paramsの中から、任意の情報を出力します。
出力する情報は、「name="情報名"」のモディファイアで指定します。

3.アクションの種類の判別

アクションの種類によって、出力できる情報の種類は異なります。
また、アクションの種類によって、出力の書式も変える必要があります。
これらのことから、MTStreamActionTitleタグ等を使ってアクションの情報を出力する場合は、アクションの種類を判別することが必要になります。

MTActionStreamsタグのブロックの中では、「action_type」という変数で、アクションの種類を調べることができます。
action_typeの値は、「サービス名」と「アクション名」を「_」で結んだ値になります。

サービス名とアクション名は、ActionStreamsプラグインのstreams.yamlファイルから得ることができます。
streams.yamlファイルでは、各サービスの設定を以下のような書式で記述しています。

サービス名:
    アクション名:
        アクションの各種の設定
    アクション名:
        アクションの各種の設定
    ・・・

例えば、Twitter関連の設定は、以下のように記述されています。

twitter:
    statuses:
        name: Tweets
        ・・・
    favorites:
        name: Favorites
        ・・・

したがって、MTActionStreamsタグのブロックの中で、MTStreamActionTitleタグ等を使ってtwitterのメッセージ(statuses)の情報を出力したい場合は、以下のように書きます。

<mt:ActionStreams>
  ・
  ・
  ・
  <mt:If name="action_type" eq="twitter_statuses">
    Twitterのメッセージの情報を出力する部分
  </mt:If>
  ・
  ・
  ・
</mt:ActionStreams>

また、ブログ記事やコメント等の情報は、CommunityActionStreamsプラグインで保存されています。
これらの情報では、サービス名は「community」で、アクション名は「entries」や「comments」などになります。
アクション名の詳細は、CommunityActionStreamsプラグインのconfig.yamlファイル(「plugins」→「CommunityActionStreams」ディレクトリの「config.yaml」ファイル)を見れば分かります。

4.コメント等の情報を出力する

MTActionStreamsタグのブロックの中で、以下のようなブロックタグを使うことができます。
これらのタグを使うと、アクションがブログ記事の投稿/コメントの投稿/ユーザーの注目のいずれかであれば、その情報を詳細に出力することができます。

ブロックタグ内容
MTStreamActionEntryアクションがブログ記事の投稿であれば、そのブログ記事に関する情報を出力します。
このタグのブロックの中では、MTEntryTitle等のMTEntry系のタグを使って、ブログ記事の情報を出力することができます。
MTStreamActionCommentアクションがコメントの投稿であれば、そのコメントに関する情報を出力します。
このタグのブロックの中では、MTCommentBody等のMTComment系のタグを使って、コメントの情報を出力することができます。
MTStreamActionFollowedアクションがFollow(誰かを注目した)であれば、Followに関する情報を出力します。
このタグのブロックの中では、MTAuthorName等のMTAuthor系のタグを使って、注目したユーザーの情報を出力することができます。

5.コメントした人の名前を正しく出力する

ここまでの話に基づいて、コメントした人の名前を正しく出力するには、MTActionStreamsタグのブロックの中で以下のような手法をとります。

  • 1.action_type変数の値が「community_comments」かどうかを調べ、アクションの種類を判断します。
  • 2.1.が成立していれば、MTStreamActionCommentタグのブロックを使って、そのコメントの情報を出力します。
  • 3.1.が成立していなければ、MTStreamActionタグを使って、標準の書式でアクションの情報を出力します。

ちなみに、当方のブログでは、アクションストリームを以下のようなタグで出力しています。
3行目のMTIfタグで、アクションの種類がコメントであるかどうかを判断します。
コメントであれば4行目に進み、MTComment系のタグを組み合わせて、コメントの情報を出力します。
一方、コメントでなければ6行目に進み、MTStreamActionタグを使って、標準の書式でアクションの情報を出力します。

<mt:ActionStreams lastn="15">
    <li class="hentry service-icon service-<mt:var name="service_type">">
<mt:If name="action_type" eq="community_comments">
        <span class="entry-content"><mt:StreamActionComment><$mt:CommentAuthorLink default_name="(匿名)" show_email="0"$><mt:IfNonEmpty tag="CommentAuthorIdentity"> <$mt:CommentAuthorIdentity$></mt:IfNonEmpty>が<mt:CommentEntry><a href="<$mt:CommentLink$>"><$mt:EntryTitle encode_html="1"$></a></mt:CommentEntry>にコメントしました</mt:StreamActionComment></span><br />
<mt:Else>
        <span class="entry-content"><mt:StreamAction smarty_pants="1"></span><br />
</mt:If>
        <span class="published"><mt:StreamActionDate format="%Y-%m-%d %H:%M:%S"></span>
    </li>
</mt:ActionStreams>

6.参考

モーションテンプレートセットのメインページのテンプレートでは、上で述べた手法を使って、タイムライン中でブログ記事/コメント/注目の情報だけ、他のアクションとは違った書式で出力するようになっています。
アクションの出力方法の参考として、見ておくと良いでしょう。