PHPerのための Movable Type 講座(その1)
公開日 : 2014-04-10 13:55:17
MTはもうVersion6だよねDataAPIだよねJavaScriptだよねJSONだよね、な皆さんこんにちは。
何言ってんだよPHPだろ時代はMTで作られてるサイトのカスタマイズ依頼きたんだけどPHPだよPHPでやらなきゃならんのだよこっちは何がDataAPIだよ、というあなたに送る記事第一段です。その1と書きましたが、続かないかもしれません。いっぱい「いいね!」がついたら続くかも!
今回はDynamicMTMLやプラグインではなく、「生」PHPからMTをいじる前提で、class MTDatabase(/mt/php/lib/mtdb.base.php)のメソッドについて紹介したいと思います。
初期化
<?php
$blog_id = 1;
include('/path/to/mt/php/mt.php');
$mt = MT::get_instance( $blog_id, '/path/to/mt/mt-config.cgi' );
$ctx =& $mt->context();
$ctx->caching = FALSE;
$blog = $mt->db()->fetch_blog( $blog_id );
$ctx->stash( 'blog', $blog );
$ctx->stash( 'blog_id', $blog->id );
まずは初期化から。ウェブサーバーに test.php とかを置き、最後に echo $blog->name とかしてブログ(ウェブサイト)名が返ってきたらOK、成功です。
class MTDatabase はここでは、$mt->db()です。class MTDatabase のメソッドは、$mt->db()->foo とすることで呼び出せます。以下、だいたいソース上の上から順番に紹介します。「だいたい」ですので。
メソッド
メソッドによってパラメタや戻り値は様々ですが、基本的に以下の認識で間違いありません。
- 単数が前提のもの、IDを渡してオブジェクトを得るもの(fetch_entryなど)の戻り値は単一のオブジェクト
- 複数の結果が返ることがあるもの(fetch_entriesなど)の戻り値はオブジェクトの配列
- その他は文字列、数字、配列等
fetch_blog(fetch_website)
すでに初期化のところで出てきました。ブログIDを渡すと、Blogオブジェクトが返ります。fetch_websiteはウェブサイト版です。ちなみに、fetch_blogにウェブサイトのIDを渡しても返ってきますが、ウェブサイトではfetch_websiteを使った方が良いでしょう(記事とページ、カテゴリやフォルダでもそうですがclass Website extends Blog、なのでカスタムフィールドとかそのあたりが異なる可能性があるので)。
parse_blog_ids
ブログIDの配列を返します。第二引数はウェブサイトを含めるかどうか。デフォルトはFALSE(含めない)です。
$blog_ids = $mt->db()->parse_blog_ids( 'children', TRUE );
var_dump( $blog_ids );
// => array(2) { [0]=> string(1) "2" [1]=> string(1) "1" }
include_exclude_blogs
これ、昔はpublic functionじゃなかった気がする(何でやねんって言った記憶がある)けど、public functionになってます。MTのPHPはSQLのWHERE文を組み立てることがよくあるんですが、このメソッドはオブジェクトのblog_id に指定する文字列を返します。
$args = array( 'include_with_website' => 1, 'include_blogs' => 'children' );
$include_exclude_blogs = $mt->db()->include_exclude_blogs( $args );
echo $include_exclude_blogs;
// => in (2,1 )
fetch_entry(fetch_page)
$entry_id = 1;
$entry = $mt->db()->fetch_entry( $entry_id );
記事(ウェブページ)のIDを渡すと、記事(ウェブページ)オブジェクトを返します。
db2ts(ts2db)
YYYYMMDDhhmmss形式と、データベースが扱うタイムスタンプ文字列(YYYY-MM-DD hh:mm:ss 等)を相互に変換します。
$entry_id = 1;
$entry = $mt->db()->fetch_entry( $entry_id );
$authored_on = $entry->authored_on;
echo $authored_on;
// => 2014-04-08 12:46:24
$authored_on = $mt->db()->db2ts( $authored_on );
echo $authored_on;
// => 20140408124624
$authored_on = $mt->db()->ts2db( $authored_on );
echo $authored_on;
// => 2014-04-08 12:46:24
resolve_url
リクエストのパスとブログIDを渡すと、該当するFileinfoレコード(mt_fileinfo)を返します。
$blog_id = 1;
$fi = $mt->db()->resolve_url( '/path/to/foo.html', $blog_id, 3 );
3つめの引数(デフォルトは3)は、テンプレートのbuild_typeで、3はダイナミックパブリッシングです。DynamicMTML等ではbuild_type が1(スタティック)なものを使うことがありますが、スタティックなファイルがPHPから見えてはまずいことがあるので(昔、そういう脆弱性が存在したとかそういう経緯でしょうw)、3がデフォルトになってます。
load_index_template
インデックステンプレートをロードします。Templateオブジェクトを返します。
$tmpl = $mt->db()->load_index_template( $ctx, 'メインページ', $blog_id );
load_special_template
テンプレートをロードします。Templateオブジェクトを返します。以下のコードは、上記のload_index_templateと同じ結果を返します。
$tmpl = $mt->db()->load_special_template( $ctx, 'メインページ', 'index', $blog_id );
fetch_templates(fetch_templatemap)
テンプレート(Tempate)、fetch_templatemapはテンプレートマップ(TemplateMap)をロードしてオブジェクトを返します。
$args = array( 'blog_id' => $blog_id, 'type' => 'Individual' );
$templates = $mt->db()->fetch_templates( $args );
$templatemaps = $mt->db()->fetch_templatemap( $args );
get_template_text
テンプレートのテキストを返します。template_typeはデフォルトは'custom'(テンプレートモジュール)。$globalをTRUE(もしくは1など)とすると、グローバルテンプレートを検索対象に含めます。
$template_text = $mt->db()->get_template_text( $ctx, 'テンプレート名', $blog_id, $template_type, $global );
fetch_config
データベースのmt_configテーブルに保存されているオブジェクトを返します(環境設定のうち、データベースに保存されている値が格納されています)。
fetch_blogs(fetch_websites)
ブログ、ウェブサイトオブジェクトの配列を返します。引数に指定条件の配列を指定できます。
$websites = $mt->db()->fetch_websites();
$args = array( 'include_with_website' => 1, 'include_blogs' => 'children' );
$blogs = $mt->db()->fetch_blogs( $args );
category_link
カテゴリIDを渡して、カテゴリーアーカイブのURLを取得します。
$category_id = 1;
$category_link = $mt->db()->category_link( $category_id );
archive_link
日付アーカイブ(年、月など)のアーカイブURLを取得します。
require_once( 'archive_lib.php' );
$at = 'Monthly';
$ar = ArchiverFactory::get_archiver( $at );
$ts = '20140401000000';
$args = array( 'blog_id' => 2, 'type' => $at );
$link_sql = $ar->get_archive_link_sql( $ts, $at, $args );
$archive_link = $mt->db()->archive_link( $ts, $at, $link_sql, $args );
entry_link
記事又はウェブページのURLを取得します。第一引数は記事のID、2つめの引数は、アーカイブタイプ(記事はIndividual、ウェブページはPage)です。デフォルトはIndividual(記事)。
$entry_link = $mt->db()->entry_link( $entry->id, 'Page' );
fetch_entries(fetch_pages)
一番利用する機会が多そうなのがこれです。引数$argsに指定する値は、基本的にはMTEntries、MTPagesテンプレートタグに指定するモディファイアだと考えてよいです(limit、offset、blog_ids、include_blogsなど)。
$args = array( 'blog_ids' => 'all' );
$entries = $mt->db()->fetch_entries( $args );
$pages = $mt->db()->fetch_pages( $args );
fetch_plugin_config(fetch_plugin_data)
基本的には、fetch_plugin_configを使う、と考えてください。プラグインデータの値がキーバリューの形で取得できます。注意点としては、config.yamlなどで指定されたプラグインの初期値がこれでは取得できない点です。DynamicMTMLではそのあたりの対策がなされているので、DynamicMTMLを利用する場合はclass MTPluginを使って実装した方が良いでしょう。
$plugin_data = $mt->db()->fetch_plugin_data( 'MultiBlog', 'configuration:blog:1' );
$plugin_config = $mt->db()->fetch_plugin_config( 'MultiBlog', 'blog:1' );
fetch_entry_tags(fetch_asset_tags)
記事、ページやアイテムの「タグ」を取得します。include_privateで、プライベートタグを含めるかどうかを指定します。
$args = array( 'entry_id' => $entry->entry_id,
'blog_id' => $blog_id,
'class' => $entry->class,
'include_private' => 1 );
$tags = $mt->db()->fetch_entry_tags( $args );
$args = array( 'asset_id' => $asset->id,
'blog_id' => $blog_id,
'include_private' => 1 );
$tags = $mt->db()->fetch_asset_tags( $args );
fetch_category
カテゴリIDを渡して、Catgegoryオブジェクトを返します。
$category = $mt->db()->fetch_category( $category_id );
fetch_categories(fetch_folders)
カテゴリ(フォルダ)オブジェクトの配列を返します。
$args = array( 'blog_id' => $blog_id,
'class' => 'folder' );
$categories = $mt->db()->fetch_categories( $args );
$args = array( 'blog_id' => $blog_id );
$folders = $mt->db()->fetch_folders( $args );
今日はここまで。息があがった。続く、(かも)
(追記)続いた