PowerCMS™

PowerCMS ブログ

ホーム > PowerCMS ブログ > New DynamicMTML(PHPによるMovable Typeの拡張)-3

2011年01月21日

New DynamicMTML(PHPによるMovable Typeの拡張)-3

引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。

Perl APIとの互換メソッド

Movable Typeの特徴のひとつにPerlによる静的出力とPHPによるダイナミックパブリッシングの両方が使えることがあげられますが、プラグインを両方に対応させるためには、両方のコードを書かないといけないことから両対応していないプラグインが数多く存在します(Power CMS for MTはすべて両対応しています)。

理由の一つに、PerlとPHPでコードの書き方が違うことがあげられると思います。今回のDynamicMTMLは静的ファイル中のMTML実行に留まらず、PHPプラグインを簡単に作成するための様々なライブラリを実装しました。

MT::App互換メソッドについてはこちらのエントリで紹介済みですが、その他にも様々なメソッドが実装されています。

MT::Objectを扱うためのPerl互換メソッド

$app->load($class,$terms[,$args])

オブジェクト$classを$terms、$argsの条件に従ってロードします。 $termsが数値の場合(ID)、及び$args['limit']に1が指定されている場合に返り値は単一のオブジェクトとなり、それ以外の場合はオブジェクトの配列を返します。$termsの各値には配列を指定可能です(OR検索になります)。

例:ブログIDとエントリーIDを指定してエントリーを1件ロードする
$terms = array( 'blog_id' => $blog_id, 'id' => $id );
$args  = array( 'limit' => 1 );
$entry = $app->load( 'Entry', $terms, $args );

※次のように書くこともできます。
$entry = $app->load( 'Entry', $id );

例:カテゴリーIDを指定してブログ記事を10件ロードする
$terms = array( 'blog_id' => $blog_id,
                'status'  => 2 );
$args  = array( 'sort' => 'authored_on',
                'direction' => 'descend',
                'limit' => 10 );
$join  = array( 'mt_placement', 'entry_id',
                array( 'category_id' => $category_id ) );
$args[ 'join' ] = $join;
$entries = $app->load( 'Entry', $terms, $args );

例:公開日が今日のブログ記事/ウェブページをロードする
$current_ts = $app->current_ts( $blog );
$ymd = substr( $current_ts, 0, 4 ) . '-' .
       substr( $current_ts, 4, 2 ) . '-' .
       substr( $current_ts, 6, 2 ) ;
// 2011-01-01 or
// $current_ts = $app->db()->ts2db( $current_ts );
// $ymd = preg_replace( '/^(([0-9][^0-9]*){8}).*$/', '$1', $current_ts );
$terms = array( 'blog_id' => $blog->id,
                'class'   => array( 'entry', 'page' ),
                'authored_on' => array( 'like' => $ymd . '%' ),
                'status'  => 2 );
$entries = $this->load( 'Entry', $terms );

例:日付を範囲指定してブログ記事をロードする
$terms = array( 'blog_id' => $blog_id,
                'authored_on' => array( '20110101000000',
                                        '20110131235959' ),
                'status'  => 2 );
$args  = array( 'sort' => 'authored_on',
                'direction' => 'descend',
                'range_incl' => array( 'authored_on' => 1 ),
                // or 'start_val' => '20110131000000',
                );
$entries = $this->load( 'Entry', $terms, $args );

これにより、Perlとほぼ同じ書き方でコードを書くことができます。

例:プレビュー一時ファイルの削除

Perl(MT::Core.pm)
sub remove_temporary_files {
   require MT::Session;

   my @files = MT::Session->load(
       { kind => 'TF', start => [ undef, time - 60 * 60 ] },
       { range => { start => 1 } } );
   my $fmgr = MT::FileMgr->new('Local');
   foreach my $f (@files) {
       if ($fmgr->delete($f->name)) {
           $f->remove;
       }
   }
   # This is a silent task; no need to log removal of temporary files
   return '';
}

PHP
function remove_temporary_files() {
   $files = $app->load( 'Session',
            array( 'kind' => 'TF', 
                   'start' => array( NULL, time() - 60 * 60 ) ),
            array( 'range' => array( 'start' => 1 ) ) );
   foreach ( $files as $f ) {
       if ( $app->delete( $f->name ) ) {
           $f->Delete();
           // または $app->remove( $f );
       }
   }
   return '';
}
$app->get_by_key($class,$terms)

$class,$termsからオブジェクトをロードし、条件に一致するものがなければオブジェクトを作成します(戻り値は常に単一のオブジェクトです)。

$app->exists($class,$terms)

$class,$termsからオブジェクトをロードし、条件に一致するものが存在する場合に1を返します。

$app->column_values($obj)

オブジェクトのカラム名とカラム値の配列を返します($obj->GetArray()と同様)。

$app->column_names($obj)

オブジェクトのカラム名の配列を返します($obj->GetAttributeNames()と同様)。

MT::WeblogPublisher互換のメソッド

ダイナミックパブリッシングエンジンを利用して再構築を行います。この時、$param['build_type']でテンプレートのbuild_typeを配列で指定することができます。build_typeが1,2のテンプレートではビルドした結果を静的ファイルとして出力します。build_typeが3のテンプレートはmt_fileinfoレコードの更新のみを行います(ファイルが存在する場合は.static拡張子を付けたファイルにリネームされます)。build_typeが4のテンプレートは再構築キューに登録されます。

$app->rebuild($args)

ブログ、インデックス、アーカイブを再構築します。再構築の対象を限定する場合には、対象を引数$argsに指定します。$argsには、次の項目を指定できます。

