Movable Type 技術情報
小林
2009年09月29日
本日は先日お話ししたtheme.yamlを触ってもらったことを前提に、MT5のconfig.yamlを説明したいと思います。MTを扱っているデザイナさんやMTMLコーダーの方は是非ご覧ください。
先日theme.yamlでフォルダ・ウェブページが追加できますと説明しましたが、MT5でconfig.yamlでもフォルダ・ウェブページの追加が出来ます。つまりtheme.yamlと同じ事が出来ます。
config.yamlだとcallbackを使って処理を追加できて、フィールド拡張も出来て、テンプレートセットも追加出来ます。つまりより簡単にMTを操作できるので、本当の意味で標準パッケージを作るという意味ではaddonsでパックを作った方が良いのではないかと私は思っています。(theme.yamlでも出来るかもしれませんが未確認です・・・)
ちなみにcallbackをご存じでない方に説明しますと、callbackとはMTの処理の間に任意の処理を追加するためのポイントだと思ってください。たとえばMT管理画面のヘッダーに処理を追加したい!というときはtemplate_source.header:というcallbackを使います。
config.yamlでのMT操作は、MTを取り扱っている方なら覚えておいて損はないです。ある程度勝手を覚えれば、Perlを知らなくても簡単なプラグインがかけます。次回はconfig.yamlでMT管理画面のロゴマークを書き換えるプラグインでもご紹介します。
ってかconfig.yamlってなに?という方、何となく上の説明ですごそうだということは伝わりませんでしょうか?(汗)mtディレクトリ直下のaddonsに〜.packというのがあると思いますが、そちらを開いてもらうとconfig.yamlというのが入っていると思います。
というわけで、まずはこちらでお勉強(汗)。いくつかconfig.yamlのわかりやすい記事をご紹介します。
そもそもconfig.yamlって何だよ?って人は、まず習うより慣れろ、ということでテンプレートセットを作ってみましょう。SAKKの公式マニュアルに沿ってやってみてください。案外簡単でびっくりされると思います。
テンプレートセットの登録
こちらではyamlだけでプラグインを書く方法を紹介しています。
Movable Type用ShortCodeプラグイン・その9(yamlファイルだけでプラグインを作る)
こちらの記事ではyamlでのデータベース拡張をわかりやすく説明しています。MTタグとしての呼び出し方が載っていませんが、yamlのtags: function:らへんを見ればわかると思います。
フィールド追加系プラグインにおけるベストプラクティス
いままでプラグイン書いていた人にはいいきっかけな記事がこちらです。
Movable Type 4 のプラグイン作成での新機能
参考にしてもらえれば、もっと効率よくMT開発が出来ます。
記事の趣旨とは関係ないですが、themeもaddonsもどちらもディレクトリ配下にthumbnail.pngなどで保存すると、テーマ一覧のサムネイルを指定できます。テーマ一覧に自分のテーマサムネイルが表示されてちょっぴり優越感です(笑
小林
2009年09月27日
Movable Type 5から「テーマ機能」という機能が追加されました。MT4には「テンプレートセット」「スタイルキャッチャー」というテンプレートとスタイルを切り替える機能がありましたが、テーマ機能ではテンプレートやスタイルだけではなくサイト構造や画像などのスタティックファイルを同封して「ウェブサイトのひな形」を作る事が出来ます。
MT5のマニュアル「オリジナルのテーマを作成する」には
- テンプレート
- デザインで利用する、画像などのファイル
- カテゴリー
- フォルダ
- カスタムフィールドの設定
と書かれていますが、theme.yamlに追記することでウェブページも追加することが出来ます。
theme.yamlとはテーマを定義するファイルです。MTのウェブサイト管理画面の「ツール」から「テーマのエクスポート」を選択してエクスポートしてみてください。mt/themeディレクトリにテーマがエクスポートされ、theme.yamlがあるはずです詳しくはMT5のマニュアル「オリジナルのテーマを作成する」をご覧ください。
theme.yamlを編集する
先ほどエクスポートしたtheme.yamlにelements:という行があると思いますが、その真下に以下の文を貼り付けてください。
elements:
default_folders:
importer: default_folders
name: Default Folders
component: core
data:
about:
label: 会社概要
service:
label: サービス
default_pages:
importer: default_pages
name: Default Pages
component: core
data:
about:
basename: index
title: 会社概要
text: 会社概要のページです。
tags: 会社概要
folder: about
default_folders以下では、フォルダを追加します。data:の下でフォルダを定義します。
about: ←フォルダのパスを書きます。
label: 会社概要 ←フォルダ名を書きます。
default_pages以下では作成するページを追加します。data:の下でページを定義します。
about: ←任意の名前を指定します
basename: index ←ウェブページのファイル名を指定します。拡張子は書きません。
title: 会社概要 ←ウェブページのタイトルを書きます。
text: 会社概要のページです。 ←ウェブページの本文を書きます。
tags: 会社概要 ←ウェブページにタグが必要な場合は書きます。
folder: about ←ウェブページにフォルダを指定する場合はフォルダパスを記載します。
この状態でウェブサイト管理画面「デザイン」から「テーマ」を選択するとエクスポートしたテーマが表示されているはずです。そのテーマの「適用」ボタンをクリックします。すると「会社概要」フォルダと「会社概要」ウェブページが追加されています。
このようにMT5のテーマ機能を活用することで、一度作成したウェブサイトをひな形化して再利用することで効率よいウェブサイト構築を可能とします。
ちなみに動いていたyamlを編集して再度適用させたときにエラーが出ることがありますが、改行やスペースが間違えていることが多いと思いますので、追加した部分の改行やスペースを見直してみてください。
小林
2009年09月12日
プラグインをインストールするだけで、あらかじめ指定したカスタムフィールドを自動的に追加する方法をご紹介します。
MT5では「テーマ」機能でカスタムフィールドを自動的に追加できるのですが、MT4ではできません。
このやり方をすれば、たとえば案件でよく使うカスタムフィールド(重要な記事 MTEntryImportantとか)をプラグインに設定しておいて、自分独自のMTタグを利用するようなことができます。
プラグインのダウンロード
こちらからプラグインのひな型をダウンロードしてください。
AddField.zip
プラグインの修正方法
ひな形のプラグインにはあらかじめ5つのカスタムフィールドがグローバルカスタムフィールドとして追加されるようになっています。
ここでは<$MTEntryImportant$>という重要な記事をチェックボックスで指定するやり方を説明します。
カスタムフィールドのベースネームの設定
14~18行目に
$ADD_FIELD_NAME_番号 = 'カスタムフィールドのベースネーム';
があります。ここでは追加したいカスタムフィールドの数だけ行を書いてください。番号は1から初めて、複数のフィールドを追加する場合は連番としてください(フィールドはいくらでも追加できます。)。ベースネームとは、カスタムフィールドを識別する任意の名前です。これは他のカスタムフィールドと重複して使うことができません。任意のベースネームを指定してください。ここでは
$ADD_FIELD_NAME_1 = 'entry_important';
とします。
追加するフィールドの詳細を設定
追加するフィールドの詳細を設定します。太い赤字の部分を適宜書き換えてください。複数のカスタムフィールドを追加する場合は68~82行目をコピーして 82行目の}を改行して83行目に貼り付けてください。
68~82行目に
## ADD_FIELD_NAME_1 追加用 ## ADD_FIELD_NAME_1 追加用 **************************************************************************
$custom = CustomFields::Field->load({ basename => $ADD_FIELD_NAME_1 } );
unless($custom){
$custom = CustomFields::Field->new;
$custom->blog_id(0);
$custom->name('重要な記事');
$custom->basename($ADD_FIELD_NAME_1);
$custom->obj_type('entry');
$custom->type('checkbox');
$custom->tag('entryimportant');
$custom->required(0);
$custom->description('');
$custom->options('');
$custom->save;
}
という行があります。ここにフィールドの詳細を記載します。
- 69行目
-
$custom = CustomFields::Field->load({ basename => $ADD_FIELD_NAME_1 } );
ここではベースネームの設定時につけた$ADD_FIELD_NAME_hogehogeの番号を記載します。先ほど_1と指定しましたので、$ADD_FIELD_NAME_1と書き換えます。 - 72行目 ブログIDの指定
-
$custom->blog_id(0);
ここでは追加するブログIDを指定します。ブログIDに関係なくフィールドを追加したい場合は0を指定してください。 - 73行目 カスタムフィールド名の指定
-
$custom->name('重要な記事');
カスタムフィールド名を指定します。ここでは重要な記事と記載します。 - 74行目 ベースネームの指定
-
$custom->basename($ADD_FIELD_NAME_1);
ベースネームを指定します。ここでは先ほど指定した$ADD_FIELD_NAME_1と記載します。 - 75行目 オブジェクトタイプの指定
-
$custom->obj_type('entry');
ここではカスタムフィールドを追加したいオブジェクト(ブログ記事・ウェブページ・カテゴリ・フォルダ・ユーザー)を指定します。指定したオブジェクトにカスタムフィールドが追加されます。オブジェクトの指定の仕方はプラグインの48行目に記載しています。 - 76行目 データ型の指定
-
$custom->type('checkbox');
ここではカスタムフィールドで利用したいデータの型(テキストボックス、ドロップダウンなど)を指定します。ここではチェックボックスを指定します。オブジェクトの指定の仕方はプラグインの54行目に記載しています。 - 77行目 MTタグ名の指定
-
$custom->tag('entryimportant');
ここでは追加したMTタグを記載します。MTEntryImportantとしたいため、entryimportantと記載します。頭のMTはシステムが自動的につけてくれます。 - 78行目 必須の指定
-
$custom->required(0);
カスタムフィールドを必須にするかを指定します。必須にする場合は1を指定します。 - 79行目 概要の指定
-
$custom->description('hogehoge');
カスタムフィールドの下に表示する説明文を指定します。不要な場合はdescription('');と空っぽにします。 - 80行目 オプションの指定
-
$custom->options('hoge01,hoge02,hoge03');
ドロップダウンリストなどのあらかじめ表示したい項目を指定します。不要な場合はoptions('');と空っぽにしてください。
プラグインのインストール
プラグインをpluginsディレクトリに設置します。その後管理画面にアクセスするとカスタムフィールドが追加されます。

