Home> Internet >  MovableType >  ブログ記事投稿ユーザーのコンテクスト

ブログ記事投稿ユーザーのコンテクスト

現在進行中の案件では、コミュニティ・ソリューションをベースに構築を行なってます。

ユーザーに対してカスタムフィールドで情報を追加してやって、それを記事一覧や、コメント一覧で表示しようと思っても、実はそれを行うブロックタグはMTには存在しません。

ユーザーコンテクストを生成するプラグイン

ブログ記事の投稿ユーザーに関するMTMLタグは「<$MTEntryAuthor$>」「<$MTEntryAuthorDisplayName$>」「<$MTEntryAuthorEmail$>」「<$MTEntryAuthorID$>」「<$MTEntryAuthorLink$>」「<$MTEntryAuthorNickName$>」「<$MTEntryAuthorURL$>」「<$MTEntryAuthorUsername$>」「<$MTEntryAuthorUserpic$>」「<MTEntryAuthorUserpicAsset>」「<$MTEntryAuthorUserpicURL$>」です。沢山あるのに大半はファンクションタグであり、ブロックタグとして登録ユーザーのコンテクストを生成するタグは存在しません。
Movable Typeでブログ記事投稿ユーザーの情報を取得するEntryAuthorDataプラグイン: 小粋空間」を使うことで、ブログ記事投稿ユーザーのコンテクストが生成できます。

記事内には、MTタグで投稿ユーザーのコンテクストを生成する方法として、以下が書いてありますが、コレは必ずしもうまくいかないのではと思います。

<mt:Entries>
 <$mt:EntryAuthorDisplayName setvar="name"$>
 <mt:Authors display_name="$name">
  <$mt:AuthorBasename$>
 </mt:Authors>
</mt:Entries>

[Movable Typeでブログ記事投稿ユーザーの情報を取得するEntryAuthorDataプラグイン: 小粋空間:(2012年4月22日 18:56:31 引用)]

コレが成り立つためには、EntryAuthorDisplayNameNULLを許容せずに、かつuniqueである必要があるものと思いますが、同一の表示名を登録可能なようですし、説明文にもあるように入力しないことも可能なようです。

セキュリティ上の理由により、ユーザー設定で表示名の設定が無い場合、何も表示されません。

[MTEntryAuthorDisplayName | テンプレートタグリファレンス:(2012年4月22日 19:19:00 引用)]

さてコメント投稿ユーザーのコンテクストは以下のプラグインで取得できます。
Comment Author Context | MovableType.org - Home of the MT Community

入手元が「plugins.movabletype.org」だけなので、そのうち入手できなくなるかも知れませんね。

また詳細は不明(詳しい追跡調査を行なっていませんが)なのですが、どうもこのプラグインを入れると、パスワードの変更に影響が出るようですし、「ユーザー」メニューを開く操作もおかしな動きになってしまうようです。特に後の方は、MT5.1への対応の問題ではないでしょうか。(最終的には後述の方法を使いプラグインは使用しなくなりました。)

ダイナミックパブリッシングでうまくいかない

さて、とりあえず、プラグインで処理する方向で進めていたのですが、途中でアーカイブの分割処理(DynamicMTMLによるアーカイブのページ分割・これは後日別エントリーにします)や、コメント欄でのログイン中のカレントユーザーの表示部分など、幾つかダイナミックパブリッシングで処理する箇所が出てきて、上記プラグインで対応できない部分があることが発覚しました。

まぁ、ダイナミックパブリッシングプラグインを書くという選択肢もあるわけですが、もう一度標準のMTタグだけで同じ処理ができないか考えてみました。
ユーザーのコンテクストはやはり、MTAuthorsを使って出力する以外なさそうです。
またMTAuthorsには残念ながら、特定のユーザーを指定するのにid指定を行うなどは出来ないようで、display_name指定で読む以外の方法はなさそうでした。
会社のエンジニアから指摘されましたが、MTAuthorsにはアンドキュメンテッドなモディファイアとしてidが指定できるっぽいです。確かに動作しました。だとしたら、EntryAuthorIDで取得したユーザーIDを使って、直接MTAuhorsでユーザーのコンテクストになりますね。
という訳で、MTAuthorsでdispaly_name(+追加指定)を指定し、ユーザー候補を読み込んだ後で、ユーザーのID(ブログ記事投稿者のIDやコメント投稿者のIDを取得するタグは存在する)により、対象ユーザーを確定する方法を取ることにしました。まぁ今回の案件では表示名の設定が必須になるように、登録画面に制限を加えていることもあり、display_nameである程度の絞り込みが出来るわけですが、これを指定しない状態で1000ユーザーや10000ユーザーを対象とした場合に、実用に耐えられるかはチョット問題ありそうですね。やはり最初のブロックタグである程度件数が絞り込めてないと、スケールアップしていった時に対応できなくなりそうです。(そういや、このモディファイア「display_name=""」とした場合は表示名を設定していないユーザーのみの絞込みになるんだろうか?)

<MTEntryAuthorID setvar="author_id">
<MTEntryAuthorDisplayName setvar="display_name">
<MTAuthors need_entry="1" display_name="$display_name">
 <MTIf tag="AuthorID" eq="$author_id">
  <$mt:AuthorBasename$>
 </MTIf>
</MTAuthors>

こんな感じでどうにかなるのではないかと。
投稿された記事を表示するコンテクスト内で使用するものなので、少しでも対象を絞り込めるように「need_entry="1"」も指定してあります。その他ロールなど特定の条件が存在するならそれも追加したほうがよさそうですね。ここは、いかにMTAuthorsブロック内のループ回数を減らすかが、安定運用のキモになってくるはずです。

<MTCommenterID setvar="commnter_id">
<MTCommentAuthor setvar="commenter_name">
<MTAuthors display_name="$commenter_name" need_entry="0" any_type="1">
 <MTIf tag="AuthorID" eq="$commnter_id">
  <$mt:AuthorBasename$>
 </MTIf>
</MTAuthors>

コメントの方も同じくこんな感じで処理できると思います。ただ、まだるっこしいですね。

MT5.2への要望

という訳で、MT5.2への要望です。
上記のように、実は基本的なMTタグで欠けているものがあります。MT5.1でのMTEntryPrimaryCategoryの様に、コレを待ち望んでいたんだというのが多々あるはずです。
ぜひ、ブログ記事の投稿ユーザーのコンテクストを生成する、MTEntryAuthorContextタグと、同じくコメントの投稿ユーザーコンテクストを生成する、MTCommnetUserContextの、MT本体への実装をご検討ください。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2280

Home> Internet >  MovableType >  ブログ記事投稿ユーザーのコンテクスト

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top