2012年12月アーカイブ

今日はMovable Type Advent Calendar 2012の最終日。クリスマスですね。今年はMovable Type Idea Exchangeに行ったり福岡へセミナーとMTCafeで行ったりと相変わらずMTづけの一年でしたが、最終日、大トリということで、気合いのエントリです。MTコミュニティへのクリスマスプレゼントになればいいな。

https://github.com/alfasadoのキャプチャ

管理画面系

MT4時代の「システムメニュー」をMT5で利用したい

MT4にあったヘッダ部の「システムメニュー」をMT5で表示します。

エントリー投稿画面を高度にカスタマイズしたい

ブログ記事/ウェブページにスニペット入力欄を追加します。複数のinputフィールド等を組み合わせた管理画面を作成できますコードはプラグイン設定画面から登録します。

ウエブサイト/ブログのプラグイン設定で「ブログ記事スニペット」または「ウェブページスニペット」に以下のようなテンプレートを設定します。input 要素の name 属性には「snippet」で始まる値でないといけません。同じ name属性を複数の input要素で指定することもできます。

<input type="text" name="snippet_foo" id="snippet" class="full-width" value="<mt:var name="snippet_foo" escape="html">" mt:watch-change="1" autocomplete="off" />
<input type="text" name="snippet_bar" id="snippet" class="full-width" value="<mt:var name="snippet_bar" escape="html">" mt:watch-change="1" autocomplete="off" />

テンプレート側では、以下のようにして値を取り出すことができます(または mt:PageSnippet)。

<mt:EntrySnippet key="snippet_foo">
<mt:EntrySnippet key="snippet_bar">

同じ name属性を複数した時は、以下のように取り出します。

<mt:EntrySnippet key="snippet_foo" glue=",">

あるいは

<mt:EntrySnippetVars key="snippet_foo">
<mt:var name="snippet_option">
</mt:EntrySnippetVars>

テンプレートの再構築オプションを一括で指定したい

テンプレートの再構築オプション(静的、ダイナミック、キュー等)をテンプレート一覧画面から一括して変更できるようにします。

ユーザーダッシュボードに「サイトを見る」リンクを追加したい

システムスコープ、ユーザーダッシュボードの画面のヘッダ部右に「サイトを見る」リンクを表示します。通常は最初のウェブサイトのトップページです。システム全般設定でURLを指定することもできます。

ユーザーダッシュボードに左メニューを表示したい

ユーザーダッシュボードに左メニューを表示します。環境変数 RemovableThisIsYouWidget 1 を指定すると、「This is you」ウィジェットを右サイドエリアに持って行くことができます。

エントリーの投稿画面からタイトルや本文を隠したい

ブログ記事/ウェブページ編集画面でタイトル/本文欄を非表示にできるようになります。

ブログ記事/ウェブページ/アイテムの「タグ」の一覧をメニューに追加したい

ブログ記事/ウェブページ/アイテムメニューに「タグ」を追加します。

ダッシュボードウィジェットの表示順を変更したい

ダッシュボードのウィジェットをドラッグ&ドロップで位置変更できるようにします。

管理画面の文言を変えたい(言語ファイルをカスタマイズしたい)

言語ファイルをカスタマイズできます。カスタマイズはブログ毎に行えます(例:「ブログ」→「大分類」)。

/lib/MT/L10N/ja.pm を /plugins/AltL10N/L10N/ja.pm にコピーして、コピーした言語ファイルの日本語ファイル部分を置換等で変更すると、その言語ファイルが利用でれるようにします。ブログやウェブサイト毎に別の言語ファイルを適用する場合は /plugins/AltL10N/L10N/1/ja.pm のようにブログのID毎にディレクトリを作成して言語ファイルを設置してください。

不要なメニューを隠したい

mt-config.cgi に HideMenus環境設定を指定して、管理画面の左メニューを非表示にできるプラグインです。

HideMenus blog:manage,blog:create

機能強化・要望

フォルダアーカイブを作成したい

フォルダアーカイブ(配下のウェブページをmt:Pagesで取得できる)を作成可能にします。

高機能なリッチテキストエディタを使いたい

TinyMCEリッチテキストエディタを利用できるようにします。現在のMTでは標準搭載になりましたので不要です(MTのプラグイン書いてるとこういうことがいっぱいありますw)。MT5.0xでは有用かもしれません。

アイテムの貼付け時にパスを / から始まるパスに変更したい

アイテムの貼付け時にURLを /から始まるパスに変換します。公開環境のURLとステージング環境のURLが違う場合等に。

ブログ記事の再構築時に選択したカテゴリの上位のカテゴリもあわせて再構築したい

