Movable Type 備忘録

 

 ハッシュ変数を使って最近のタグ一覧表示

こんばんわ^^

先日、MTCollate プラグインを使って最近のタグ一覧を表示する方法をご紹介しました。

今回はわたしのとこで配布するテンプレートセットでできる限りプラグインを使用しないよう検討してまして、MTCollate プラグインを使用しないで最近のタグ一覧を実装したのでご紹介です ( ̄∇ ̄)/

MTCollate プラグインは結構古くから(わたしが Movable Type を使う前から)あったものでして、MT4.1 でもかろうじて使えてますが何せ古過ぎます。
とっても便利なプラグインでなかなか重宝するのですが、この先も使えるかといったらグレーです。だって配布元がプラグインの更新してないんだもん (´Д`;)

そんな経緯から MTCollate プラグインを使用せず、デフォルトタグで最近のタグ一覧を表示させることにしたんです。
運よく Movable Type 4.1 からハッシュがサポートされたので MTCollate と同じようなことをデフォルトタグでやってっみました。

Movable Type 4.1 の新機能について、以下にちょっとだけ引用します。

MT4.1 ではたくさんのテンプレートタグが追加・強化されました。ちょっとマニアックな話になりますが、プログラム言語のような変数処理 (SetVar, SetVarBlock など) 追加されたデータ形式 (ハッシュ、配列) ループ構造 (Loop) やコントロールフロー (If, ElseIf, ELse, Unless) といった役割りのテンプレートタグを利用すれば、その可能性はもっと大きくなります。Movable Type 4.1 の新機能

で、最近のタグ一覧を表示するために使用したタグは、MTSetVarBlock と MTLoop タグです。

いつものことながら上記マニュアルはわたしにとっては理解に苦しみます (; ̄∇ ̄A
実例で説明してもらえると理解しやすいと思うんですよねぇ。

ということで、わたしなりに理解した範囲で説明してみたいと思います (●>∀<●)/

ハッシュについて

MTSetVarBlock や MTSetVar、MTLoop ブロックタグでハッシュが使えれるようになったといってますね。
これは MTSetVarBlock や MTSetVar を配列として扱い、MTLoop で配列に設定した値を参照したり、ソートしたりできるようになったということです。

配列といっても普通の配列ではなくって、連想配列(ハッシュ)として扱うことができるところがポイントです ( ̄∇ ̄)b

普通の配列なら以下のようになります。

array[0] = 'aaaa';
array[1] = 'bbbb';
array[2] = 'cccc';

上記のように普通の配列は添え字(インデックス)に番号(0、1...n)を指定して、値をセットしたり参照したりします。
以下は連想配列です。

array[ 'Keyword1' ] = 'aaaa';
array[ 'Keyword2' ] = 'bbbb';
array[ 'Keyword3' ] = 'cccc';

上記のように配列の添え字にキーワード(文字列)などを指定して、値をセットしたり参照したりできます。もちろん番号を指定することもできます。
MTSetVarBlock ブロックタグなどは、上記のようなハッシュ(連想配列)が使えるようになったわけです (; ̄∇ ̄A

ハッシュを使ってみる

では実際に使ってみます。
以下のコードを適当なインデックステンプレート内にコピー & ペーストして再構築してみてください。

<ul>
<MTEntries lastn="20">
    <MTIfNonEmpty tag="MTEntryCategory">
        <MTSetVarBlock name="cat"><$MTEntryCategory decode_html="1" remove_html="1"$></MTSetVarBlock>
        <li><$MTGetVar name="cat"$></li>

        <MTIf name="array">
<MTSetVar name="array" key="$cat" value="1" op="++">
<MTElse>
<MTSetVar name="array" key="$cat" value="1">
</MTIf>
    </MTIfNonEmpty>
</MTEntries>
</ul>

<MTLoop name="array">
    <p><MTGetVar name="__key__"> (<MTGetVar name="__value__">)</p>
</MTLoop>

上記コードは、最近のエントリ 20 件分で使用されたカテゴリの使用率をカウントするコードです。

大事なところは青い字の部分になります。
ハッシュテーブル(配列)のキーや値は、予約変数 __key__、__value__ にセットされるので、その変数を使って表示してます。

上記コードはカンタンにいうと、以下のようなことをやっています。

array[ 'category' ] = array[ 'category' ] + 1;
array[ 'template' ] = array[ 'template' ] + 1;
array[ 'movabletype' ] = array[ 'movabletype' ] + 1;
                   :
                   :
array[ 'template' ] = array[ 'template' ] + 1;

連想配列 array の添え字として、カテゴリ名 'category'、'template'、'movabletype' をキーとし、カテゴリが使用された分だけ値をインクリメント(加算)していくというものです。

ざっくりと説明しましたがわたしの説明で分かりますかね (; ̄∇ ̄A

MTSetVarBlock と MTLoop で最近のタグ一覧表示

では、本題の最近使用されたタグ一覧(タグクラウド)を表示するには以下になります。

<MTTags>
    <MTSetVarBlock name="tags"><$MTTagName$></MTSetVarBlock>
<MTSetVarBlock name="sorthash" key="$tags"><$MTTagLastUpdated format="%Y%m%d%H%M%S"$></MTSetVarBlock>
    <MTSetVarBlock name="tag_count" key="$tags"><$MTTagCount$></MTSetVarBlock>
    <MTSetVarBlock name="tag_rank" key="$tags"><$MTTagRank max="6"$></MTSetVarBlock>
    <MTSetVarBlock name="tag_date" key="$tags"><$MTTagLastUpdated format="%Y-%m-%d"$></MTSetVarBlock>
</MTTags>
<ul id="tags" class="tag_list">
<MTLoop name="sorthash" sort_by="value numeric reverse">
<MTIf name="__counter__" le="20">
        <li class="rank-<MTGetVar name="tag_rank" key="$__key__">
widget-list-item" 
            title="<MTGetVar name="__key__">:<MTGetVar name="tag_count" key="$__key__">:<MTGetVar name="tag_date" key="$__key__">">
            <a href="<$MTTagSearchLink$>"><MTGetVar name="__key__"></a></li>
    </MTIf>
</MTLoop>
</ul>

青い字の部分で、まずすべてのタグをハッシュテーブル(配列)に格納します。 その際、ソート用(sorthash)、タグカウント用(tag_count)、タグランク用(tag_rank)、タグ最終更新日用(tag_date)のハッシュテーブルにそれぞれ、タグ名称をキーとして設定値をセットします。

赤い字の部分でソート用ハッシュテーブル(sorthash)の値(最終更新日)でソートして、結果を最大 20 件分まで表示しています。

そうすると、sorthash テーブルの値でソートしたことで右図のようにイメージになります。
あとは、タグカウント用(tag_count)、タグランク用(tag_rank)、タグ最終更新日用(tag_date)をキーをきっかけに値を抽出すればいいことになります ( ̄∇ ̄)b

何となくハッシュの使い方は分かっていただけたでしょうか (; ̄∇ ̄A
わたしの説明がへたっぴなのは今に始まったわけじゃないので許してくださいね。

ハッシュを自由自在に使えるようになれば、バラエティにとんだデータの表示の仕方が可能になるかと思います。

以上です。

 Trackback Pings(2)

from まいう〜の鮹語録

おぉぉ!これはフォローしとかねばならんですばい。 先日「MT4分からんことだらけ」という記事で新着順のタグクラウドについて言及しましたが、何でもプラグイン...

from Open MagicVox.net

 SEO を考えた場合,ページの meta ヘッダには,そのページ内容を表す概要文(description)やキーワード(keywords)を設定するこ...

 Comments(4)

#1: Posted by oscar Author Profile Page [RES]

すごーく、お久しぶりです。

そもそもプログラム書かない人には、ハッシュって馴染み無いですよねぇ。
実際の説明見て、ああ配列なんだってやっと解った。
私もこれって、MTCollateキラーかって思ってましたよ。
ただ「重複削除ってどうやるのかな」と、漠然と考えてます。
複数キーの同時ソートは、なんかできそうな気がしてるんですけどね。

#2: Posted by bzbell Author Profile Page [RES]

>>1 oscar さん

ご無沙汰してます。
つい先日までは記事の方も更新されてなかったことからお忙しいんでしょうねあせあせ

Dakiny さんとこで、oscar さんが今執筆されてる!? というような記事を見ました!!
すっごいですねキャハハ
公私共に充実!? してるようで何よりですうぅ~ん
※先日 oscar さんとこでコメントしたらエラーで弾かれちゃいましたグウグウ

> そもそもプログラム書かない人には、ハッシュって馴染み無いですよねぇ。

確かにそうかもですね。わたしも PHP 覚える前まではハッシュポテトなら知ってますが・・・みたいな感じでしたからあせあせ

> ただ「重複削除ってどうやるのかな」と、漠然と考えてます。

重複!? oscar さんどんなことをやろうとしてるんですか!?
oscar さんの構想を教えていただければ、わたしもお手伝いしますやあ!

#3: Posted by oscar Author Profile Page [RES]

>>2 bzbell さん

>※先日 oscar さんとこでコメントしたらエラーで弾かれちゃいました
ごめんなさい。どうもthrottle絡みがおかしな状態みたいです。手の打ちようがなくて、次の手を考えてる最中です。

>重複!? oscar さんどんなことをやろうとしてるんですか!?
MTCollateって重複削除やりませんでしたか。
最近はあまり重い処理やらなくなって、忘れちゃったんですが。

>Dakiny さんとこで、oscar さんが今執筆されてる!? というような記事を見ました!!
一生懸命追い込んでるところです。

#4: Posted by bzbell Author Profile Page [RES]

>>3 oscar さん

> ごめんなさい。どうもthrottle絡みがおかしな状態みたいです。手の打ちようがなくて、次の手を考えてる最中です。

そうなんですか。前にデータベースの調子が悪いようなこと言われてたのと、しばらく更新なかったことで一時期サイト閉じたのかと思ってましたよあせあせ

> MTCollateって重複削除やりませんでしたか。
> 最近はあまり重い処理やらなくなって、忘れちゃったんですが。

なるほどっ!! そういう使い方もありですねっ!!
確かに重複チェックできますねキャハハ
でも、パッと考えた限り重複チェックして弾きたい用途って思い浮かばないです。

 Post a Comment

コメント用フィード