メイン

MovableType アーカイブ

2008年06月29日

WebSig24/7MT4分科会第2回勉強会。

既に一週間経ってしまいましたが、6月21日WebSig24/7MT4分科会第2回勉強会参加してきました。

当日は僕の誕生日だったのでお祝いしてもらってこっぱずかしかったですよ(嬉しかったですよ。ありがとうございました)。

ケーキ!

当時発表したものですが、こちらにて公開しました。WYSIWYGエディタのTinyMCEをMTのリッチテキストとして使えるようにするプラグインです。基本的にはウチの会社のF君の成果(曰く、胃が痛かったけど何とかやってみました、という仕事の成果)をプラグイン化したものです。

TynyMCEプラグインの画面

もうひとつ、画像のアップロードと管理を簡単にするSideBarImageのCSS微調整版もこちらにあげておきます。

小川さんの話を聞いて、英語ベースのコミュニティでも逃げてちゃいかんよな、ということを改めて思ったのと、小山さんの話が面白くも中途半端で言いたいことが一杯あった一日でした。

グループワークの時間はやっぱり短い。一日ガリガリコードを書いて夕方発表、くらいがちょうど良いような気がしました。僕は事前に大分準備してたので、それなりに発表とか出来ましたけど。

2008年06月12日

MT4.2のダイナミックパブリッシングでのページ分割互換、静的ページ分割プラグイン。

MT4.2から「ダイナミックパブリッシングでのページ分割」が可能ということで、以前書いたPagerプラグインのテンプレートタグを下記のページのテンプレートタグ互換に改造しました。

テンプレートタグはエイリアスとしているので以前のページに書いてある書き方でもそのまま動きます。

但し、一点 MTEntriesについては「offset="0"」と書くようにしていましたが、これもダイナミックとあわせて「offset="auto"」と書くようにしました。

上記ページでも「この機能は、詳細なテストを行っていない実験的な機能ですので、サポート対象外です。」とあって、このプラグインも同じく詳細なテストは行えていません(MT4.1でしかテストしてないし)。不具合とかうまく動いたとかフィードバックいただければ嬉しく思います。

テンプレートの編集

次のテンプレートをコピーしてください。

<div class="content-nav">
  <MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">
           &laquo; Previous</a>&nbsp;&nbsp;</MTIfPreviousResults>
  <MTPagerBlock>
    <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage>
    <mt:unless name="__last__">&nbsp;</mt:unless>
  </MTPagerBlock>
 <MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">
         Next &raquo;</a>
 </MTIfMoreResults>
</div>

ここではカテゴリ別ブログ記事リストテンプレートを編集します。既に、カテゴリ別ブログ記事リストテンプレートには class の値が content-nav の div 要素で囲まれたブロックがあるので、その部分をコピーしたテンプレートと置き換えます。

次にカテゴリ別ブログ記事リストテンプレートの中から MTEntries ブロックタグを探します。MTEntries ブロックタグに、値が auto の offset モディファイアを追加するか、既に offset モディファイアがあったら値を auto に変更します。また limit モディファイアで、1ページに表示する件数 (例えば 10) を設定します。

加えて対象とするテンプレートの以下のチェックボックスをオンにしてください。

テンプレート編集画面のチェックボックス

Download:

2008年06月11日

Movable Type管理画面の「壊れにくい」カスタマイズのために。

MT4LP5(CSS Nite LP, Disk 5)「Movable Type プロフェッショナルスタイル」の中でalt-tmplフォルダに代替テンプレートを放り込んでそれに手を入れる方法があるよ、ということを例をあげて説明しているのですが、「管理画面をカスタマイズするとバージョンアップで管理画面のインターフェイスが変更された時どうよ」みたいな話が出ます。

実際問題、これはどうしようもないと思います。MT3→MT4で管理画面カスタマイズ系のプラグインの多くがそのままでは動かなくなったことは記憶に新しいと思うわけですが、それでも「壊れにくい」「修正対応しやすい」カスタマイズの方法とか注意点とかがそれなりにあるのでそのあたりを少しご紹介します。