ブログ記事の再構築時に記事が属するカテゴリの上位のカテゴリもあわせて再構築するプラグインです。

ウィジェットの管理権限だけをユーザーに付与したい

テンプレートの編集権限とウィジェットの編集権限、スタイルの編集権限を別の権限としてユーザーに割り当てられるようにします。

ブログ記事のカテゴリ選択で、選択されたカテゴリの上位カテゴリにも属するようにしたい

このプラグインによってブログ記事の保存時に選択したカテゴリの上位カテゴリにも自動的にブログ記事が属するようになります。

日本語ファイル名のままでファイルをダウンロードさせたい

アイテムのダウンロードをアイテムの「ファイル名+拡張子」でダウンロードできるようにします。プラグイン設定によってログインユーザーのみがダウンロードできるように制限することも可能です。

mt-download.cgi?blog_id=1&asset_id=1

mt-download.cgiは環境変数 DownloadScript で変更でき、mt:DownloadScriptファンクションタグで取り出せます。

<mt:CGIPath><mt:DownloadScript>blog_id=<mt:BlogID>&asset_id=<mt:AssetID>

システム全体の設定を保存するカスタムフィールドが欲しい

設定等をデータベースに保存してテンプレートタグで出力可能にします。システム全体のカスタムフィールドのような使い方ができます。1つの設定につき名前、プライオリティ、キー、値が保存できます。

mt:Config{名前}ファンクションタグ(columnモディファイアで何を出力するかの指定が可能)によって取り出すことができる他、mt:CustomConfigLoopブロックタグでループ出力できます。

使っていないシステムテンプレートを削除したい

システムテンプレートを一覧画面の「アクション」から削除できるようにします。

複数のファイルをまとめてアップロードしたい

アイテムのアップロードで、複数ファイルのアップロードを可能にします。Firefox や Safariでは(要するにHTML5のFile APIが利用可能なブラウザであれば)ドラッグ&ドロップでのアップロードが可能です。

特定のカテゴリ配下にBasic認証をかけたい

DynamicMTML が有効な環境でカテゴリに Basic認証をかけるプラグインです。カテゴリ(フォルダ)にベースネームが「categoryauth_username(folderauth_username)」「folderauth_password」という2つのカスタムフィールドを作成し、これらの値がある場合にこのユーザーIDとパスワードで認証をかけます。カスタムフィールドのベースネームは環境設定で変更可能です。(CategoryAuthUserNameFieldBasename、CategoryAuthPasswordFieldBasename、FolderAuthUserNameFieldBasename、FolderAuthPasswordFieldBasename)

MTで管理しているサイトの情報をjson形式で取得したい

DynamicMTML が有効な環境で、インデックスアーカイブ、日付アーカイブ、カテゴリアーカイブ、ブログ記事/ウェブページアーカイブに to_json=1 というパラメタを追加することで、ページの代わりにjsonを返すプラグインです。

DynamicMTMLのコールバックプラグインでブログ記事をJSON形式で返す

パフォーマンスと再構築

再構築を速くしたい

EntriesPerRebuild環境変数(default:40)で指定した数のエントリーを1回のmt.cgiへのリクエストで再構築します。 この時(40ファイルの再構築)、このブロックタグで囲まれたブロックは、最初の1ファイルの再構築時のみ評価され、以降の39ファイルの再構築時にはメモリ上のキャッシュが使われます。 つまり、同一のヘッダ、フッタ、サイドバー等の場合、SQLのクエリが39回(テンプレートによってはそれ以上)省略できるようになります。要するに、速くなります!

MTRequestCacheプラグイン(超シンプルなテンプレートキャッシュ)。

<mt:RequestCache key="RecentEntries" blog_id="$blog_id">
    Some template tags that you want to cache.
</mt:RequestCache>

定期的に再構築したい。もしくはコマンドラインから再構築したい

コマンドラインやcronジョブで再構築を行うスクリプトです。 mt-rebuildという有名なツールがあったのですが、長くメンテナンスされていないため、作成しました。

以下のように実行します。

cd /path/to/mt; perl ./tools/rebuild-archives --at Index,Individual --blog_id 1,2

毎AM2時にすべてを再構築するには、以下のようにcronに登録します。

0 2 * * * cd /path/to/mt; perl ./tools/rebuild-archives

データベースの最適化を行いたい

MTのデータベースに対してSQL'OPTIMIZE TABLE テーブル名'を実行します。テーブルの最適化ですね。

cd /path/to/mt; perl ./tools/optimize-mysql

再構築キューを短い間隔で実行させたい

MT のrun-periodic-tasks の処理のうち、tasks と workers(再構築キューの実行)を別に cronに登録できるように別のスクリプトに分けたものです。再構築キューの実行を短いスパンで走らせたい、といったニーズ用に作成しました。MTの仕様上デーモンモードでは分離できません。

