以前にも
MT5とMT4の動作環境の違いを調べてみました (エムロジック放課後プロジェクト)
このエントリで書きましたが、MT5ではSQLiteは対応していません。
しかし、MTをインストール時にはSQLiteも選択することができ、インストールも最後まで行うことができます。
実際に動かしてみても普通に使えるみたいなのですが、いくつか問題を発見しました。
- ブログの削除ができない
- ブログの一覧画面からブログを選択して「削除」ボタンを押すと「Can't call method "execute" on an undefined value」というエラーが出て削除ができません。
- カスタムフィールドがうまく動かない
- タグ名を「EntryDesc」としてテキストフィールドを追加したとき、<$MTEntryDesc$>タグを使っても再構築後に表示されない。これは、他の種類のフィールドでも同様で、「entrydesc」のように小文字にしないとうまく動かない
この他にも、まだ、問題はあるかもしれません。
もともとサポートしていないものなのですがから、正常に動作しなくても仕方ないと思いますが、もしかすると、同じようにエラーが起きて悩んでいる人もいるかも知れないので、ここに書いておきます。
MT5では素直にMySQLを使うのが良さそうです。
MTプラグインで、管理画面のメニューに項目を追加するには、レジストリを使います。
そこでは、「view」オプションを使って「どの画面」にメニューを追加するかを指定できます。
my $plugin = new MT::Plugin::Hoge({
name => 'Hoge',
registry => {
applications => {
cms => {
menus => {
'tools:hoge' => {
label => "Hoge",
order => 800,
view => "blog",
},
},
},
},
},
});
MT->add_plugin($plugin);
こんな感じで、指定するとブログメニューにだけメニューが追加できます。
と、今まではこんな感じで、blogを指定すればブログメニューに、systemを指定すればシステムメニューに、view自体を指定しなければ両方に追加されたのですが、MT5からはビューが増えたこともあり、配列を渡すことで複数のviewを追加できるようになりました。
my $plugin = new MT::Plugin::Hoge({
name => 'Hoge',
registry => {
applications => {
cms => {
menus => {
'tools:hoge' => {
label => "Hoge",
order => 800,
view => [ "blog", "website", "system"],
},
},
},
},
},
});
MT->add_plugin($plugin);
こんな感じにすると、ブログ、システム、ウェブサイトのメニューに新しくメニューを追加することができるようになります。
ここでは、以下の指定ができます。
- user
- ユーザーダッシュボード
- blog
- ブログメニュー
- system
- システムメニュー
- website
- ウェブサイトメニュー
この中でも、「user」が非常に面白くて、これを指定すると、本来メニューが存在しないユーザーダッシュボードに追加したメニューがひとつだけぽつんと表示されます。
まさに、「俺メニュー」という感じです。
とても、面白いので、ぜひ試してみてください。
MTのスケジュールタスク機能は、指定日投稿のほかにも公開キューによる再構築や迷惑コメント・トラックバックの削除、不要になったセッションやテンポラリファイルの削除など重要な処理を行っています(弊社でもいくつかのプラグインでスケジュールタスクを利用しています)。
MTの機能をフルに活用したいのであれば、この機能は可能な限り設定するべきです。
MTのスケジュールタスクを実行する方法として、もっとも一般的な対応はMTが動作しているサーバー上で、MTに含まれるスクリプト run-periodic-tasks を定期的に実行する方法ですが、定期的な実行を行うためには cron や Windows タスク・スケジューラ の設定が必要であり、利用するサーバーによってはこの設定を行うことができずに、スケジュールタスク機能を設定しないまま利用されている方もいらっしゃるのではないかと思います。
MTでは、サーバー上で run-periodic-tasks を実行できない場合の代替策として
指定日投稿や公開キュー等のスケジュール処理の設定 | Movable Type 4 ドキュメント
に書いてある
- ログ・フィードの取得時に実行
- XML-RPC API で拡張された mt.runPeriodicTasks の利用
の2通りの方法が用意されています。
どちらの方法もサーバーの設定を必要とせず外部からMTのスケジュールタスクを実行させることが可能なのですが、その設定方法については具体的に解説されていません。
このサイトでは以前Rubyスクリプトを用いた方法を紹介しましたが、今回は、Windowsに限定した、WSH(VBScript)を使った方法を紹介したいと思います。
この方法は、IEがインストールされているWindows XP/Windpows Server 2003以上の環境であれば、追加のソフトを必要としないことが特徴です。
MTプラグインは、MTシステムにインストールするとシステム単位の有効/無効は指定できますが、ブログごとの有効/無効を指定することができません(2009/07現在)。
システムに実装されていない以上プラグインで実装するしかないわけです。
毎回同じようなコードを書くわけで、いいかげんテンプレート化できてきたので、ここで、紹介しておこうと思います。
少し前に「MAMPにMTをインストールする際のメモ」という記事を書きましたが、今回はそこで書き忘れたPHPのデバッグ環境の構築について書いてみたいと思います。
MacGDBpのインストール
PHPスクリプトをリモートデバッグするには MacGDBpという、XdebugのGUIフロントエンドを使用します。ダウンロード、アーカイブ展開後、MacGDBp本体をアプリケーションフォルダにコピーするだけです。
Xdebugのインストール
次にサーバ側にXdebugエクステンションをインストールします。XdebugのバイナリパッケージがActiveStateにありますのでこれを利用します。Komodo Debugger Extensionsから"Komodo 5.1 Remote Debugging Packages"の欄にある"PHP Remote Debugging / Mac OS X"をダウンロードし、展開します。
展開するとPHPのバージョンごとにエクステンションがありますので、MAMPで使用しているPHPのバージョン(MAMP 1.7.2の場合はPHP 5.2.6)にあわせてエクステンション(xdebug.so)を選択し、以下の場所へコピーします。
$ cd 5.2
$ cp xdebug.so /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922
Xdebugの設定
Xdebugを使えるようにするには、/Applications/MAMP/conf/php5/php.iniを編集し、
以下の設定をファイルの最後へ追加します。
[xdebug]
zend_extension="/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart=1
また、Zend Optimizerを無効にするため、以下の行の先頭にセミコロンを入れ、コメントにします。
zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.3.3
MacGDBpでスクリプトをデバッグする
MacGDBpを起動すると、デバッガ画面が開きます。この状態で、デバッグしたいページをブラウザからアクセスすると、ブラウザ上には何も表示されませんが、MacGDBpでは次のような画面になり、スクリプトの先頭で停止します。

