AnotherCustomFields プラグインを DynamicMTML に対応させる

藤本さんの AnotherCustomFields プラグインの解説書を買いました。 AnotherCustomFields プラグインは、MTOS(オープンソース版の Movable Type)にカスタムフィールドの機能を追加することができるプラグインです。フィールドの追加は、管理画面から行うのではなく config.yaml という設定ファイルを書いてサーバーにアップロードするという手間はあり...

藤本さんAnotherCustomFields プラグインの解説書を買いました。

AnotherCustomFields プラグインは、MTOS(オープンソース版の Movable Type)にカスタムフィールドの機能を追加することができるプラグインです。フィールドの追加は、管理画面から行うのではなく config.yaml という設定ファイルを書いてサーバーにアップロードするという手間はありますが、とても簡単な設定ファイルですので特に苦になりません。設定ファイルの書き方は、プラグインの解説書に丁寧に書かれていますので、MTOS を頻繁に使う方は、是非とも1冊購入しておくと良いかもしれません。

また、AnotherCustomFields は、Movable Type の標準のカスタムフィールドとはデータの持ち方が違います。そのため、AnotherCustomFields を標準のカスタムフィールドと併用するということも考えられます。例えば、「自分で PHP で SQL を投げて、カスタムフィールドで条件を絞りブログ記事を取得する」ということをやる場合は、MT 標準のカスタムフィールドよりもずっと楽に SQL が書けるようになるので、そういった需要にもオススメです。

さて、この AnotherCustomFields ですが、スタティック・パブリッシングについては自動的に拡張テンプレートタグを生成してくれるので問題ありませんが、DynamicMTML(ダイナミック・パブリッシング)には対応していません。

そこで、AnotherCustomFields のテンプレートタグを DynamicMTML でも使えるようにする方法の基本的な部分を紹介します。

なお、今回は、DynamicMTML が使える状態というのを前提に話を進めます。DynamicMTML のインストールには下記のページを参照してください。

AnotherCustomFields でカスタムフィールドを追加する

初めに AnotherCustomFields の紹介ページを参考にプラグインをインストールし(現時点での最新版はこちら)、サンプルの config.yaml をインストールしてブログ記事に「サブタイトル」という欄を追加してください(テーマのインストールは不要です)。5分もあればそこまで簡単にできます。

ブログ記事を投稿する

ブログ記事の編集画面に「サブタイトル」が追加されたら、試しにブログ記事を追加してみます。今回は次のような内容にしてみました。

  • タイトル:AnotherCustomFields プラグイン
  • サブタイトル:AnotherCustomFields を DynamicMTML で!

記事を投稿したらそのブログ記事のIDをメモしておいてください。保存後の管理画面のURL中の「id=2」の部分です。今回は「2」でした。

テスト用のインデック・ステンプレートを作成

次に、動作を検証するためのインデックス・テンプレートを作成します。インデックス・テンプレートの内容は次の通りです。まずはスタティック・パブリッシングから試してみます。

  • テンプレート名:AnotherCustomFields テスト
  • 出力ファイル名:acftest.html
  • 公開:スタティック(既定)
  • 内容:以下のとおり
<h2>スタティック・パブリッシング</h2>

<p>mt:Date : <$mt:date format="%Y-%m-%d %H:%M:%S"$></p>
<mt:Entries id="2">
<ul>
<li><$mt:EntryTitle$></li>
<li><$mt:EntrySubTitle$></li>
</ul>
</mt:Entries>

このテンプレートを再構築して表示すると次のようになります。

acf_dynamic_1

ちゃんと表示されましたね。

DynamicMTML で出力する部分を追記する

次に、先ほどのテンプレートの最後に以下の内容を追加します。

<h2>DynamicMTML</h2>

<mt:DynamicMTML>
<p>mt:Date : <$mt:date format="%Y-%m-%d %H:%M:%S"$></p>
<mt:Entries id="2">
<ul>
<li><$mt:EntryTitle$></li>
<li><$mt:EntrySubTitle$></li>
</ul>
</mt:Entries>
</mt:DynamicMTML>

これを保存と再構築して表示させると、次のような「ページが見つかりません」という類いのエラーが出ると思います。

acf_dynamic_2

ダイナミック用の拡張テンプレートタグを書く

さて、いよいよ本題です。今回は MTEntrySubTitle タグをダイナミックに対応させます。ダイナミック・パブリッシング用のプラグインの書き方は藤本さんの以下の記事が参考になりますのでご覧ください。ここでは淡々と進めます。

PHP ディレクトリを作る

今回は AnotherCustomFields の紹介ページにあるサンプルをインストールしているという前提で進めます。

サンプルがちゃんとインストールされているのであれば、MT のインストールディレクトリ(MT_DIR)直下の plugins ディレクトリに「EntryFields」というディレクトリがアップロードされているはずです。

  • MT_DIR/plugins/EntryFields

この「EntryFields」ディレクトリの中に、「php」というディレクトリを作成します。

  • MT_DIR/plugins/EntryFields/php

この php ディレクトリの中に、MTEntrySubTitle タグのダイナミック用のファイルを入ることになります。

ファイル名

今回は「MTSubTitle」という「ファンクションタグ」をダイナミックに対応させますので、次の名前のファイルを、先ほど作成した php ディレクトリ内に作成します。

  • MT_DIR/plugins/EntryFields/php/function.mtentrysubtitle.php

ファイルの内容

function.mtentrysubtitle.php には次のコードを書きます。

<?php
function smarty_function_mtentrysubtitle ($args, &$ctx) {
$entry = $ctx->stash('entry');
return $entry->entry_subtitle;
}
?>

まず、$ctx->stash('entry') で処理中のコンテキストからブログ記事のオブジェクト(entry)を取得します。

そして、取得したブログ記事のオブジェクトから $entry->entry_subtitle でサンプルで追加したサブタイトルの値を取り出して出力すればOKです。

オブジェクトから値を取り出す

ここで一度サンプルの config.yaml の内容を見てみましょう。

object_types:
entry:
subtitle:
type: string
size: 255
revisioned: 1
acf:
type: text
label: サブタイトル
tag: EntrySubtitle
topimage:
type: integer
revisioned: 1
acf:
type: image
label: トップ画像
tag: EntryTopImage

サンプルでは、このように「 subtitle 」というベースネームのフィールドと「 topImage 」というベースネームのフィールドを mt_entry テーブルに追加しています。

このように「 subtitle 」として追加すると、実際のデータベースのフィールド名は「 entry_subtitle 」となります。ダイナミック用のプラグインでオブジェクトから値を取り出すときはそのままフィールド名で取り出します。

動作確認

さて、function.mtentrysubtitle.php をアップロードしたら、先ほどエラーが出たページを再度表示してみましょう。次のようにちゃんと表示され、リロードする度に下段の時刻が更新されれば完璧です。

acf_dynamic_3

以上です。この方法を使って、普通のテキスト系のものはどんどん DynamicMTML (ダイナミック・パブリッシング)に対応させましょう!

Published 2012-03-28
Updated 2019-06-25