再構築を速くしたい(待ち時間を短くしたい)

再構築時にファイルを消去してしまい、最初にページにアクセスがあった時に静的ページを生成するプラグインです。再構築処理=ファイル消去(キャッシュクリアのような感じになります)なので、再構築処理は一瞬で終了します。DynamicMTMLが必要です。

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

再構築トリガーを細かく設定したい

システムプラグイン設定から再構築トリガーを登録できます。トリガーはcgiのパラメーターで設定します。書式はYAML形式です。

URLが mt.cgi?__mode=cfg_prefs&_type=blog&saved=1 の時、テンプレートのIDが1、2のテンプレートを再構築するには以下のように記述します。再構築出来るのはインデックスアーカイブのみです。YAMLの中に<mt:BlogID>等のテンプレートタグが記述できます。

TriggerName:
    params:
        - __mode=cfg_prefs
        - _type=blog
        - saved=1
    template_id:
        - 1
        - 2

ウェブサイトやブログをまとめて再構築したい

再構築ウィンドウに「すべてを再構築」チェックボックスを追加します。チェックを入れて再構築すると、権限を持つウェブサイトとブログを順番にすべて再構築します。

カスタムフィールドが大量にある場合にパフォーマンスが低下する

例えば一覧画面など、カスタムフィールドを利用しない画面ではカスタムフィールドの初期化をスキップすることで処理を軽量化するプラグイン。

テンプレートの処理結果をファイルとして保存(キャッシュ)したい

ダイナミックパブリッシング、DynamicMTMLで利用可能。ブロックタグの評価された結果をファイルに書き込みます。mt-config.cgi に 「AllowPutContents 1」を指定する必要があります。絶対パスでの指定を行いたい場合は、「AllowPutContentsAbsolute 1」をあわせて指定してください。閲覧結果をキャッシュさせるような用途を想定しています。no_outputモディファイアを指定すると、結果を画面に出力しません。

<mt:PutContents file="path/to/file.html">
この内容がBlogパス以下のpath/to/file.htmlに書き込まれる
</mt:PutContents>

エントリー保存時の再構築待ち時間を何とかしたい

ブログ記事/ウェブページの保存時に、再構築処理をスキップしてすぐに管理画面に戻るようにして、再構築処理はフォークされた別プロセスに行わせるプラグインです。サーバー環境によって利用できない場合があります。

テンプレートの一部をキャッシュしたい

mt:BuildCache ブロックタグで囲まれたブロックをキャッシュします。mt:RequestCache タグとの違いは、mt.cgiの一回のリクエストが終了した後も ttlモディファイアで指定した秒数はキャッシュが残ることです。

<mt:BuildCache key="RecentEntries" blog_id="$blog_id" ttl="20">
    Some template tags that you want to cache.
</mt:BuildCache>

マルチデバイス対応サイトでデバイス毎にキャッシュしたい

DynamicMTMLで、PC、スマホ、フィーチャーフォン毎に別のファイルキャッシュを生成します。mt-config.cgiで以下の設定が可能です。

  • EnableMultiDeviceCachePC 1(PC用のキャッシュを生成するか。デフォルトは1)
  • EnableMultiDeviceCacheSP 1(スマホ用のキャッシュを生成するか。デフォルトは1)
  • EnableMultiDeviceCacheFP 1(フィーチャーフォン用のキャッシュを生成するか。デフォルトは0)
  • MultiDeviceCacheTabletIsPC 1(タブレットではPC用のキャッシュを利用するか。デフォルトは1)
  • MultiDeviceCacheDir multidevicecache(キャッシュディレクトリ。ブログの公開パス配下に生成されます)

テンプレートのボトルネックを調べたい

ブロックタグ「mt:SpeedMeter」で囲んだ部分のテンプレートのビルド時間を計測してログや画面に出力するプラグインです。 環境変数 SpeedMeterDebugScope log(システムログ) または SpeedMeterDebugScope screen(画面)を指定できます(デフォルトは「log」)。テストが終了して運用フェイズにまわった際には none を指定すれば何も出力されなくなります。

<mt:SpeedMeter prefix="<pre>" suffix="</pre>">
この中のビルドにかかった時間が出力されます。
</mt:SpeedMeter>

エントリの特定のフィールドの値で再構築トリガーを指定したい

エントリの特定のカラム(columnモディファイアで指定)の値が eqモディファイアで指定した値と一致するブログ記事/ウェブページ(classモディファイアで指定、デフォルトは title)を再構築するトリガです。ファンクションタグ「mt:RebuildEntryByColumnValue」が評価されるタイミングで実行されます。スタティックパブリッシング専用です。

