はじめての DynamicMTML #04 - ログイン状態で分岐する MTIfLogin

今回は、DynamicMTML を利用して、ユーザーのログイン状態によって表示を変える方法を紹介します。

この方法を利用すれば、会員専用サイトを構築したり、会員のみに見せる特別なコンテンツを設置したりすることができます。

MTIfLogin タグ

MTIfLogin タグは、ユーザーが Movable Type にログインしている状態のときに、その中身を表示するブロックタグです。このタグの中では、MTAuthor 関連のタグが利用できます。

早速サンプルで見てみます。今回も、ブログのテーマは「クラシックブログ」を利用します。

ログイン時のみブログ記事の編集画面へのリンクを表示する

最初のサンプルでは、ブログ記事のページにおいて、ログインしているときだけ、そのブログ記事の編集画面へのリンク(「この記事を編集する」)を表示させてみます。

まず、ブログ記事の編集画面のリンクは、次のようなテンプレートタグで書き出します。

<a href="<$mt:CGIPath$><mt:AdminScript>?__mode=view&amp;_type=entry&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryID$>">この記事を編集する</a>

このテンプレートをログインしているユーザーにのみ表示させるようにするには、全体を MTIfLogin タグで囲みます。

<mt:IfLogin>
<a href="<$mt:CGIPath$><mt:AdminScript>?__mode=view&amp;_type=entry&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryID$>">この記事を編集する</a>
</mt:IfLogin>

ただし、これをそのままテンプレートに貼り付け再構築しても、MTIfLogin タグもその中身も何も表示されません。DynamicMTML でログイン分岐を実現するには、MTIfLogin タグそのものをファイルに出力する必要があります。

MTIfLogin タグをそのまま出力するには、前回の記事にあるように、全体を MTDynamicMTML タグで囲んでしまえば簡単です。MTDynamicMTML タグは、そのタグ内全体の MT タグをそのままファイルに出力するブロックタグです。上記の例で言えば、MTIfLogin タグ内の a 要素内についてもダイナミックに処理されることになります。

しかし、ここで少し考えてみてください。今回の例のように、a タグについてはダイナミックで処理する必要はなく、MT タグを使わずに直接 URL 等を書いてもまったく問題ありません。つまり、そのような部分については再構築時に MT タグを展開してしまって良いということになります。

したがって、この例で言えば、MT タグのまま出力する必要があるのは、MTIfLogin タグだけになります。このような場合は、前回の記事の2番目に紹介した MTML タグを用いて出力すれば良いということになります。つまり、この部分は、次のようなテンプレートになります。

<mtml tag='mt:IfLogin'>
<a href="<$mt:CGIPath$><mt:AdminScript>?__mode=view&amp;_type=entry&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryID$>">この記事を編集する</a>
<mtml tag='/mt:IfLogin'>

これをテンプレートモジュールの「ブログ記事の概要」の13〜16行目の MTUnless ブロックタグの後に挿入します。なお、セパレータ用の span 要素を追加しています。

<mt:Unless name="hide_counts" eq="1">
<mt:IfCommentsActive><span class="separator">|</span> <a href="<$mt:EntryPermalink$>#comments"><$mt:EntryCommentCount singular="コメント(1)" plural="コメント(#)" none="コメント(0)"$></a></mt:IfCommentsActive>
<mt:IfPingsActive><span class="separator">|</span> <a href="<$mt:EntryPermalink$>#trackbacks"><$mt:EntryTrackbackCount singular="トラックバック(1)" plural="トラックバック(#)" none="トラックバック(0)"$></a></mt:IfPingsActive>
</mt:Unless>
<mtml tag='mt:IfLogin'>
<span class="separator">|</span> <a href="<$mt:CGIPath$><mt:AdminScript>?__mode=view&amp;_type=entry&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryID$>">この記事を編集する</a>
<mtml tag='/mt:IfLogin'>

さらに、アーカイブテンプレートの「ブログ記事」の50〜52行目の MTIfPingsActive ブロックタグの後に同じように挿入します。

<mt:IfPingsActive>
<span class="separator">|</span> <a href="<$mt:EntryPermalink$>#trackbacks"><$mt:EntryTrackbackCount singular="トラックバック(1)" plural="トラックバック(#)" none="トラックバック(0)"$></a>
</mt:IfPingsActive>
<mtml tag='mt:IfLogin'>
<span class="separator">|</span> <a href="<$mt:CGIPath$><mt:AdminScript>?__mode=view&amp;_type=entry&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryID$>">この記事を編集する</a>
<mtml tag='/mt:IfLogin'>

ブログ全体を再構築すれば完了です。これで、ユーザーがログイン状態であれば、そのブログ記事の編集画面へのリンク(「この記事を編集する」)が表示されます。

startup-dymtml-13

会員専用サイトを構築する

次のサンプルでは、会員専用のページを作ってみます。

この場合は、「ログインしている人に見せる情報 又は ログインしていない人に見せる情報」という条件分岐になります。これは、MTIfLogin タグと MTElse タグを組み合わせて行います。

MTIfLogin 〜 MTElse

今回は、サンプルとして、ブログ記事の詳細はログインしている人にしか見せず、ログインしていない人はサインインの画面へのリンクを表示するサイトを作ってみます。

なお、サインイン画面への URL は、ブログ記事コンテキストの中では次のような MT タグで表現できます。

<$mt:CGIPath$><$mt:CommentScript$>?__mode=login&blog_id=<$mt:BlogID$>&return_url=<$mt:EntryPermalink encode_url="1"$>

これを考慮して、条件を満たすように MTIfLogin タグを組むと、次のような構成になります。

<mt:IfLogin>
ログインしている人が見られるコンテンツ
<mt:Else>
<p><a href="<$mt:CGIPath$><$mt:CommentScript$>?__mode=login&blog_id=<$mt:BlogID$>&return_url=<$mt:EntryPermalink encode_url="1"$>">サインインしてください。</a></p>
</mt:IfLogin>

ではテンプレートをカスタマイズしてみます。

ブログのアーカイブテンプレートの「ブログ記事」の 33 行目の「<div id="alpha-inner">」の直後に MTIfLogin タグを挿入し、94 行目の div#alpha-inner の閉じタグ「</div>」の直前に MTElse 〜 /MTIflogin タグを挿入します。

なお、DynamicMTML のために、先ほどのように、MTIfLogin タグと MTElse タグを、それぞれ MTML タグで出力するようにします。

<div id="alpha">
<div id="alpha-inner">
<mtml tag='mt:IfLogin'>
元のテンプレート(省略)
<mtml tag='mt:Else'>
<p><a href="<$mt:CGIPath$><$mt:CommentScript$>?__mode=login&blog_id=<$mt:BlogID$>&return_url=<$mt:EntryPermalink encode_url="1"$>">サインインしてください。</a></p>
<mtml tag='/mt:IfLogin'>
</div>
</div>

このテンプレートを [保存と再構築] してます。このままサインアウトせずに、ブログのトップページから、適当なブログ記事を表示させてみると、普通に表示されていると思います。

startup-dymtml-14

次に、管理画面に戻り、一度サインアウトします。その後、先ほどのブログ記事のページをリロードしてみます。すると、次のように「サインインしてください。」との文言になるはずです。

startup-dymtml-15

そのリンク先でサインインすれば、元のブログ記事のページに戻ります。これで完了です。

  • このエントリーをはてなブックマークに追加
Just a second...