Blog
再構築するブログに対応するMT::Blogオブジェクトです。BlogまたはBlogIDのいずれか一方を必ず指定してください。
BlogID:再構築するブログのブログIDです。BlogIDまたはBlogのいずれか一方を必ず指定してください。
ArchiveType
再構築するアーカイブの種類です(複数指定する場合はカンマ区切りテキストで指定してください)。この引数はオプションです。指定しない場合はすべてのアーカイブの種類が再構築の対象となります。
NoIndexes
rebuildメソッドは、デフォルトではすべてのアーカイブを再構築したあとでインデックス・テンプレートを再構築します。インデックス・テンプレートを再構築したくない場合は、TRUEをこの引数に指定してください。この引数はオプションです。
NoStatic
この値をtrueにすると、再構築ルーチンに対して、スタティックな出力ファイルの再構築の必要がないことを指示します(build_typeが1と2のアーカイブを再構築対象から外します)。
Limit
再構築するエントリーの件数を、当該ブログ中の最新N件に限定します(アーカイブタイプが'Indivisual'及び'Page'の時のみ有効です)。
Offset
Limitと組み合わせて指定し、エントリー・アーカイブの再構築の開始位置を指定します(アーカイブタイプが'Indivisual'及び'Page'の時のみ有効です)。
例:最新10件のブログ記事を再構築する
$app->rebuild( array( 'Blog' => $blog,
                      'ArchiveType' => 'Individual',
                      'NoIndexes' => 1,
                      'Limit' => 10 ) );
$app->rebuild_indexes([$params])

現在のブログまたは$param['blog']にセットしたブログのインデックス・テンプレートを再構築します。

$app->rebuild_indexes( array( 'blog' => $blog,
                       'build_type' => array( 1, 3, 4 ) );
$app->rebuild_archives([$params])

現在のブログまたは$param['blog']にセットしたブログのテンプレートのうち$param['recipe']で指定したアーカイブを再構築します。$param['updated']を指定することでアクティブなリクエストで更新、保存されたエントリー及びエントリーに関連するアーカイブだけを再構築対象とすることができます。

$archives = array( 'Index', 'Category', 'Monthly' );
$app->rebuild_archives( array( 'blog' => $blog,
                               'recipe' => $archives,
                               'updated' => 1 ) );

$param['limit'],$param['offset']を指定することで再構築対象範囲を指定することができます。アーカイブによってカウント対象となるオブジェクトは変わります。

インデックス・アーカイブ
テンプレートの数
ブログ記事
ブログ記事の数
ウェブページアーカイブ
ウェブページの数
カテゴリ
カテゴリの数
日付アーカイブ
出力されるアーカイブの数
ユーザー/日付アーカイブ
ユーザーの数
カテゴリ/日付アーカイブ
カテゴリの数

* PluginName/php/publishers/ArchiveTypeName.php を設置することでカスタム・アーカイブタイプを再構築させることができます。

$app->rebuild_entry($param)

引数$paramで指定されたエントリーを再構築します。$param['BuildDependencies']を指定することで関連するアーカイブを同時に再構築します。

$app->rebuild_entry( array( 'entry' => $entry,
                            'BuildDependencies' => 1 ) );
$app->rebuild_category($param)

引数$paramで指定されたカテゴリを再構築します。

$app->rebuild_category( array( 'category' => $category ) );
$app->rebuild_from_fileinfo($fileinfo)

MT::FileInfoオブジェクトから該当するアーカイブを再構築します。MT::FileInfoオブジェクトのbuild_typeによって静的再構築、再構築キューへの登録のいずれかを行います。

MT::FileMgr互換のメソッド

$app->put($src,$dest[,$type ])

$dest で指定したパスのファイルへ $src ファイルの内容を出力します。$src はローカル・ファイルのパス名またはURLです。$dest はローカル・ファイルのパス名です。
$type はオプションで、put がアップロード・ファイル用のものか、HTMLファイル出力かを指定します。これは書き込みのモードや umask設定などを伝えるためのものです。$type には"upload"か"output"が指定可能で、デフォルトは"output"です。戻り値は出力したバイト数(0のこともあります)になります。エラー発生時にはFALSEを返します。

$app->put_data($data,$dest[,$type ])

$dest で指定したパスのファイルへ $src ファイルの内容を出力します。$src はローカル・ファイルのパス名またはURLです。$dest はローカル・ファイルのパス名です。
$type はオプションで、put がアップロード・ファイル用のものか、HTMLファイル出力かを指定します。これは書き込みのモードや umask設定などを伝えるためのものです。$type には"upload"か"output"が指定可能で、デフォルトは"output"です。戻り値は出力したバイト数(0のこともあります)になります。エラー発生時にはFALSEを返します。

$app->get_data($src)

$src に指定したパスからデータ・ブロックを取得し、取得したデータを返します。$src はローカル・ファイルのパス名またはURLです。取得に失敗するとFALSEを返します。

$app->mkpath($path[,$perms])

$pathに指定したパスを再帰的に作成します。つまり、パス中に一つでも存在しないものがあれば、それを作成します。作成に失敗すると(または作成したディレクトリに書き込み権限がない場合)FALSEを返します。$perms を指定すると作成したディレクトリのパーミッションを $perms に設定します。$permsの指定を省略すると $app->config('DirUmask')で指定されたパーミッションに設定されます。

$app->content_is_updated($file,$content)

$fileが存在しないか $fileの内容が$contentの内容と異なる場合に1を返します。

$app->delete($file)

$fileを削除します。削除に成功した場合、および$fileが存在しないか $fileがシンボリックリンクである場合、TRUEを返します。

引き続き次回のエントリではClass MTPlugin(config.yaml又はconfig.phpで定義するPHPプラグイン)のしくみと作成方法についてご紹介します。


カテゴリー
DynamicMTML
PowerCMS 2
プラグイン
技術情報

Recent Entries