<mt:RebuildEntryByColumnValue eq="Some entry title"> <mt:RebuildEntryByColumnValue class="page" blog_id="2" eq="100" column="id">

mt-static以下のCSSファイルとJavaScriptファイルを圧縮したい

mt-staticディレクトリの中のCSSファイルとJavaScriptファイルを圧縮(改行やホワイトスペースを削除して容量を減らす)したものです。最新版が常にメンテナンスされているわけではないので、最新版に適用するためには tools/mt-static-minifier スクリプトをサーバー上で実行してください。

MTから生成するJavaScriptコードやCSSを圧縮したい

JavaScriptコードやCSSを圧縮する(改行やホワイトスペースを削除して容量を減らす)mt:CSSCompressor、mt:JSCompressorブロックタグを提供します。また、mt-staticディレクトリで Minify( http://code.google.com/p/minify/ )を利用できるようにします。

テンプレート

カスタムフィールドの値で記事を検索したい

カスタムフィールドの値でブログ記事/ウェブページを検索してループ出力するブロックタグ・プラグインです。 以下のテンプレートは、カスタムフィールド「都道府県(prefecture)」に「大阪府」を含むエントリーをループ出力します。

<mt:SearchEntryField basename="prefecture" query="大阪府">
    <mt:If name="__first__"><ul></mt:If>
        <li><mt:EntryTitle escape="html"></li>
    <mt:If name="__last__"></ul></mt:If>
</mt:SearchEntryField>

以下のテンプレートは、カスタムフィールド「都道府県(prefecture)」に「大阪」または「東京」を含むエントリーをループ出力します。

<mt:SearchEntryField basename="prefecture" query="大阪 東京" multi="1" separator=" " and_or="OR">
    <mt:If name="__first__"><ul></mt:If>
        <li><mt:EntryTitle escape="html"></li>
    <mt:If name="__last__"></ul></mt:If>
</mt:SearchEntryField>

separator モディファイア は複数の文字列を区切る文字列を指定するものです。以下の例は、上のテンプレートと同じく「大阪」または「東京」を含むエントリーをループ出力します。

<mt:SearchEntryField basename="prefecture" query="大阪,東京" multi="1" separator="," and_or="OR">
    <mt:If name="__first__"><ul></mt:If>
        <li><mt:EntryTitle escape="html"></li>
    <mt:If name="__last__"></ul></mt:If>
</mt:SearchEntryField>

MTSearchEntriesとMTSearchEntryField、エントリを絞り込むための2つのブロックタグ

文字列のトリミング時にマルチバイト文字を考慮したい

文字列をトリミングするtrimj_toモディファイアを提供します。半角文字2文字をマルチバイト文字1文字相当として文字列をトリミングします。trimj_to="10","..."のように2つめの引数を渡すと、トリミングされた文字列の後ろに指定された文字列を追加します。

MTFeedタグをダイナミックで利用したい

MTにバンドルされている feeds-app-lite プラグインはダイナミックパブリッシングや DynamicMTML に対応していませんので、同様のテンプレートタグをダイナミックで利用できるようにしたものです。

パンくずリストを自動的に作成したい

「ウェブサイト→ブログ→カテゴリ→サブカテゴリ→ブログ記事」といった感じでパンくずリストをテンプレート出力できるようにするブロックタグ・プラグインです。

<mt:Breadcrumbs>
<mt:if name="__first__"><ul></mt:if>
    <li><a href="<mt:BreadcrumbsURL>"><mt:BreadcrumbsLabel escape="html"></a></li>
<mt:if name="__last__"></ul></mt:if>
</mt:Breadcrumbs>

ブログ記事がカテゴリに属しているかどうかで処理を分岐したい

現在のコンテクストのエントリーが同じく現在のコンテクストのカテゴリーに含まれている時に評価される<mt:IfEntryIsinCategory></mt:IfEntryIsinCategory>ブロックタグを提供します。

名前を表示するMTタグが用意されていないオブジェクトの名前を表示したい

modelモディファイア、idモディファイアを指定して、そのブジェクとのtitle、name、labelのいずれかのカラムが存在する場合にそのカラムの値を出力します。 PowerCMSのグループなど、名前を出力するタグを持たないオブジェクトの名称を出力するような用途で作成しました。

以下のようにするとIDが1のブログ記事のタイトル、IDが1のカテゴリのラベルを出力します。

<mt:GetName model="entry" id="1"><mt:GetName model="category" id="1">

Internet Explorer対応に疲れた

Internet Explorerかどうかを判別するmt:IfIEタグを提供します。

<mt:IfIE>
    <mt:if name="ie_version" eq="6">
    We love Internet Explorer <mt:var name="ie_version_id">!!
    </mt:if>
</mt:IfIE>

CakePHPのViewの書き方がわからないがMTタグなら書ける

CakePHP1.3のテンプレート(View)でMTタグを利用可能にするCakePHPのプラグインです。 このプラグインを使うことでPHPを書かずにMTタグでViewが書けるようになります。

<!-- File: /app/views/posts/index.ctp -->
<h1>Blog posts</h1>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>
    <!-- Here is where we loop through our $posts array, printing out post info -->
    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $html->link($post['Post']['title'], 
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>
</table>

<!-- File: /app/views/posts/index.ctp -->
<h1><mt:var name="page_title" escape="html"></h1>
<!-- Here is where we loop through our posts array, printing out post info -->
<mt:cake:loop model="Post">
<mt:ignore>
    or <mt:cake:loop model="Post" stash="posts">
</mt:ignore>
<mt:if name="__first__">
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>
</mt:if>
    <tr>
        <td><mt:var name="id"></td>
        <td>
            <a href="./view/<mt:var name="id">"><mt:var name="title" escape="html"></a>
        </td>
        <td><mt:var name="created"></td>
    </tr>
<mt:if name="__last__">
</table>
</mt:if>
</mt:cake:loop>

CakePHPのViewでMTタグを利用可能にするMTCake

Perlモジュールやプラグインがインストールされているかどいうかで処理を分岐したい

Perlモジュールが利用可能かで分岐する mt:IfModule(mt:IfPerlModule)ブロックタグ、プラグインのインストール状況で分岐する mt:IfPlugin(mt:IfComponent)ブロックタグを提供します。

値がユニークなオブジェクトを値ごとの件数と一緒に表示したい

MTのオブジェクトを指定したカラムのすべての値から重複を取り除いたリストを取得し、それぞれの値について、その値を持つオブジェクトがいくつあるかを出力する mt:CountGroupByブロックタグを提供します。

以下の例では、ブログ記事のキーワードに登録されているすべての値を重複を取り除いて出力し、それぞれがいくつ登録されているかをファンクションタグ mt:CountGroupCount で出力します。例えばキーワード欄に都道府県名を入力した場合、「(10)大阪府」のように出力します。

<mt:CountGroupBy model="entry" not_null="1" column="keywords" sort_by="count" sort_order="descend">
    <mt:if name="__first__"><ul></mt:if>
        <li>(<$mt:CountGroupCount$>)<$mt:CountGroupValue escape="html"$></li>
    <mt:if name="__last__"></ul></mt:if>
</mt:CountGroupBy>

テンプレートの一覧を表示したい

テンプレートのリストを取得する mt:Templatesブロックタグを提供します。以下の例は、すべてのテンプレートをCSV出力します。提出ドキュメントの作成のお伴に。

<mt:Templates include_blogs="all" sort_by="blog_id" type="index" build_type="1" html="1"><mt:TemplatesHeader>ブログ名,テンプレート名,blog_id,template_id,管理画面URL<mt:For regex_replace="/(?<!\r)\n|\r(?!\n)/","\r\n">
</mt:For></mt:TemplatesHeader>"<$MTBlogName regex_replace='/(?=")/g','"'$>","<$MTVar name="template_name" regex_replace='/(?=")/g','"'$>",<$MTVar name="template_blog_id"$>,<$MTVar name="template_id"$>,<$MTCGIPath$><$MTAdminScript$>?__mode=view&_type=template&id=<$MTVar name="template_id"$>&blog_id=<$MTVar name="template_blog_id"$><mt:For regex_replace="/(?<!\r)\n|\r(?!\n)/","\r\n">
</mt:For></mt:Templates>