可能な限りプラグインで拡張可能なアクション、ウィジェット、メニュー等として登録するように

例えばボタンひとつ追加、とかの場合は以下のようにMTのプラグインによって拡張する方法が提供されているので、基本的にバージョンアップ時にもそのまま使えます。実際list_actions, page_actionsはMT3系の時も提供されていました。ただ、メジャーバージョンアップの時に仕組み自体が変更になるかならないかはわかりません(menu等はMT4で導入されているし、その辺のしくみが変更になる可能性はないとはいえません*)。

* ただ、これまでの流れを見る限りMTの場合移行の際の互換性には最大限の気配りがされているので、少なくともバージョン一つアップして使えないってことは考えにくいと思います。

プラグインアクション(list)


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        applications => {
            cms => {
                list_actions =>

プラグインアクション(リスト)

プラグインアクション(page)


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        applications => {
            cms => {
                page_actions =>

プラグインアクション(ページ)

メニュー(dialog)

sub init_registry {

    my $plugin = shift;
    $plugin->registry({
        applications => {
            cms => {
                menus => {
                    'create:ui_sample_dialog' => {
                        dialog => 'foo',

メニュー(mode)


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        applications => {
            cms => {
                menus => {
                    'create:ui_sample_mode' => {
                        mode => 'foo',

メニュー

ダッシュボード(widget)


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        widgets => {
            my_widgets => {
                label    => 'My Widget',

ダッシュボードウィジェット

カスタムインポートフォーマット


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        'import_formats' => {
            'import_ctsv' => {
                label => 'CSV or Tab-Separated Values',

インポートフォーマット

クイックフィルタ


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        applications => {
            cms => {
                list_filters   => {
                    entry => {
                        next_approval => {
                            label => 'Next revision awaiting approval',
                            order   => 1000,
                            handler => sub {
                                my ( $terms, $args ) = @_;
                                $terms->{next_status} = 6;
                            },
                        },

クイックフィルタ

template_paramコールバックのDOMScriptingで拡張する

template_param, template_source, template_output コールバックで管理画面に変更を加えるときは正規表現でソース等を書き換えるよりもtemplate_paramコールバックのDOMScriptingで拡張するほうが(比較的)壊れにくい。正規表現で置換とかやらないと実現出来ないケースも多いとは思うけれど、その場合でもソースの書き換えは最小限ので済ませ、template_paramで値をセットしたり書き換える箇所が後から変更になっても柔軟に対応出来るようにalt-tmplと組み合わせる(テンプレートにソースを挿入するポイントにコメントを入れるとか)等、工夫次第でメンテナンス性の高いカスタマイズとすることもできるでしょう。

BlogBody, BlogMore, BlogKeyword, BlogExcerptフィールドを追加する例


sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        object_types => {
            'blog' => {
                'text' => 'text',
                'keywords' => 'text',
                'text_more' => 'text',
                'excerpt' => 'text',
            },
        },
        callbacks => {
            'MT::App::CMS::template_param.cfg_prefs'
                => ¥&_blog_extras_param,
        },
   });
}

sub _blog_extras_param {
    my ($cb, $app, $param, $tmpl) = @_;
    my $pointer_field = $tmpl->getElementById('description');
    my $nodeset = $tmpl->createElement('app:setting', { id => 'keywords', label => $plugin->translate('Keywords') , required => 0 });
    my $innerHTML = '<div class="textarea-wrapper"><textarea name="keywords" id="keywords" class="full-width short" cols="" rows=""><mt:var name="keywords" escape_html="1"></textarea></div>';
    $nodeset->innerHTML($innerHTML);
    $tmpl->insertAfter($nodeset, $pointer_field);
    $nodeset = $tmpl->createElement('app:setting', { id => 'excerpt', label => $plugin->translate('Excerpt') , required => 0 });
    $innerHTML = '<div class="textarea-wrapper"><textarea name="excerpt" id="excerpt" class="full-width short" cols="" rows=""><mt:var name="excerpt" escape_html="1"></textarea></div>';
    $nodeset->innerHTML($innerHTML);
    $tmpl->insertAfter($nodeset, $pointer_field);
    $nodeset = $tmpl->createElement('app:setting', { id => 'text_more', label => $plugin->translate('Extended Page') , required => 0 });
    $innerHTML = '<div class="textarea-wrapper"><textarea name="text_more" id="text_more" class="full-width short" cols="" rows=""><mt:var name="text_more" escape_html="1"></textarea></div>';
    $nodeset->innerHTML($innerHTML);
    $tmpl->insertAfter($nodeset, $pointer_field);
    $nodeset = $tmpl->createElement('app:setting', { id => 'text', label => $plugin->translate('Text') , required => 0 });
    $innerHTML = '<div class="textarea-wrapper"><textarea name="text" style="height:150px" id="text" class="full-width short" cols="" rows=""><mt:var name="text" escape_html="1"></textarea></div>';
    $nodeset->innerHTML($innerHTML);
    $tmpl->insertAfter($nodeset, $pointer_field);
}

ブログのフィールド拡張

alt-tmplの書き換えでは追加・変更箇所をできるだけ外部ファイルとしてインクルードする

alt-tmplにコピーを置いて直接手を入れる場合は「テンプレートの見通しを良くする」「変更箇所がわかりやすいようにする」というオーソドックスな考え方でメンテナンス性向上とバージョンアップ時の対応コストを下げることができるでしょう。

例えば以下のようにして変更箇所をインクルードファイルにしておけばバージョンアップの際にそのまま使えるかもしれない(CSSとかid/class名の変更くらいは必要かもしれないけれど)。


<mt:include name="include/edit_entry_extra.tmpl" id="edit_entry_extra">

テンプレートの変更箇所にコメントを入れる

お約束ということで。


<mt:ignore>======拡張フィールドの追加======</mt:ignore>
<mt:include name="include/edit_entry_extra.tmpl" id="edit_entry_extra">

2008年06月03日

MT::FileMgrでファイルの読み書きとか。

発端はこれ。

何か古い記事が再掲載されてるということであれこれツッコミが入ってますね。

ベアワードのファイルハンドルはグローバルということですね。とはいえ、Googleとかで調べると実際出てくるのは比較的古いものが多いようで。

Movable Type(4.1)はどうしているんだろうと思って覗いてみたらみたらこんなコードが(App:CMSのcreate_dashboard_stats_file部分)。


    local *FOUT;
    if ( !open( FOUT, ">$file" ) ) {
        return;
    }

「local *FOUT;」とな。で、まぁそれは本題ではなくて、MTの場合はFileMgrを使うということなんだろうな。


use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/lib" : 'lib';

use MT;
use MT::FileMgr;

my $src    = 'Hello FileMgr!';
my $updata = 'Hello FileMgr! (Updated)';
my $out    = 'hello.txt';
my $put    = 'put.txt';
my $rename = 'rename.txt';
my $dir    = 'directory';

$out       = File::Spec->catdir( $dir, $out );
$put       = File::Spec->catdir( $dir, $put );
$rename    = File::Spec->catdir( $dir, $rename );

my $fmgr = MT::FileMgr->new( 'Local' ) or die MT::FileMgr->errstr;

print $fmgr->mkpath( $dir );

# directoryを作成する (成功した場合「1」)

print "¥n";

print $fmgr->exists( $dir );

# directoryが存在するか (存在する場合「1」)

print "¥n";

print $fmgr->can_write( $dir );

# directoryが書き込み可能か (書き込み可能な場合「1」)

print "¥n";

print $fmgr->put_data( $src, $out );

# directory/hello.txt に 'Hello FileMgr!' を書き込む (戻り値はバイト数)

print "¥n";

print $fmgr->put( $out , $put );

# directory/put.txt に hello.txt の中身を書き込む (戻り値はバイト数)

print "¥n";

print $fmgr->content_is_updated( $out, ¥$updata );

# directory/out.txt の中身(Hello FileMgr!)と $updata(Hello FileMgr! (Updated)) を比較する (値が異なる場合「1」)

print "¥n";

print $fmgr->rename( $put, $rename );

# directory/put.txt を directory/rename.txt にリネームする (成功した場合「1」)

print "¥n";

print $fmgr->get_data( $rename );

# directory/rename.txt の内容をprintする

実行結果


1
1
1
14
14
1
1
Hello FileMgr!

MT::FileMgr->new( 'Local' ) のところ、 MT::FileMgr->new( 'FTP',@args ) (@argsにFTPホスト、ログイン名、パスワードを入れる)とFTPサーバー上のファイル読み書きができる(らしい。そうなんだ...知らなかった)。

参考:

2008年05月31日

CSS Nite in Osaka/Nagoya (Movable Type特集)。

2008年4月に東京で開催したMT4LP5の大阪版として、CSS Nite in Osaka, Vol.9(Movable Type特集)を開催します。基本的にMT4LP5の再演です。

大阪版

名古屋版

ということで、大阪(2008年6月8日(日))と名古屋(2008年6月9日(月))で開催されます(当初名古屋は私は行けない予定だったのですが、予定が空いたので参加させていただくことになりました)。

僕が話すのは東京での話と基本的には同じ(ユーザー指向の管理画面を作る - 管理画面のカスタマイズ)なのですが、最近作ったいくつかのプラグインとか新しいネタも少し織り交ぜて話したいと思います。

東京の時をはじめ、何度か話しましたしこのブログでも書いているので少しは一般化? してきたかもしれませんが、「CMSのユーザビリティ」に注目してユーザー指向の管理画面を作る、というところに進むとサイト構築が一段階楽しくなりますし、それも制作者のスキルのうちです。

と、いうあたりをライブなデモを交えてご紹介します。よく練習しておきますね。


以下, タイトルのみを表示します。

2008年05月14日

MT FileInfoMgrプラグイン。

2008年05月12日

MTが生成した静的ファイルの管理。

2008年04月30日

Movable Typeのプラグインを作ってみたい方へ。

2008年04月29日

せっかくWYSIWYGなんだから(2)。- SidebarImageプラグイン改良

2008年04月19日

Movable Typeの不正ログイン対策。

2008年04月18日

リスト系アーカイブの静的ファイルを分割するMT Pagerプラグイン(修正)。

Movable TypeをMySQLで運用している際に文字コードShift_JISで発生する問題。

2008年04月11日

MTプラグインのデバッグ。

2008年04月07日

MT4LP5が終了しました。

2008年03月30日

せっかくWYSIWYGなんだから。

2008年03月28日

再び Movable Type BackgroundRebuilder プラグイン。

2008年03月13日

CSS Nite MT4LP5。

2008年03月11日

音声ブラウザ向けのブログシステムを考えてみる、だけじゃなく作ってみる。

2008年02月23日

MTインストール時にmt-staticが見つからない理由。

2008年02月13日

MT4.1のカスタムフィールドで指定した画像を素直なタグで出力する。

2008年02月11日

カスタムフィールドあれこれ。

2008年02月06日

MTタグだけでプラグイン(みたいなもん)を作る。

2008年02月02日

WikipediaをソースにしてMTのインポートフォーマットを(テスト用に)生成する。

2008年01月29日

MT/MTOSのCMSテンプレートは直接触らずにコピーをいぢくるのだ。

2008年01月20日

EntryAssetの編集を簡単に。

2008年01月14日

Greg Packer's Publishingその後。

2008年01月12日

MT4.1/MTOSでFizzBuzz。

2008年01月11日

MTのテンプレートタグでFizzBuzz。

2008年01月07日

月別アーカイブのリストに「年度」見出しを付ける(訂正)。

2008年01月03日

さりげなく? cms_pre_previewコールバックが追加されている件。

2007年12月31日

携帯からMTにメールで投稿するMoblogプラグイン「Moober」。

2007年12月30日

MTOS/MT4.1のエントリーステータス「未公開(承認待ち)」を使えるようにする。

2007年12月27日

Background Rebuilder (for MT4)。

再構築なんてこわくない(3)!

2007年12月26日

RebuildAt1stView(PHP版)。

2007年12月23日

再構築なんてこわくない(2)!

2007年12月21日

再構築なんてこわくない!

2007年12月16日

MT::ObjectこそがMTの本質であると勝手に思っている。

2007年12月14日

MTOSリリース、MT4.1、LogViewer4MTOS公開。

2007年11月22日

月別アーカイブのリストに「年度」見出しを付ける。

2007年11月11日

KOFの会場にACアダプタ忘れて来て凹む。

2007年11月08日

Movable Type Open Source Project を活用しよう @ 関西オープンソース2007。

2007年10月23日

タグ検索 / 検索結果フィードのキャッシュの実装。

2007年10月21日

(続)MT4で画像挿入の際にclassやstyleが付くのが嫌! なあなたに。

2007年10月20日

MT4, MTOS, 告知, 雑多な話題。

2007年10月15日

MTSetVar(Block)/MTIfタグの具体的な利用例。

2007年10月13日

MT3→MT4へタグやbasenameを引き継いで(インポート&エクスポートで)簡単に移行する方法。

2007年10月10日

検索? タグ? カテゴリー? 関連性, 体系付け。

2007年10月05日

検索結果のフィード配信とタグ検索機能実装してみた。

2007年10月02日

Movable Type4ダイナミックパブリッシング対応プラグインの作成方法をまとめてみた。

MTのPHPプラグインでLIKE検索書いてみた。

2007年10月01日

【第16回】WebSig会議「Web屋さんのためのMovable Type4」in 大阪 参加しました。

2007年09月28日

結局ブログ内検索はどうすればいいのか?

2007年09月26日

「検索結果テンプレート」の修正でMTの検索結果表示にどの程度の効果があるか?

2007年09月25日

MTからデータベースへのクエリの発行回数を減らす (mt-search.cgiを例にとって)。

2007年09月20日

エントリー投稿時にファイルも一緒にアップしたいよね、やっぱり。

2007年09月13日

MTでログインユーザー限定のページを作る方法。

MTのエントリー編集画面をごにょごにょと...

2007年09月11日

MT4でカスタムメニュー, モーダルダイアログの追加。

2007年09月08日

MT4のエントリー投稿画面の入力フィールドを簡単に,無制限に増やせるExtFields。

2007年09月06日

MTObjectBuilder(MT::Objectのサブクラスを作ってDBのテーブルを簡単に拡張するためのcgi)。

2007年09月03日

MT4でMT::Objectを継承したサブクラスを作ってDBのテーブルを拡張する(メモ)。

2007年08月31日

Excelで作ったリストをMovable Typeに放り込むとっても簡単な方法。

2007年08月30日

RebuildAt1stView(Beta) ハイブリッド・パブリッシング対応版。

2007年08月28日

RebuildAt1stView(Beta) MT4専用全アーカイブ対応版。

2007年08月26日

Movable Type 4 Hack-a-thon。

2007年08月25日

MTでページやエントリーの並び替えとか。

ハッカソン。

2007年08月24日

MTOS (Movable Typeオープンソース) は10月?

Movable Type 開発者向けカンファレンス。

2007年08月23日

MTはブログじゃないぜ。

2007年08月22日

Movable Type4で「年度別」アーカイブ。

MT3のエクスポート,インポートで basename (パーマリンク) を引き継ぐ方法。

2007年08月21日

MacBook+MAMP+Movable Type4。