これは「Movable Type Advent Calendar 2018」、「MTAppjQuery Advent Calendar 2018」の24日目の記事です。
今年も Movable Type 一筋の一年でしたが、みなさんはいかがでしたか。今回は、MT7 を導入できない環境で、コンテンツタイプっぽい実装を MTAppjQuery を使って実装した話を紹介します。
目標
MT7 のテーマ「Jungfrau」では、「イベント・セミナー」コンテンツの中を作成する際に、「講師」コンテンツ・データを選択します。MT6 の環境でも同様に、別に登録した「講師」情報を使って、「イベンt・セミナー」ページを作成できるようにすることが目標です。
必要なもの
実装するにあたり、以下が必要です。MTAppjQuery はコア機能といっても過言ではないですね。
- Movable Type 6.3
- MTAppjQuery 1.11.0
「講師」ブログの作成
最初に、「講師」ブログを作成します。ここでは、講師情報をブログ記事で管理することとします。
- 「会社名」や「役職」、「プロフィール写真」等の属性を、カスタムフィールドで登録します。
- 「ブログ記事アーカイブテンプレート」は作成しません。
「ブログ記事アーカイブテンプレート」を作成しない点が、最初のポイントです。講師情報(ブログ記事)のステータスを公開状態にしても、アーカイブで何も出力されません。また、MTEntries を利用して講師情報(ブログ記事)を取得できるわけです。
「セミナー」ブログの作成
次に、「セミナー」ブログを作成します。ここでは、セミナー情報をブログ記事で管理することとします。
「開催日時」や「会場」等の属性を、カスタムフィールドで作成します。この際に、「講師」も次表のように追加します。
項目 | 内容 |
---|---|
名前 | 講師 |
種類 | テキスト |
ベースネーム | seminarspeaker |
テンプレートタグ | SeminarSpeaker |
MTAppjQuery の設定
user.js について、MT のテンプレートで管理します。加えて「講師」ブログの更新をトリガーにして再構築するように設定します。この環境で、user.js に以下のように記述します。「講師」ブログのブログ ID を 5、「セミナー」ブログのブログ ID を 6 として解説します。
<mt:SetVarTemplate name="_list">
<mt:Entries blog_ids="5" sort_by="authored_on" sort_order="ascend" limit="99999">
'<mt:EntryID />': '<mt:EntryTitle encode_js="1" />'<mt:Unless name="__last__">,</mt:Unless>
</mt:Entries>
</mt:SetVarTemplate>
if (mtappVars.blog_id == "6") {
if (mtappVars.screen_id == 'edit-entry') {
$.MTAppMultiCheckbox({
basename: 'customfield_seminarspeaker',
label: {
<mt:Var name = "_list" />
},
sort: 'ascend',
debug: false
});
}
}
このように設定すると、以下のチェックボックスが「セミナー」ブログのブログ記事の編集画面に表示できます。
- 複数指定が可能なチェックボックスを表示します。
- チェックボックスのラベルが「講師」ブログのブログ記事のタイトル、値が「講師」ブログのエントリー ID となります。
「セミナー」ブログの記事の出力
前述の user.js の設定で、カスタムフィールド「講師」には、「講師」ブログのエントリー ID が、カンマ区切りで格納されています。
カンマ区切りのエントリー ID を取得して、講師情報を出力するには、以下の内容を「セミナー」ブログのブログ記事アーカイブに記述します。
<mt:SeminarSpeaker setvar="data" />
<mt:SetVar name="_items" />
<mt:Var name="data" regex_replace="/\n/g"," " setvar="_data">
<mt:Var name="_data" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="_length">
<mt:For var="i" from="1" to="$_length">
<mt:Var name="_data" regex_replace="/^([^,]+).*/","$1" trim="1" setvar="_val">
<mt:Var name="_data" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="_data">
<mt:If name="_val" ne=""><mt:Var name="_items" function="push" value="$_val"></mt:If>
</mt:For>
<mt:Loop name="_items">
<mt:Entries blog_ids="5" id="$__value__">
....
</mt:Entries>
</mt:Loop>
前述のテンプレートの内容を解説します。
- mt:For のループで、カンマ区切りのエントリー ID を、配列変数 _items に格納します。
- mt:Loop のループで、配列変数 _items に格納してあるエントリー ID を抽出します。
- 抽出したエントリー ID を使って、「講師情報」を取得します。
まとめ
MTAppjQuery を活用することで、MT6 の環境でもコンテンツタイプっぽいことができることがわかりました。
今回、Perl モジュールのバージョンの関係で MT7 を導入できなかったため、ちょっとがんばってみました。