Movable TypeのテンプレートリストをCSV出力

クッキーの値で条件分岐したい

mt:GetCookieを使えば <mt:GetCookie name="foo" setvar="foo"> のように一旦変数に入れることで Cookie によって分岐させることが可能でしたが、このプラグインにより、以下のような形式で Cookie の値を変数に入れることなくダイレクトにテンプレートで分岐することができるようになります。

<mt:ifCookie name="foo" eq="1">
    Cookie "foo" が "1" の時に処理される
</mt:ifCookie>

<mt:ifCookie name="foo" like="bar">
    Cookie "foo" に "bar" が含まれる時に処理される
</mt:ifCookie>

<mt:ifCookie name="foo" gt="2">
    Cookie "foo" が "2" より大きい値の時に処理される
</mt:ifCookie>

Cookieを利用してスマホビューとPCビューを切り替える(MTIfCookieタグ)

流入元サイトによって分岐処理したい

流入経路(流入元のドメイン)によって表示を切り替える mt:IfTheHTTPReferer ブロックタグ(条件タグ)を提供します。動的分岐なので、ダイナミックパブリッシング、DynamicMTML または mt-search.cgi 等の動的に提供されるページでのみ動作します。

<mt:IfTheHTTPReferer domain="www.google.com">
www.google.comからの流入
</mt:IfTheHTTPReferer>