画面上部左側では、変数の内容を確認できます。
スクリプトを任意の場所で停止したい場合は、Breakpointsウィンドウを開き、画面下部の「+」をクリックしてスクリプトを指定し、画面上部に表示されたスクリプトから停止させたい箇所の行番号部分をクリックします。

これでPHPスクリプトのデバッグが出来るようになり、ダイナミックパブリッシングに対応したMTプラグインの開発効率が上がるはず(?)です。
MT関連の開発にはMAMPに複数のバージョンのMTを同時にインストールして使っていますが、毎回新しいバージョンを入れる度にやり方をすっかり忘れているので、次にインストールする時のためにここにメモしておきます。
- MTのアーカイブを展開後、"mt425"等バージョン番号をつけたディレクトリ名にrenameし、DocumentRootへコピーする。
- 以下の内容でmt-config.cgiを作成する。
CGIPath /mt425/
StaticWebPath /mt425/mt-static/
StaticFilePath /Applications/MAMP/htdocs/mt425/mt-static
ObjectDriver DBI::mysql
Database mt425
DBUser root
DBPassword xxxx
DBHost localhost
DBSocket /Applications/MAMP/tmp/mysql/mysql.sock
MailTransfer sendmail
SendMailPath /usr/sbin/sendmail
MySQLのSoketファイルは/Applications/MAMP/tmp/mysql/mysql.sockにある。mt-config.cgiのDBSocketにはこれを設定する。
- バージョン毎のディレクトリ以下で直接cgiが動くよう、DocumentRootに以下の内容の.htaccessが存在するか確認し、なければ作成する。
Options +ExecCGI
AddHandler cgi-script .cgi
- mt-config.cgiで指定したデータベースを作成する。mysql/mysqladminは/Applications/MAMP/Library/binにある。
> mysqladmin -u root -p create mt425 --default-character-set=utf8
- mt.cfgにアクセスする。
MAMPを起動しても、Apache/MySQLサーバの状態が「赤」になり、起動しないことがたまにあります。そういう場合は、/Applications/MAMP/bin/apache2/logs/httpd.pidが存在するならそれを削除してみます。MySQLで同様の場合は、/Applications/MAMP/tmp/mysql/mysql.pidを削除してみます。
MTが動いているサーバを移転することになりました。
しかし、
- 旧サーバはSQLiteしか使えない
- 新サーバはMySQLしか使えない
ということで、SQLiteのファイルをそのまま移動して終わりと言うわけにはいきません。
どこかで、新サーバのMySQLにデータを移行するために変換を行う必要があります。
そこで、こんな方法を考えてみました。
- 旧サーバのSQLiteのデータベースファイルをローカルPCにバックアップする
- ローカル環境に構築したサーバに旧サーバのMTと同じバージョンのMTをインストールしておく
- バックアップしたSQLiteのバックアップファイルをローカル環境のMTで使えるようにMT側の設定を行い、ファイルを所定のディレクトリにおく
- ogawaさんの「MT Database Converter 」を使い、MySQLにコンバート
- MySQLのデータベースをdumpする
- dumpしたデータを新サーバのMySQLにインポートする
これで、うまくいくはずなんですが、はまったのが
旧サーバとローカルサーバのDBD::SQLiteのバージョンを揃える必要がある
という点でした。
今回は、旧サーバのバージョンにあわせてモジュールをインストールしました。
この手の作業は、仕事で時々発生することがあると思うので、ここにメモしておきます。