MovableTypeを開発プラットフォームとして使う。
公開日 : 2007-03-08 03:19:49
MovableTypeをデフォルトの状態で運用する時にパスが /mt/mt.cgi になるわけだが、/mtフォルダにBasic認証で制限をかけたいとか、もはやMTをブログツールでなくWebアプリの開発プラットフォームとして使いたい、といった場合に役立つノウハウ。
実際問題、ちょっとしたWebアプリやコミュニティサイトなんかすごく簡単にできる。
/mt/mt-config.cgi
CookiePath /
例えば/mtディレクトリ以外のディレクトリでもログインの有無を確認して処理を変えたい場合、mt-config.cgiにこのように書く。
但し、コメントなんかにスクリプト付きのリンクとか埋め込まれたとして踏んだときのリスクはあるので(今回はいわゆる「ビジネスブログ」ということで、そのあたりの機能はオフにする、あるいは考えない前提で)。
/myapp.cgi
#!/usr/bin/perl -w use strict; use lib qw (/home/site_path/htdocs/mt/lib/); use lib qw (/home/site_path/htdocs/mt/extlib/); use MT::Bootstrap App => 'Myapp';
これがCGIの本体。こいつに対して実行パーミッションを持たせる。
/mt/lib/Myapp.pm
こいつが今回の主役。ログインもログアウトも /mt/mt.cgi を経由せずに行えるし、もはや何でもできるというか、すごく楽に開発できる。MTって、僕にとってはもはやブログではなく「開発プラットフォーム」である。
MT::Objectのサブクラスを作成すれば、SQL要らずでデータベース連動のWebアプリが出来る。動作の重さもFastCGIを使うことで解消されるし、いざとなったら 「MovableType Background Rebuilder Plugin」ってのもある。
package Myapp;
use strict;
use MT::App;
@Myapp::ISA = qw(MT::App);
$ENV{MT_HOME}="/home/site_path/htdocs/mt";
$ENV{MT_CONFIG}="/home/site_path/htdocs/mt/mt-config.cgi";
sub init_request {
my $app = shift;
$app->SUPER::init_request(@_);
$app->add_methods( Myapp => \&_Myapp );
$app->{default_mode} = 'Unprotected';
$app->add_methods( Unprotected => \&_Unprotected );
$app->{requires_login} = 1 unless $app->mode eq 'Unprotected';
$app;
}
sub _Unprotected {
my $app = shift;
my $query = $app->param;
my $action = $query->param('action');
my $redirect_pth = $query->param('redirect_pth');
if ($action eq 'logout') {
# /myapp.cgi?action=logout でログアウト
$app->logout;
# ログイン用フォームを表示
return &_login_tmplate;
}
my $login = $app->login;
if (defined $login) {
if (($redirect_pth ne '') && ($redirect_pth ne '/myapp.cgi?action=logout')) {
$app->redirect($redirect_pth);
}
# ログインしていたら_Myappを実行
return &_Myapp($app);
}
if ($app->login) {
# ユーザー名とパスワードが正しければログイン
$app->run;
}
# ログイン用フォームを表示
return &_login_tmplate;
}
sub _Myapp {
my $app = shift;
# 本来はログインユーザーが /myapp.cgi?__mode=Myapp&...という
# アドレスでアクセスした時の処理。この場合は、ログインユーザー
# だった場合の処理を書く。
}
sub _login_tmplate {
return <<HTML;
# ログイン用フォームのHTML
HTML
}
1;