<mt:IfTheHTTPReferer domain="google.com" scope="backward">
*google.comからの流入
</mt:IfTheHTTPReferer>

<mt:IfTheHTTPReferer domain="www.google" scope="foward">
www.google* からの流入(www.google.com や www.google.co.jp)
</mt:IfTheHTTPReferer>

<mt:IfTheHTTPReferer domain="google" scope="contains">
googleを含むドメインからの流入
</mt:IfTheHTTPReferer>

<mt:IfTheHTTPReferer scope="empty">
リファラが空の場合
</mt:IfTheHTTPReferer>

DynamicMTMLでサイトの参照元ドメインによって分岐する(IfTheHTTPRefererプラグイン)。

クッキーに値をセットしたり、クッキーの値をクリアしたりしたい

Cookieをセット(mt:SetCookie)/クリア(mt:ClearCookie)するファンクションタグです。

以下の例では、クッキー"foo" に 値 "bar" をセットします(テンプレートのビルド処理時に処理を行いますので、必ずしもテンプレートの先頭に書く必要はありません)。動的処理ですので、ダイナミックパブリッシング、DynamicMTML または mt-search.cgi 等の動的に提供されるページでのみ動作します。

<mt:SetCookie name="foo" value="bar">
オプションで以下のモディファイアを指定できます。

<mt:SetCookie name="foo" value="bar"
    [expires="86400", [path="/", [domain="alfasado.net",
    [secure="1", [reload="1"]]]]]>

reload="1" を追加すると、指定した名前のクッキーが新たにセットされた時にウィンドウをリロードします。

クッキーをクリアするには MTClearCookie タグを使います。MTClearCookieタグにもreload="1" を指定することができます。

<mt:ClearCookie name="foo">

MTタグでCookieを操作する(MTSetCookie,MTClearCookieタグ)

MTタグで動的サイトをつくりたい

We've moved to movabletype/DynamicMTML.

CSVファイルを検索したい

サーバー上のCSVの中身をダイナミックパブリッシングまたはDynamicMTMLを利用して検索する mt:SearchCSV ブロックタグを提供します。fileモディファイアでファイルのパスを指定、cellモディファイアで対象となるセルの配列を regexモディファイアで検索条件(正規表現)を指定します。sort_byモディファイア(並べ替えるセル)、sort_orderでソート条件を指定できます。and_orモディファイアでAND検索かOR検索を指定可能です。

<mt:DynamicMTML>
<mt:SearchCSV file="/var/www/html/csv/book.csv" cell="0","1","2" regex="/CMS/","/CMS/","/野田/" sort_by="3" and_or="or" sort_order="descend">
<mt:if name="__first__"><ul></mt:if>
<li>
<dl><dt><mt:var name="__item_0"></dt>
<dd>本文:<mt:var name="__item_1"><br />
著者:<mt:var name="__item_2"></dd>
</dl>
</li>
<mt:if name="__last__"></ul></mt:if>
</mt:SearchCSV>
</mt:DynamicMTML>

CSVを利用してカスタムオブジェクトやエントリを条件指定検索する

動的に言語の切り替わる多言語サイトをつくりたい

ダイナミックパブリッシングまたはDynamicMTMLで利用可能な mt:Translateタグを提供します。Accept-LanguageやCookieを見て、用意された言語ファイルを使って出力を出し分けます。 変換テーブルは /plugins/Translate/php/l10n/l10n_ja.php などの言語毎のテーブルに登録します。

<mt:Translate phrase="Hi,[_1]" params="$username">

カテゴリ/日付アーカイブの中でインデックスコンテキストとして評価したい、またはコンテキストを変更したい

ブロックタグ内のコンテクストをセットする mt:SetContext ブロックタグ、コンテクストをクリアする(つまり、このタグ内ではインデックス・アーカイブとして評価される) mt:ClearContext ブロックタグを提供します。ブログ、カテゴリ、エントリや日付アーカイブの範囲指定などが可能です。

<MTSetContext category_id="n"></MTSetContext>
<MTSetContext category="Foo"></MTSetContext>
<MTSetContext current_timestamp="YYYYMMDDhhmmss"></MTSetContext>
<MTSetContext current_timestamp_end="YYYYMMDDhhmmss"></MTSetContext>
<MTSetContext author="junnama"></MTSetContext>
<MTSetContext entry_id="n"></MTSetContext>
<MTClearContext>インデックスアーカイブとして評価</MTClearContext>