ここで作成した重要な記事のフィールドは以下のように表示されます。

注意事項
- ここで追加したカスタムフィールドを管理画面から削除しても、プラグインを追加している限りは強制的にフィールドが追加されます。
- 本プラグインをご利用される方は必ず「プラグインご利用の際の注意事項」をお読みください
ぴろり上西
2009年09月11日
Movable Type には他の CMS やブログツールにない大きな特徴――魅力とも言える、があります。それが他に類を見ない強力無比なプラグイン機能です。MT エンジニアとして、このプラグイン機能を無くして Movable Type を語ることはできません。
例えば、こんな仕様の管理画面を持つサイトを作りたいとします。
- 記事は公開開始日時と非公開日時があり、公開開始日時になると非公開日時までの間公開されます
- 記事作成時の作成日付は自由に設定できるが、作成時刻は固定とし編集できません
- 既に存在する記事の公開期間と重なるような期間で記事を保存しようとすると、画面に警告メッセージが表示されます
- 既在の記事のコピー記事をワンクリックで作成する機能があります
これを Movable Type 以外のシステムで作ろうとすれば、きっとシステム本体のソースコードに手を入れる必要があるでしょう。それに比べて Movable Type では、プラグインのファイルを追加するだけで上記のような機能をシステムに付加することが可能です。上記の仕様を満たすために作られたのが以下のプラグインです。もちろん、Movable Type 本体のソースコードには一切手を入れていませんので、シックス・アパートの製品保証は継続して受けることができます。
- FutureRebuild
- SolidEntryPostTime
- AlertEntryTimeCollision
- CopyEntryLink
個人ブログなどでは WordPress などのブログツールが幅を利かせていますが、この例のように本体に手を入れずに、簡単に機能を追加できるという面において、Movable Typeは企業ユースなどでのニーズでは他のシステムの追随を許さないものがあります。多少コストがかかっても大企業による製品保証があるか・ないか、という点は企業イントラネットの構築では相当に大きなアドバンテージなのです。しかも Movable Type の場合、Enterprise でさえコストが格安のため、他CMSシステムに対して大きなリードがあるのですね。
ぴろり上西
2009年09月08日
JavaScriptでは"あいうえお".lengthとすると、文字数(この場合は5)が返ります。そうではなくて、文字列のバイトコードサイズを取得したい場合について。
<script type="text/javascript">
var a = 'ABC123あいう';// in 15 bytes UTF-8
var tbl = [ 0, 1, 1, 1, 2, 3, 2, 3, 4, 3 ];
var len = 0;
for (i = 0; i < a.length; i++)
len += tbl [encodeURIComponent(a.charAt(i)).length];
alert(len);
</script>
UTF-8 限定です。UTF-8 では,0x00~0x7f 以上の文字コードは必ず複数個の %XX で表されるので、テーブル参照する必要はないハズですが,念のため,下表のようなテーブルを用いてバイト数をカウントしています。
%XX%XX%XX 9 -> 3
%XX%XXAA 8 -> 4
%XX%XXA 7 -> 3
%XX%XX 6 -> 2
%XXAA 5 -> 3
%XXA 4 -> 2
%XX 3 -> 1
%X 2 -> 1
A 1 -> 1
(0) -> 0
ところで,JavaScript の Virtual Machine 上では,物理的な CPU で活用されているパイプライン処理や分岐予測などの技術が実装されているかは知らないのですが(多分,今のところは無い)おそらくはテーブル参照による方法が一番高速ではないかと思います。