開発とデバッグ

サーバー環境変数やクッキーの値を取得したい

サーバー環境設定を表示する MTGetEnv ファンクションタグ、Cookieを表示する MTGetCookie ファンクションタグを提供します。

<mt:GetEnv name="HTTP_USER_AGENT" setvar="UserAgent">
<mt:GetCookie name="session_id" setvar="SessID">

テンプレート変数のキーと値を調べたい

デバッグ、開発用のMTタグを提供します。

  • mt:VarDump:テンプレート変数のキーと値をダンプ表示します
  • mt:EnvDump:サーバー環境変数のキーと値をダンプ表示します
  • mt:CookieDump:クッキーのキーと値をダンプ表示します
  • mt:QueryDump:リクエストクエリーのキーと値をダンプ表示します

ダイナミックパブリッシングエラーをログに残したい

MTSetErrorHandlerブロックタグで囲まれた中身でダイナミックパブリッシングエラーが発生した際に、エラーページ/メッセージを表示せずにMTのシステムログにエラー内容を出力します。 ファンクションタグMTErrorでは message モディファイアで指定したエラーを強制的に発生させます。MTErrorタグはスタティックパブリッシングにも対応しています。

<mt:SetErrorHandler>
    <mt:Error message="mt:Errorテンプレートタグでエラーが発生しました。">
</mt:SetErrorHandler>

MTタグを簡単に開発したい

config.yaml を書くことなく、MTのテンプレートタグ・プラグインを簡単に作成できるようになります。 plugins/EasyMTML/perl または plugins/EasyMTML/php 以下に、function.mthello.pl、function.mthello.php といったファイルを設置することで、タグ mt:Hello を登録できます。ブロックタグ、条件タグ、モディファイアにも対応しています。

PowerCMSのカスタマイズを覚えたい

PowerCMSのプラグイン「Campaign(バナー機能)」を拡張するプラグインのサンプルです。

PowerCMSプラグイン開発勉強会フォローアップ(1) - サンプルプラグイン

MTタグを作れるようになりたい

ブロックタグ、条件タグ、ファンクションタグ、モディファイアのサンプル。はじめてMTタグプラグインを作成する人の教材用です。

クエリ文字列を取得したい

GET/POSTクエリ文字列を出力します(mt:QueryString ファンクションタグ)。主にデバッグ用。出力する際には escape="html"モディファイアの指定が必要です(公開するサイトで使う人はいないと思いますが)。

クエリ文字列をログに残したい

GET/POSTクエリ文字列をログに出力します(mt:Query2Log ファンクションタグ)。主にデバッグ用。

投稿フォームに「enctype=multipart/form-data」を追加したい

ブログ記事やカテゴリの編集画面のform要素に「enctype=multipart/form-data」を追加します。

セキュリティ

パスワードに有効期限を設定したい

管理画面のパスワードに有効期限を指定できるようにします。環境変数「PasswordExpiredPeriod(初期値は30)」で有効期限を指定できます。「PasswordExpired 1」とすると、有効期限切れのユーザーはログインできなくなります(指定がない場合は警告+ユーザー情報編集画面へのリダイレクト)。

古いバージョンのMTのセキュリティが心配

MT5.02で提供されたセキュリティパッチ(の一部)モンキーパッチです(バージョンアップできない方の気休め程度と考えてくださいね)。

[重要] セキュリティアップデート Movable Type 5.02 の提供を開始

ソーシャル連携・API

Weibo(新浪微博)とブログを連携させたい

ブログ記事/ウェブページをWeibo(新浪微博)にマルチポストするプラグイン。Weibo(新浪微博)は中国版Twitter/Facebookともいえるサービスで、現在では2億人を超えているともいわれています。日本企業や日本人タレント、日本の自治体なども活用しています。

Weibo(新浪微博)にクロスポストするプラグイン

Yahoo! PipesにMTタグで値を渡して結果を表示させたい

Yahoo! Pipesを使ってテキストを加工する(翻訳など)プラグインです。

<mt:YahooPipes _id="f4e7115e32a8b5438e256a8c80d32a1e" text="こんにちは" input="text" output="description">

Yahoo! Pipesを経由して簡体字でWeibo(新浪微博)へ投げてみたり

Facebookとブログを連携させたい

ブログ記事やウェブページをFacebookのウォールやFacebookページの「大事な出来事」にマルチポストするプラグインです。投稿内容をテンプレートで細かくカスタマイズできるのが特徴。

トラブルシューティング

サーバータイムアウトでブログを削除できない

コマンドラインからブログを削除します。ブログ配下のオブジェクトが多い場合に管理画面ではタイムアウトになってしまうケースがあるために作成しました。toolsディレクトリに設置し、以下のように実行します。

perl ./remove-blogs --blog_id 2,3,4

管理画面からSQLを実行したい

管理画面からSQLを発行して結果と実行にかかった速度を計測できます。mt-config.cgiに「AllowThrowSQL 1」の指定が必要です。

データベースの不整合を解消したい

データベースの不整合(オブジェクトの親子関係)を解消するスクリプトです。データベースのバックアップを必ずとってから利用してください。

データベースの不整合によるエラーの調査や修復を行う

Shift_JISのページが文字化けする

サーバーのコンフィグファイルに AddDefaultCharset UTF-8 が指定されている時に Shift_JISのページを表示させると文字化けします。DynamicMTMLが有効な環境下で、文字化けを解消するプラグインです。

その他

WordPressのテンプレートをMTMLで書きたい

WordPressのデータをMTタグで取得できます。以下はテンプレートの例です。DynamicMTMLが必要です。

<mt:wp:Entries category="Foo" limit="20"> <mt:if name="__first__"><ul></mt:if> <li class="<mt:if name="__odd__">odd<mt:else>even</mt:if>"> <a href="<$mt:wp:EntryPermalink$>"> <$mt:wp:EntryTitle escape="html"$> (<$mt:wp:EntryAuthorDisplayName$> / <$mt:wp:EntryDate format="%b %Y"$>) </a> <mt:wp:EntryCategories glue=","> <mt:if name="__first__">Categories:</mt:if> <a href="<$mt:wp:CategoryLink$>"> <$mt:wp:CategoryLabel$> </a> </mt:wp:EntryCategories> <mt:wp:EntryTags glue=","> <mt:if name="__first__">Tags:</mt:if> <a href="<$mt:wp:TagLink$>"> <$mt:wp:TagName$> </a> </mt:wp:EntryTags> </li> <mt:if name="__last__"></ul></mt:if> </mt:wp:Entries>

WordPressのテンプレートをMovable Typeのタグで処理する

そろそろエイプリールフールの準備をしたい

<mt:IfAprilFoolsday></mt:IfAprilFoolsday> または <mt:IfAprilFool></mt:IfAprilFool> とすることで、エイプリルフール(4月1日)のみ内容が評価されるネタプラグイン(条件タグ)。

リンク切れをなくしたい(存在しないページへのリンクを非表示にしたい)

urlモディファイアに指定したページが存在する場合にブロックタグの中身を評価します。

<mt:IftheURLFound url="http://alfasado.net/" target_outlink="1">
    <a href="http://alfasado.net/">アルファサード</a>
</mt:IftheURLFound>

MTで管理されているサイト内であれば、静的ファイルがあるかどうか、もしくはダイナミックパブリッシングで有効なURLかどうかを評価します。target_outlinkモディファイアを指定すると外部リンクのチェックを行います。関連するページが削除された時なんかにリンクが切れないようにすることができます(と、いうかリンク切れを非表示にするということですね)。

ファイルの出力パスを一時的に変更したい

再構築ウィンドウに表示されるチェックボックスにチェックを入れると、プラグイン設定で指定したパスにファイルを出力します。再構築終了時にアイテムを指定パスにコピーすることも可能です。簡易的なステージング運用を想定しています。

システムログを自動的にローテーションさせたい

MTのシステムログをログローテーションします。設定はすべて管理画面のシステムプラグイン設定で行えます。


さて、いかがでしたでしょうか。キャプチャとか付けて解説するとか言っちゃったらしいんですが、とても手が回りませんでした><

今年も残り僅かですね。みなさま、良いクリスマスを。そしてよいお正月を。

BUNさんご無沙汰してます。インスパイアされたというか、こういう方法もあるよ、ということで小ネタメモ。phpコードとテンプレートタグを同じファイルとかに書くのはどうなんだという話しはこの際置いておいて、DynamicMTML有効時、同じファイルの中でMTタグとphpで変数の受け渡しをする方法について。

こんな感じで

<?php
    global $app;
    $ctx = $app->ctx;
    $blog = $ctx->stash( 'blog' );
    //mt:var name="blog_name" にセット
    $ctx->__stash[ 'vars' ][ 'blog_name' ] = $blog->name;
    
?>

<!--phpでセットしたvarの取得-->
<mt:var name="blog_name">

<!--MTタグ側でsetvarする-->
<mt:BlogURL setvar="blog_url">

<?php
    //MTタグでsetvarした値を取得
    echo $ctx->__stash[ 'vars' ][ 'blog_url' ];
?>

Facebook

Twitter

このアーカイブについて

このページには、2012年12月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年11月です。

次のアーカイブは2013年1月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6