<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Power CMS for MT ブログ</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://powercms.alfasado.net/blog/atom.xml" />
    <id>tag:powercms.alfasado.net,2008-10-28:/blog//1</id>
    <updated>2011-12-02T08:10:55Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Enterprise 4.27-ja</generator>

<entry>
    <title>DynamicMTMLのFAQ</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/12/faq.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.283</id>

    <published>2011-12-02T06:00:00Z</published>
    <updated>2011-12-02T08:10:55Z</updated>

    <summary>DynamicMTMLについてよく見かけるエラーのケースなどを紹介します。 40...</summary>
    <author>
        <name>渡邊</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=249</uri>
    </author>
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>DynamicMTMLについてよく見かけるエラーのケースなどを紹介します。</p>

<h3 class="level3">404 Not Found ページが表示される</h3>
<p>ダイナミックパブリッシングのページにアクセスすると「404 Not Found」が返ってくる。</p>
<dl class="definition">
	<dt>原因1</dt>
	<dd>動作に必要なファイル/ディレクトリが存在しない</dd>
	<dt>対策1</dt>
	<dd>下記が存在するか確認します
		<ul>
			<li>.htaccess ファイル</li>
			<li>mtview.php (.mtview.php) ファイル</li>
			<li>templates_c ディレクトリ</li>
		</ul>
	</dd>
	<dt>原因2</dt>
	<dd>設置された .htaccess が動作していない</dd>
	<dt>対策2</dt>
	<dd>.htaccess が動作するか確認します。
		利用可能なディレクティブにもよりますが、リダイレクトが可能であれば下記例でGoogle へアクセスが転送されると思います。
		<pre class="code"><code>Redirect / http://www.google.co.jp/</code></pre>
		</dd>
</dl>

<h3 class="level3">PHPのソースが表示される</h3>
<p>(静的)ダイナミックパブリッシングを利用した際に PHP のソースコードが表示される。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>PHP が動作していない</dd>
	<dt>対策</dt>
	<dd>PHP が動作するかサーバの設定などを確認します</dd>
</dl>

<h3 class="level3">異なるパラメータでアクセスした際、前回アクセス時の内容が表示される</h3>
<p>パラメータの内容によって表示結果が変わる設定で、パラメータを変えても同じ結果が表示される。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>ダイナミックパブリッシングのキャッシュ機能が効いている</dd>
	<dt>対策</dt>
	<dd>ウェブサイト/ブログの全般設定画面で「キャッシュする」のチェックを外して保存する</dd>
</dl>

<h3 class="level3">「ページが見つかりません。 An error occurs」と表示される</h3>
<p>(静的)ダイナミックパブリッシングのページにアクセスすると下記のメッセージが表示される。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>何らかの要因によって「ダイナミックパブリッシングエラー」システムテンプレートの内容が出力されている</dd>
</dl>

<p>この場合、下記の操作を行う事でエラーの原因を絞り込む事ができます。</p>

<ol>
	<li>mt-config.cgi に環境変数<code>DebugMode</code>を記述します。
		<pre class="code"><code>DebugMode 1</code></pre>
	</li>
	<li>再度エラーページへアクセスします。</li>
	<li>「An error occurs」と表示されていた部分のメッセージが変化しているか確認します。</li>
</ol>

<p>「An error occurs」が別のメッセージに変化したら、そのメッセージの内容に対して何らかの対策を行ってください。
下記にエラーメッセージ例の一部を紹介します。</p>

<dl class="definition">
	<dt>エラーメッセージの内容</dt>
	<dd><blockquote class="quote"><p><code>mktime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead</code></p></blockquote>
</dd>
	<dt>原因</dt>
	<dd>php.ini に date.timezone の指定がされていない</dd>
	<dt>対策</dt>
	<dd>php.ini で date.timezone の設定を行ってください
		<pre class="code"><code>date.timezone = Asia/Tokyo</code></pre>
		参考: <a href="http://jp.php.net/manual/ja/datetime.configuration.php#ini.date.timezone">PHP: 実行時設定 - Manual</a>
	</dd>
</dl>

<dl class="definition">
	<dt>エラーメッセージの内容</dt>
	<dd><blockquote class="quote"><p><code>is_readable() [&lt;a href='function.is-readable'&gt;function.is-readable&lt;/a&gt;]: open_basedir restriction in effect. File(/plugins/block.mtblogname.php) is not within the allowed path(s): (/tmp)</code></p></blockquote></dd>
	<dt>原因</dt>
	<dd>ダイナミックパブリッシングの動作に必要な PHP ファイルを読み込めない</dd>
	<dt>対策</dt>
	<dd>
		<ul>
			<li>php.ini の設定で open_basedir が指定されている場合は設定を解除するか、設定を変更します</li>
			<li>PHP ファイルのパーミッション、/path/to/mt/php ディレクトリのパーミッションを確認します</li>
		</ul>
		参考: <a href="http://jp.php.net/manual/ja/ini.core.php#ini.open-basedir">PHP: コア php.ini ディレクティブに関する説明 - Manual</a>
	</dd>
</dl>

<h3 class="level3">画面が途中まで表示される</h3>
<p>(静的)ダイナミックパブリッシングのページが途中まで表示された状態になる。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>PHP を実行するためのメモリが足りない</dd>
	<dt>対策</dt>
	<dd><ul>
		<li>php.ini で memory_limit の指定値を上げます</li>
		<li>mtview.php (.mtview.php) に下記の記述を加え、指定値を上げます
			<pre class="code"><code>ini_set( 'memory_limit', '64M' );</code></pre></li>
		</ul>
	</dd>
</dl>

<p>PHP の実行に必要なメモリは環境や運用方法によって異なりますのでサーバ管理者と相談するなど適宜設定ください。</p>

<h3 class="level3">サムネイルが生成されない</h3>
<p>ダイナミックパブリッシングのテンプレートでサムネイル画像が生成されない。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>PHP モジュールの GD が利用できない</dd>
	<dt>対策</dt>
	<dd><ul>
		<li>GD が利用できるか確認します</li>
		<li>GD がインストールされているか確認します</li>
		<li>GD で利用可能な画像の種類に制限がないか確認します (画像の拡張子によっては正常に動作する場合)</li>
		</ul>
	</dd>
</dl>

<h3 class="level3">文字化けする</h3>
<p>ダイナミックパブリッシングで出力したページが文字化けする。</p>
<dl class="definition">
	<dt>原因</dt>
	<dd>PHP の mbstring モジュールが利用できない</dd>
	<dt>対策</dt>
	<dd><ul>
		<li>mbstring が利用できるか確認します</li>
		<li>mbstring がインストールされているか確認します</li>
		</ul>
	</dd>
</dl>

<h3 class="level3">画面がホワイトアウトする (何も表示されない)</h3>
<p>この状態から原因の特定は困難だが、多くはエラーメッセージがでるケースの原因が当てはまるので PHP モジュールや設定を確認する。</p>
<p>他ケースの原因に当てはまらない場合は下記を確認する</p>

<dl class="definition">
	<dt>原因1</dt>
	<dd>mt-config.cgi のDBHost に下記の指定を行っている
	<pre class="code"><code>DBHost 127.0.0.1</code></pre></dd>
	<dt>対策1</dt>
	<dd>mt-config.cgi のDBHost を下記のように変更します
	<pre class="code"><code>DBHost localhost</code></pre></dd>
</dl>

<dl class="definition">
	<dt>原因2</dt>
	<dd>PHP でデータベースにアクセスできない</dd>
	<dt>対策2</dt>
	<dd>PHP でデータベースにアクセスできるかサーバ管理者などに確認する</dd>
</dl>


<h3 class="level3">Movable Type標準のダイナミックパブリッシングの動作確認</h3>
<p>PowerCMSのダイナミックパブリッシングは、Movable Type のダイナミックパブリッシングが動作する事が前提条件になります。そのMovable Type標準のダイナミックパブリッシングは下記の手順で動作確認が行えます。</p>
<ol>
	<li>MT 標準のテーマが適用されたウェブサイト/ブログを用意する</li>
	<li>「公開」オプションで「ダイナミック」を選択したインデックステンプレートを作成します</li>
	<li>ウェブサイト/ブログのトップに .htaccess と mtview.php が生成されたか確認します
		<dl class="definition">
			<dt>生成されない場合</dt>
			<dd>ディレクトリのパーミッションを確認します</dd>
		</dl>
	</li>
	<li>作成したテンプレートに MTタグを一切記述せずに「テスト」とだけ記述します</li>
	<li>作成したインデックステンプレートの出力先にアクセスします</li>
	<li>「テスト」と表示されるか確認します
		<dl class="definition">
			<dt>表示されない場合</dt>
			<dd>date.timezone や open_basedir など他ケースの原因について確認します</dd>
		</dl>
	</li>
	<li>テンプレートの内容を「&lt;$MTBlogName$&gt;」に変更します</li>
	<li>作成したインデックステンプレートの出力先にアクセスします</li>
	<li>ブログ名が出力されるか確認します
		<dl class="definition">
			<dt>表示されない場合</dt>
			<dd>date.timezone や open_basedir など他ケースの原因について確認します</dd>
		</dl>
	</li>
</ol>

<h3 class="level3">「キャッシュする」と「ビルド結果をキャッシュする」の違いについて</h3>
<p>同じ全般設定画面にある設定ですが、「キャッシュする」はMT標準の、「ビルド結果をキャッシュする」はPowerCMS標準のもので、その機能は異なります。</p>

<h4 class="level4">キャッシュする</h4>
<p>「キャッシュする」はパラメータの内容には対応していないため下記は同一の扱いになり、どちらへアクセスしても同じ結果が出力されます。</p>
<ul>
	<li>/hoge.html?foo=1</li>
	<li>/hoge.html?bar=2</li>
</ul>

<p>PowerCMS ver.3 をご利用の場合、ツールメニューの「ダイナミックキャッシュをクリアする」よりキャッシュファイルの削除が行えます。</p>

<h4 class="level4">ビルド結果をキャッシュする</h4>
<p>「ビルド結果をキャッシュする」はパラメータの内容に対応しているため下記は同一の扱いにはならず、別々にキャッシュされます。(テンプレートで、パラメータの内容によって出力結果を変化させている場合です)</p>
<ul>
	<li>/hoge.html?foo=1</li>
	<li>/hoge.html?bar=2</li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>レンタルサーバー等でのスマートフォンオプションのテーマの適用について</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/11/post_12.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.281</id>

    <published>2011-11-22T01:22:49Z</published>
    <updated>2011-11-22T01:45:59Z</updated>

    <summary>レンタルサーバー等でスマートフォンオプションのテーマを適用したブログが表示の際に...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>レンタルサーバー等でスマートフォンオプションのテーマを適用したブログが表示の際に500エラーを返すといったトラブルがあった際に参考にしてください。以下は<a href="http://heteml.jp/">heteml</a>の例です。</p>



<ol>
	<li>スマートフォンオプションのテーマを適用したブログではブログのサイト・ルート直下に.htaccessが生成されています。.htaccessから、php_flag short_open_tag off *の記述を#でコメントアウトしてください。</li>
	<li>hetemlサーバーのPHPのバージョンを確認する必要があります。確認方法は <a href="http://heteml.jp/support/manual/php5/">http://heteml.jp/support/manual/php5/</a> をご確認ください。</li>
	<li>ご利用のhetemlサーバーのコントロールパネルにログインしてください。</li>
	<li>右サイドのメニューにある "php.ini 設定" をクリックします。</li>
	<li>2.でご確認いただいたPHPのバージョンのタブを開きます。</li>
	<li>short_open_tag の項目がありますのでOff に変更後、[php.iniを設定する] ボタンをクリックして保存してください。</li>
</ol>

<p>* この設定(php_flag short_open_tag )は &lt;? といった記述でもPHPのコードとして解釈するかどうかを設定するもので、これが有効になっていることでXML宣言がPHPコードとして解釈されてしまうのを避けるためにDynamicMTML側で.htaccessに記述を追加しているものです。サーバーのApacheの設定で、.htaccessにこの記述をすることが許可されていないサーバーではこのエラーが発生します。php.ini側で設定するか、上記のようにサーバに用意されているコントロールパネルから設定することでエラーを回避できる可能性があります。</p>

<p>また、同じくphp.iniで  date.timezone の設定がない場合もエラーになります。この場合、 php.iniにdate.timezone = Asia/Tokyo と設定してみてください。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>～マルチデバイス対応をスマートに実現～DynamicMTML勉強会＋Hack-A-Thon</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/09/dynamicmtmlhack-a-thon.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.277</id>

    <published>2011-09-27T04:18:41Z</published>
    <updated>2011-09-28T04:03:49Z</updated>

    <summary>追記: 定員になりましたので受付を終了しました。 スマートフォンの普及を背景に「...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="イベント・セミナー情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p><strong>追記: 定員になりましたので受付を終了しました。</strong></p>

<hr />

<p>スマートフォンの普及を背景に「レスポンシブWebデザイン」(Responsive Web Design)という制作手法が注目を集めてます。Movable TypeをPHPによって拡張した<a href="https://github.com/alfasado/DynamicMTML">DynamicMTML</a>(ダイナミックMTML)を利用するとCSS3のメディアクエリーやjQuery Mobileといったクライアントサイドのアプローチに加えてサーバーサイドでの振り分け、ガラケー対応、画像の最適化などがPHPやJavaScriptの知識なしに実装できます。
この勉強会では、DynamicMTMLのテンプレート作成方法に加え、DynamicMTMLの内側の解説やPHPによる拡張方法の解説、PHPによるプラグインの作成方法について紹介します。</p>

<p>また、勉強会の後は実際に手を動かしてテンプレートやプラグインを作成するHack-A-Thonを行います(PCはご持参ください。ゲスト用無線LAN使えます)。アルファサードの開発者だけでなく、シックス・アパートのMT開発者も参加予定です。普段中々聞く機会のないMTのPHP活用について知識を得るチャンスです。若干名ですが参加可能です(参加無料)。</p>

<ul>
	<li>日時: 9月30日(金)14:00～</li>
	<li>場所: アルファサード 東京オフィス</li>
	<li>東京都千代田区神田神保町3-10-3　松晃ビル8F<br />電話：03-3265-8488<br />http://alfasado.net/contents/company_profile.html#tokyo
	<li>主催: アルファサード有限会社</li>
	<li>定員: 12名</li>
</ul>

<ul>
	<li>14:00～ PHPで作るMovable Typeプラグイン(仮)<br />講演者: シックス・アパート 高山さん</li>
	<li>14:30～ Inside DynamicMTML～PHPによるフレームワークの詳細解説<br />講演者: アルファサード 野田</li>
	<li>15:30～ Hack-A-Thon</li>
	<li>19:30～ 成果発表</li>
	<li>20:30～ 懇親会(会費制)</li>
</ul>

<p><a href="https://www.alfasado.co.jp/contents/contact.html">参加ご希望の方はお問合せください。</a></p>
]]>
        
    </content>
</entry>

<entry>
    <title>カスタムフィールドで指定したグループ名を出力</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/08/post_11.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.274</id>

    <published>2011-08-22T10:14:45Z</published>
    <updated>2011-08-22T11:16:37Z</updated>

    <summary>“カスタムフィールドで指定したグループ名を出力する方法はありますか?”というご質...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 3" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="サポート" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="テンプレート作成Tips" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>“カスタムフィールドで指定したグループ名を出力する方法はありますか?”というご質問をサポートにいただきました。Power CMS 3の新機能であるカスタムフィールドPro(MT標準のカスタムフィールドタイプを大幅に拡張するもの)で出来るようになった「個別のオブジェクト」と「オブジェクトのグループ」をカスタムフィールドで関連づける機能を使った時にテンプレートでグループ名を出したいといったケースだと思います。</p>

<p>「個別のオブジェクト」と「オブジェクトのグループ」の紐づけというのは例えば「ブログ記事」に「ブログ記事のグループ」を紐付けるといった同一のオブジェクトの関連付けや、「ブログ記事」に「バナーのグループ」を紐付けるといったような異なるオブジェクトのグループの関連付けを指します。</p>

<p>テンプレートの紹介の前に簡単にこの機能についてご紹介します。</p>

<p>グループ機能とは下記のキャプチャのように左側にオブジェクトの一覧、右側へドラッグ&amp;ドロップしてオブジェクトをグループ化、表示順をマウス操作で自在に設定できるものです(キャプチャはバナー(広告)グループの編集画面)。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://powercms.alfasado.net/blog/2011/08/22/Firefox009.jpg"><img alt="バナーグループの編集画面" src="http://powercms.alfasado.net/blog/assets_c/2011/08/Firefox009-thumb-496x343-1195.jpg" width="496" height="343" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">関連情報</h3>

<ul>
	<li><a href="http://powercms.alfasado.net/blog/2010/06/post_6.html">新しくなったグループ&amp;ソート機能</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2009/04/objectgroup.html">オブジェクトをグループ化・表示順を自在に制御するプラグイン</a></li>
</ul>

<p>カスタムフィールドの作成時にカスタムフィールドの種類のところでグループを選択します。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://powercms.alfasado.net/blog/2011/08/22/groupobject.jpg"><img alt="カスタムフィールドの作成画面" src="http://powercms.alfasado.net/blog/assets_c/2011/08/groupobject-thumb-496x421-1191.jpg" width="496" height="421" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">指定できるグループ</h3>

<ul>
	<li>ブログ記事グループ</li>
	<li>ウェブページグループ</li>
	<li>ブログ記事/ウェブページグループ(ブログ記事/ウェブページの混在)</li>
	<li>カテゴリグループ</li>
	<li>フォルダグループ</li>
	<li>カテゴリ/フォルダグループ(カテゴリ/フォルダの混在)</li>
	<li>ウェブサイトグループ</li>
	<li>ブロググループ</li>
	<li>ウェブサイト/ブロググループ(ウェブサイト/ブログの混在)</li>
	<li>オブジェクトグループ(ウェブサイト/ブログ/カテゴリ/フォルダ/ブログ記事/ウェブページの混在)</li>
	<li>アイテムグループ</li>
	<li>バナーグループ(広告)</li>
	<li>リンクグループ</li>
	<li>テンプレートグループ</li>
	<li><a href="http://www.powercms.jp/features/object.html">カスタムオブジェクト</a></li>
	<li>カスタムオブジェクトを継承して作成されたオブジェクト</li>
</ul>


<p>「システムオブジェクト」として指定したオブジェクト(例:ブログ記事)の編集画面に以下のようなボタンが表示されますので、リンクをクリックしてダイアログから作成したグループを選択します。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://powercms.alfasado.net/blog/2011/08/22/Firefox011.jpg"><img alt="グループの選択ボタン" src="http://powercms.alfasado.net/blog/assets_c/2011/08/Firefox011-thumb-496x57-1193.jpg" width="496" height="57" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

<p>通常MTのカスタムフィールドはファンクションタグになりますが、Power CMSのグループについてはブロックタグになり、グループに登録されたアイテムが指定した順番通りに出力されます。例えばタグを「EntryBannerGroup」とした場合、以下のようにテンプレートを書くことができます。</p>

<pre><code style="overflow:auto">&lt;MTEntryBannerGroup&gt;
&lt;mt:if name=&quot;__first__&quot;&gt;&lt;ul&gt;&lt;/mt:if&gt;
&lt;li&gt;&lt;a href=&quot;&lt;$MTCampaignURL encode_html=&quot;1&quot;$&gt;&quot;&gt;&lt;img src=&quot;&lt;$MTCampaignBannerURL encode_html=&quot;1&quot;$&gt;&quot; width=&quot;&lt;$MTCampaignBannerWidth$&gt;&quot; height=&quot;&lt;$MTCampaignBannerHeight$&gt;&quot; alt=&quot;&lt;$MTCampaignTitle encode_html=&quot;1&quot;$&gt;&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;mt:if name=&quot;__last__&quot;&gt;&lt;/ul&gt;&lt;/mt:if&gt;
&lt;/MTEntryBannerGroup&gt;</code></pre>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">カスタムフィールドで指定したグループ名を出力する</h3>

<p>さて、ようやく本題です。Power CMS標準ではグループ名を出力することはできませんが、下記の方法で取得することができるようになります。</p>

<p>まず、GetNameプラグインをインストールします。modelモディファイアとidモディファイアを指定して、そのオブジェクトの名前を出力するプラグインです。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-get-name">alfasado/mt-plugin-get-name - GitHub</a></li>
</ul>

<p>Power CMSのグループカスタムフィールドタグに raw=&quot;1&quot; モディファイアを付けます。こうすることで、選択された(関連付けられた)グループのIDを得ることができます。そのIDをGetNameプラグインを用いて出力します。</p>

<pre><code style="overflow:auto">&lt;MTEntryBannerGroup raw=&quot;1&quot; setvar=&quot;group_id&quot;&gt;&lt;/MTEntryBannerGroup&gt;
&lt;MTGetName model=&quot;campaigngroup&quot; id=&quot;$group_id&quot; escape=&quot;html&quot;&gt;</code></pre>

<p>実はこのプラグインはサポートへの質問を受けて作成したものです。Power CMSのサポートチームではお客さまのご要望へお答えする、お客さまの課題を解決するために様々なサポートを行っています。マニュアルを見て“できそうにないな”と思った件でもお気軽にサポートへ相談してみてください。このような形で解決策をご提示できるかもしれません。</p>



]]>
        
    </content>
</entry>

<entry>
    <title>Movable TypeのテンプレートリストをCSV出力</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/08/movable_typecsv.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.272</id>

    <published>2011-08-09T05:27:25Z</published>
    <updated>2011-08-09T05:41:17Z</updated>

    <summary>Movable Type案件での納品時のドキュメント、皆さんはどのようなものを作...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="テンプレート作成Tips" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>Movable Type案件での納品時のドキュメント、皆さんはどのようなものを作成していますか? <a href="http://alfasado.net/">アルファサード</a>ではプラグイン開発やカスタムWebアプリ等を作る際には設計ドキュメントやテーブルスキーマ一覧、テスト仕様書やテストのエビデンス等を作成しますが、テンプレート構築を含む案件ではテンプレートの一覧を作成してどの部分を修正するためにはどのテンプレートが対象になるかを一覧にして渡すケースもあるかと思います。</p>

<p>もちろん、テンプレート名やソースから直感的に「どの部分の修正はどこ」が分かるような作り方をしておくのがベターなのはいうまでもありません。</p>

<p>また、再構築処理の最適化のために再構築トリガーの洗い出しにテンプレートの一覧を出力したいといったケースもあるでしょう。そういうシーンでのテンプレートリストを出力する用途でTemplatesプラグインを作成しました。</p>

<p>以下のテンプレートはすべてのウェブサイト/ブログのインデックス・テンプレートのうち公開オプションが「スタティック(既定)」且つ拡張子htmlのものをCSVとして出力するテンプレートです。<strong><a href="http://powercms.jp/">Power CMS for MT</a>がインストールされている場合、エンコーディング欄の「このアーカイブをShift_JIS出力する出力する」にチェックを入れて、Windows 向けの CSV を書き出すことができます。</strong></p>

<pre><code style="overflow:auto">&lt;MTTemplates include_blogs=&quot;all&quot; sort_by=&quot;blog_id&quot; type=&quot;index&quot; build_type=&quot;1&quot; html=&quot;1&quot;&gt;&lt;MTTemplatesHeader&gt;ブログ名,テンプレート名,blog_id,template_id,管理画面URL&lt;MTFor regex_replace=&quot;/(?&lt;!\r)\n|\r(?!\n)/&quot;,&quot;\r\n&quot;&gt;
&lt;/MTFor&gt;&lt;/MTTemplatesHeader&gt;&quot;&lt;$MTBlogName regex_replace='/(?=&quot;)/g','&quot;'$&gt;&quot;,&quot;&lt;$MTVar name=&quot;template_name&quot; regex_replace='/(?=&quot;)/g','&quot;'$&gt;&quot;,&lt;$MTVar name=&quot;template_blog_id&quot;$&gt;,&lt;$MTVar name=&quot;template_id&quot;$&gt;,&lt;$MTCGIPath$&gt;&lt;$MTAdminScript$&gt;?__mode=view&amp;_type=template&amp;id=&lt;$MTVar name=&quot;template_id&quot;$&gt;&amp;blog_id=&lt;$MTVar name=&quot;template_blog_id&quot;$&gt;&lt;MTFor regex_replace=&quot;/(?&lt;!\r)\n|\r(?!\n)/&quot;,&quot;\r\n&quot;&gt;
&lt;/MTFor&gt;&lt;/MTTemplates&gt;</code></pre>

<p>MTTemplatesブロックタグのループ内ではmt_templateテーブルの各カラムの値が &lt;$mt:var name=&quot;template_name&quot;$&gt;(テンプレート名の場合)の要中たちで取得できます。カスタムフィールドの値はカスタムフィールドに指定したテンプレート・タグで取り出せますので、テンプレートにテキストエリアを追加してテンプレートの説明を記述するようにしておけばドキュメント作成の手間を軽減できるようになります。</p>

<p><strong>指定可能なモディファイア</strong></p>

<table>
<tr>
<th>blog_id</th><td>ブログID</td>
</tr><tr>
<th>include_blogs</th><td>対象とするブログIDを列記(カンマ区切り)または&quot;all&quot; &quot;children&quot; &quot;siblings&quot;が指定可能です。</td>
</tr><tr>
<th>exclude_blogs</th><td>対象外とするブログIDを列記(カンマ区切り)します。</td>
</tr><tr>
<th>type</th><td>テンプレートのタイプです。index(インデックス), individual(ブログ記事), page(ウェブページ), custom(モジュール), archive(アーカイブ)等が指定できます。</td>
</tr><tr>
<th>build_type</th><td>公開オプションです(0=再構築しない, 1=スタティック, 2=手動, 3=ダイナミック, 4=公開キュー経由)。</td>
</tr><tr>
<th>sort_by</th><td>表示順に指定するカラム名</td>
</tr><tr>
<th>sort_order</th><td>表示順(descendもしくはascend)</td>
</tr><tr>
<th>include_backup</th><td>バックアップテンプレートを含む場合に指定します。typeモディファイアの指定がある場合はそちらが優先されます。</td>
</tr>
<th>not_template_id</th><td>IDを指定した単一のテンプレートを除いて出力します。</td>
</tr>
</table>

<p>プラグインはスタティックパブリッシング専用です。ファイルを実際に生成したくない場合にはインデックス・アーカイブを作成してプレビュー機能を使うとよいでしょう。</p>

<p>アルファサードでは現在 <a href="http://powercms.alfasado.net/blog/2011/07/power_cms_partner.html">Power CMS パートナー</a>を募集しています。パートナー様に対しては <a href="https://github.com/alfasado">GitHub で公開中のプラグイン(50近くあります!)</a>のサポートも行っています。予算的に <a href="http://www.powercms.jp/">Power CMS</a> の導入が難しいケースでもプラグインを活用した構築に関するサポートやライセンスの割引購入、非公開の技術資料のご提供などのメリットがあります。是非この機会にご検討ください。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-templates">alfasado/mt-plugin-templates - GitHub</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Power CMS パートナー制度について</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/07/power_cms_partner.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.269</id>

    <published>2011-07-27T09:35:07Z</published>
    <updated>2011-07-28T08:35:23Z</updated>

    <summary>アルファサードでは今期「パートナーを支援する会社へ」を全社方針とし、取り組んでい...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p><a href="http://alfasado.net/">アルファサード</a>では今期「パートナーを支援する会社へ」を全社方針とし、取り組んでいます。</p>

<p>その一環として、2011年7月12日の<a href="http://www.powercms.jp/">Power CMS for MT ver.3</a>の発表と合わせて、「Power CMS Partner」制度を発足いたしました。</p>

<p>弊社製品をご利用・ご提案いただいているWeb制作会社様、システム開発会社様、デザイン会社様により一層お役立て頂ける特典をご用意しました。</p>

<p>自社評価用・デモ用ライセンスのご提供をいたしますので、お客様へのご提案時に弊社製品を用いてその場で管理画面を作成することも可能です。<a href="http://www.powercms.jp/">Power CMS for MT ver.3</a>の<a href="http://www.powercms.jp/features/object.html">カスタムオブジェクト</a>等を利用して、是非わかりやすい管理画面を作ってクライアントへのご提案にお役立てください。</p>
<p>また、<a href="http://alfasado.net/contents/news/201107111357.html">先日7月26日に行われたセミナー</a>のスライドなど、技術情報や販促資料等をパートナー様限定でご提供いたします。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">パートナー制度の詳細について</h3>
<p>Power CMS Partner とは、アルファサード有限会社(以下、アルファサード)の製品を取り扱う法人または個人に対して行う支援制度です。</p>
<p>パートナープログラムは2種類あります。企業様向けに「Power CMS Partner Pro」、5名以下の法人又は個人向けに「Power CMS Partner SOHO」です。</p>

<p>Power CMS Partner にご登録いただいたパートナー様には、以下の特典をご提供いたします。</p>

<dl style="margin-top:0.5em;">
<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">製品情報や技術情報等のご提供</dt>
<dd style="margin-left:0px;">アルファサードから製品情報や技術情報等を受け取ることができます。<br />
製品や技術の最新情報の他、一般には公開していないセミナースライドなどをご提供いたします。</dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">アルファサード製品の割引価格でのご提供</dt>
<dd style="margin-left:0px;">Power CMS for MT、Xtalkなどアルファサード製品を割引価格でご購入頂けます。<br />
<span style="font-size:90%;">※割引率につきましては<a href="http://powercms.alfasado.net/06_otoiawase.html">お問い合わせ</a>ください。</span></dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">製品サイト/アルファサード サイトでのご紹介</dt>
<dd style="margin-left:0px;">パートナー様の基本情報や構築事例などを、製品サイト・アルファサードのウェブサイトにてご紹介いたします。</dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">自社評価用・デモ用ライセンスのご提供</dt>
<dd style="margin-left:0px;">自社評価用、デモ用にPower CMS for MTの最新版(Proの場合はエンタープライズ版、SOHOの場合はスタンダード版)、及びXtalkライセンスが提供されます。<br />
お客様へのご提案などを目的に、各製品をご評価頂けます。<br />
<span style="font-size:90%;">※Movable Typeのライセンスは別途必要です。</span></dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">アルファサード作成プラグインのサポート/商用ライセンスでのご利用</dt>
<dd style="margin-left:0px;">アルファサードのプラグイン(<a href="https://github.com/alfasado">https://github.com/alfasado</a>)をサポート付き/商用ライセンスで利用できます。</dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">製品ロゴ/パートナーロゴのご利用</dt>
<dd style="margin-left:0px;">製品ロゴ/パートナーロゴデータをご提供いたします。ご提案書や御社サイトへの掲載などにご使用頂けます。</dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">自社ブランドでの製品販売(Partner Proのみ)</dt>
<dd style="margin-left:0px;">要件を満たした場合、OEMライセンス契約により、自社ブランドでの製品販売が可能です。</dd>

<dt style="margin-top:0.7em;font-size:115%;margin-bottom:0.2em">セミナーの共催(Partner Proのみ)</dt>
<dd style="margin-left:0px;">要件を満たした場合、共同プロモーション(セミナーでの事例紹介)等に参加することができます。
</dd>
</dl>

<hr />

<h2 style="font-size:120%;"><strong>登録料・年会費</strong></h2>
<p>必要な登録料と年会費は次の通りです。</p>
<table>
<tr><th>パートナー種別</th><th>登録料(初年度会費含む)</th><th>年会費(2年目以降)</th></tr>
<tr><td>Power CMS Partner Pro</td><td>105,000円(税込)</td><td>52,500円(税込)</td></tr>
<tr><td>Power CMS Partner SOHO</td><td>52,500円(税込)</td><td>25,750円(税込)</td></tr>
</table>

<ul>
	<li><a href="http://powercms.alfasado.net/06_otoiawase.html">詳細についてはお問合せください。</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Typeにおけるメソッドのコードレビューとデバッグについて</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/06/post_10.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.259</id>

    <published>2011-06-24T18:11:47Z</published>
    <updated>2011-06-25T06:11:49Z</updated>

    <summary>本日(6月25日)MTDDC(Movable Type Developers &amp;...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>本日(6月25日)MTDDC(Movable Type Developers &amp; Designers Conference)が開催されています。その中でMTチームはセキュリティ強化月間という発表がされていました。</p>

<ul>
<li><a href="http://www.slideshare.net/sakk/mtddc-tokyo-2011">MTDDC Tokyo 2011</a></li>
</ul>

<p>弊社では、MT5.0xから5.1xのリリース時にいくつかの脆弱性レポートもしくはパッチをシックス・アパートのMTチームに送付させていただきました。現在開発が佳境を迎えているPower CMS3の開発の中では、セキュリティポリシーを新たに定め直してコードレビューを行っています。</p>

<p>ここではMTのメソッドを例にとって、どのようにコードを見ていくかについての手順と、脆弱性に限らずバグを発見するためのデバッグ方法のヒントなどを紹介します。</p>

<ul>
	<li><a href="http://junnama.alfasado.net/online/2011/06/_mt_mtddc_tokyo_2011___modesome_action_typepageblog_id1id100.html">参考: MTDDC開催中。セキュリティ強化月間らしいので。</a></li>
</ul>

<p>MTに限った話ではないですが、まずはソフトウェアのお作法や開発の慣習を理解することから始まります。MTにおけるメソッドのレビュー・デバッグを例にとって考えてみたいと思います。</p>

<p>通常MTでは mt.cgi?__mode=foo&amp;_type=bar&amp;id=buz&amp;blog_id=1 のような形でリクエストを送ります。</p>

<p>この、__mode=foo のfooを「mode(モード)」と呼びます。この各モードに対する動作を定義しているのが「method(メソッド)」です(MVCで言うところのContoroller)。</p>

mt.cgi?__mode=dashboard

<p>の場合、モードは「dashboard」です。基本的にはモードごとにメソッドが指定されています。</p>

<p>メソッドはMTが標準で定義されているメソッド(core_methods)の他に、プラグインやアドオンで定義されているものも存在します。</p>

<p>※定義されている=registryに登録されているもの</p>

<ul>
	<li><a href="https://github.com/movabletype/Documentation/wiki/Japanese-plugin-dev-5-2">参考: 動作モードの追加とモーダルウィンドウの表示</a></li>
</ul>

<p>メソッドで行われる処理は基本的に次のようなものです。</p>

<p>“何らかの処理(DBへの書き込み、削除、読み込み、もしくは再構築等の処理)を行った後、テンプレートを読み込んで、パラメタを指定してビルドした結果を返す(もしくは別のmodeへ必要なパラメタを付けてリダイレクトする)。”</p>

<p>mt.cgiの実体はMT::App::CMS(ファイルは mt_dir/lib/MT/App/CMS.pm)で、(MT5.1)の37行目からの sub core_methods{} が各メソッドを定義している部分になります。</p>

<pre><code style="overflow:auto">sub core_methods {
    my $app = shift;
    my $pkg = '$Core::MT::CMS::';
    return {
        'tools'     =&gt; &quot;${pkg}Tools::system_check&quot;,
        'dashboard' =&gt; &quot;${pkg}Dashboard::dashboard&quot;,
        'menu'      =&gt; &quot;${pkg}Dashboard::dashboard&quot;,
        'admin'     =&gt; &quot;${pkg}Dashboard::dashboard&quot;,

        ## Generic handlers
        'save'          =&gt; &quot;${pkg}Common::save&quot;,
        'edit'          =&gt; &quot;${pkg}Common::edit&quot;,
        'view'          =&gt; &quot;${pkg}Common::edit&quot;,
        'list'          =&gt; &quot;${pkg}Common::list&quot;,
# ...</code></pre>

<p>$pkgは'$Core::MT::CMS::'ですので、__mode=dashboard のコードは MT::CMS::Dashboard(ファイルは mt_dir/lib/MT/CMS/Dashboard.pm)の sub dashboard{} がその動作を定義している箇所になります。ダッシュボードの動作で何らかのエラーや確認したい点がある時は、この部分のコードを見ていくということになります。</p>

<p>各プラグインでは以下のように定義されています。</p>

<pre><code style="overflow:auto">applications:
    cms:
        methods:
            powercms_foo: $PowerCMS::PowerCMS::CMS::powercms_foo
</code></pre>

<p>この場合、PowerCMS::PowerCMS::CMS(ファイルは通常 mt_dir/addons/PowerCMS.pack/lib/PowerCMS/CMS.pm もしくは mt_dir/plugins/PowerCMS/lib/PowerCMS/CMS.pmになります)の sub powercms_foo{} がコードになります。</p>

<p>注意したいのは、例えば core_method の save メソッドは</p>

<pre><code style="overflow:auto">        'save'          =&gt; &quot;${pkg}Common::save&quot;,
</code></pre>

<p>とありますので、MT::CMS::Common の sub save{}がコードの実体ですが、mt_dir/lib/MT/CMS/Common.pm の該当箇所は次のようになっています。</p>

<pre><code style="overflow:auto">sub save {
    my $app  = shift;
    my $q    = $app-&gt;param;
    my $type = $q-&gt;param('_type');

    return $app-&gt;errtrans(&quot;Invalid request.&quot;)
        unless $type;

    # being a general-purpose method, lets look for a mode handler
    # that is specifically for editing this type. if we find it,
    # reroute to it.

    my $save_mode = 'save_' . $type;
    if ( my $hdlrs = $app-&gt;handlers_for_mode($save_mode) ) {
        return $app-&gt;forward($save_mode);
    }
# ...</code></pre>

<p>このメソッドへのリクエストは __mode=save&amp;_type=entry のように_typeパラメタを持ちます(実際はpostリクエストなのでブラウザのアドレスバー等で見かけることはありません)。
つまりこのケースでの変数 $save_mode は 'save_entry' となります。</p>

<pre><code style="overflow:auto">    if ( my $hdlrs = $app-&gt;handlers_for_mode($save_mode) ) {
        return $app-&gt;forward($save_mode);
    }</code></pre>

<p>ここで該当するメソッド save_entry が存在するかどうかを調べ、存在すれば $app-&gt;forward($save_mode) しています(※そのメソッドに処理をforwardする)。</p>

<p>再び sub core_methods を確認します。以下のように save_entry が存在します。</p>

<pre><code style="overflow:auto">        'save_entry'   =&gt; &quot;${pkg}Entry::save&quot;,
</code></pre>

<p>つまり、__mode=save&amp;_type=entry で実行されるコードの実体は、MT::CMS::Common の sub save{}ではなく(正確には、このコードを途中まで経由してから別のところへ処理が丸投げされている)、MT::CMS::Entry(ファイルは mt_dir/lib/MT/CMS/Entry.pm)) の sub save{} ということになります。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">該当するモードの調べ方</h3>

<ol>
<li>ブラウザのアドレスバーで確認する<br />
getリクエストの場合、はこれで確認できます。<br />
http://www.example.com/mt_dir/mt.cgi?__mode=foo&amp;_type=bar&amp;id=buz&amp;blog_id=1</li>
<li>メソッドを呼び出す直前の画面ソースの form のinput要素(type=&quot;hidden&quot; name=&quot;__mode&quot;)の値を確認する<br />
※postの前にJavaScriptで値を書き換えるケースもあるので注意が必要です。</li>
<li>ログを取って確認する<br />
postリクエストの場合では、例えば下記のようなプラグインを書いてプラグインディレクトリに設置し、リクエスト後にシステムログを見て確認します。</li>
</ol>

<pre><code style="overflow:auto">name: Debug
id:   Debug
callbacks:
    MT::App::CMS::pre_run: &gt;
        sub {
            my $app = MT-&gt;instance;
            $app-&gt;log( 'query_string:' . $app-&gt;query_string );
            $app-&gt;log( 'mode:' . $app-&gt;mode );
        }
</code></pre>

<p>modeが確認できたら、MT::App::CMS::core_methods もしくはプラグインのregistryの定義を確認して、該当の処理がどこに書かれているかを確認し、処理内容を追っていきます。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">該当箇所の特定</h3>
<p>MT、もしくはMTにおけるメソッドの話に限りませんが、アプリケーションのファイルが膨大な数になってくると該当の箇所を探すのも大変です。何らかの調査をおこなう際に「箇所を効率良く特定する」ことが大切です。「プラグインでエラーが発生しました」もしくはソースコードの特定の行数がログに残っている場合などは良いのですが、単にエラーが返されたときや手がかりが少ないときなどはエラーメッセージやログに表示されている文字列がヒントに、該当の箇所を特定します。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">findコマンドでソースコード内の文字列を grepする</h3>

<pre><code style="overflow:auto">cd /path/to/mt_dir/lib
find . -name &quot;*.pm&quot;|xargs grep 'This is test.'</code></pre>

<p>このコマンドはマッチしたファイル、マッチした箇所前後の文字列を返してくれます。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">言語ファイルから特定する</h3>

<p>例えば「データベースのエラーでログインを確認できませんでした: ...」というエラーメッセージに遭遇したとします。ユーザーの言語設定が日本語の場合、エラーメッセージは日本語です。mt_dir/lib/MT/L10N/ja.pm を確認して該当のメッセージのオリジナル(英語)の表現を検索します(この検索はテキストエディタ等で行えます)。</p>

<pre><code style="overflow:auto">    'The login could not be confirmed because of a database error ([_1])' =&gt; 'データベースのエラーでログインを確認できませんでした: [_1]',</code></pre>

<p>オリジナルのメッセージを確認できたら先ほどの findコマンドで grepします。</p>

<pre><code style="overflow:auto">find . -name &quot;*.pm&quot;|xargs grep 'The login could not be confirmed because of a database error'

./lib/MT/App.pm: &quot;The login could not be confirmed because of a database error ([_1])&quot;,
./lib/MT/L10N/de.pm:	'The login could not be confirmed because of a database error ([_1])' =&gt; 'Anmeldung konnte aufgrund eines Datenbankfehlers nicht durchgeführt werden ([_1])',
./lib/MT/L10N/es.pm:	'The login could not be confirmed because of a database error ([_1])' =&gt; 'No se pudo confirmar el acceso debido a un error de la base de datos ([_1])',
./lib/MT/L10N/fr.pm:	'The login could not be confirmed because of a database error ([_1])' =&gt; 'L\'identifiant ne peut pas être confirmé en raison d\'une erreur de base de données ([_1])',
./lib/MT/L10N/ja.pm:	'The login could not be confirmed because of a database error ([_1])' =&gt; 'データベースのエラーでログインを確認できませんでした: [_1]',
./lib/MT/L10N/nl.pm:	'The login could not be confirmed because of a database error ([_1])' =&gt; 'Het aanmelden kon niet worden bevestigd wegens een databaseprobleem ([_1])',</code></pre>

<p>./MT/App.pm以外はすべて言語ファイルなので、該当のエラーは mt_dir/lib/MT/App.pm 内で発生したことがわかります。</p>

<p>おおまかに問題の発生箇所が特定できたら、デバッグログを記録したり、画面に実行状況をフィードバックさせたりしながら検証していきます。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">システムログへの保存</h3>
<p>先ほど、モードの特定のためのプラグインの例をあげました。システムログへのメッセージの保存は最も手軽なデバッグ方法の一つです。</h3>

<p>該当箇所のエラー発生の直前、もしくはモードの先頭箇所からいくつかのポイントに、</p>

<pre><code style="overflow:auto">MT-&gt;log( 'Step 1' );</code></pre>

<p>もしくは</p>

<pre><code style="overflow:auto">$app-&gt;log( 'Step 1' );</code></pre>

<p>といった形でログを残していき、どこまでが正常に実行されたかを特定していきます。</p>

<p>変数の内容を確認したい時には、Data::Dumperモジュールを使うと便利です。例えば変数 $entry が正しくセットされていない時に $entry-&gt;id をコールすると</p>

<pre><code style="overflow:auto">エラーが発生しました: Can't call method &quot;id&quot; on an undefined value at (eval 363) line 1.</code></pre>

<p>のような形でエラーになります。MTのエラー画面にこれが表示されるかシステムログに表示されるかは実行されている処理の種類によります。基本的にメソッドの中で発生した場合はMTのエラー画面にメッセージが表示されます。一方、プラグインによるコールバックの処理などで発生した場合にはシステムログに記録されます(この場合はプラグイン名があわせて記録されるため、特定は比較的容易です)。</p>

<p>変数 $entry が正しくセットされているかをログに残すには、Data::Dumperを用いて以下のようにします。</p>

<pre><code style="overflow:auto">use Data::Dumper;
MT-&gt;log( Dumper $entry );</code></pre>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">リアルタイムにフィードバックを得る</h3>
<p>MTのシステムログにエラーを表示する方法は手軽ではありますが、実はやってみると結構面倒です。</p>

<ol>
	<li>デバッグログ記録のためのコードを入れる</li>
	<li>ブラウザで当該の処理を実行する</li>
	<li>システムログをみる</li>
</ol>

<p>リアルタイムに状態を確認するにはいくつかの方法があります。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:105%">メソッドの中で得たい結果を return する</h3>

<p>メソッドの実行結果はメソッドのルーチンの中で return したタイミングでブラウザに返されます。
よって、メソッドの中で、</p>

<pre><code style="overflow:auto">return 'Step 1';</code></pre>

<p>とすればブラウザに結果が返ります。
変数の確認についても先ほどの例と同様に</p>

<pre><code style="overflow:auto">use Data::Dumper;
return Dumper $entry;</code></pre>

<p>とすれば結果をブラウザでリアルタイムに得ることができます。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:105%">強制的にdieする</h3>

<p>メソッドから呼ばれているサブルーチンの中では return $foo; が使えないケースがあります。サブルーチンの実行結果をメインルーチンは受け取るだけ、といったケースでは return $foo; は使えません。</p>

<p>この場合は、サブルーチンの中で dieすることでMTのエラーメッセージに確認したい内容を渡すことが出来ます。</p>

<pre><code style="overflow:auto">die 'Step 1';</code></pre>

<p>または</p>
 
<pre><code style="overflow:auto">use Data::Dumper;
die Dumper $entry;</code></pre>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:105%">warnings(Perlの警告)を使って確認する</h3>

<p>この方法が最も簡単で多くの内容を確認できる方法でです。return や die を使う方法のように、1度に1つの結果しか得られないこともありませんし、システムログのように画面を遷移して結果を確認する必要もありません。また、1度のリクエストの処理に1秒かからなければ、システムログの画面での記録されたログの記録順を確認できないこともあります(同一の秒で保存されたログが保存順に表示されるとは限りません)。</p>

<p>mt-config.cgi に</p>

<pre><code style="overflow:auto">DebugMode 1</code></pre>

<p>と記述するか、管理画面の全般の設定で、DebugMode を 1に設定します。
あとは、確認したいコードの中に warn $foo; のような形で確認したい内容を吐き出すようにします。</p>

<pre><code style="overflow:auto">warn 'This is a Debug Message.';</code></pre>

<p>とすると、ブラウザの画面下部に「警告とメッセージ」が表示されます。</p>

<pre><code style="overflow:auto">Request completed in 1.145 seconds.
This is a Debug Message. at (eval 361) line 1.</code></pre>

<p>尚、DebugMode 2 とするとエラー発生箇所等の情報を画面に表示してくれます。必要に応じて設定しましょう。</p>

<ul>
	<li><a href="http://www.movabletype.jp/documentation/appendices/config-directives/debugmode.html">参考: DebugMode | 環境変数リファレンス</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>CakePHPのViewでMTタグを利用可能にするMTCake</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/06/cakephpviewmtmtcake.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.262</id>

    <published>2011-06-14T09:16:17Z</published>
    <updated>2011-06-14T12:57:01Z</updated>

    <summary>Power CMS 3の新しいDynamicMTMLでは、データベースを問わず、...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 3" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="サイト制作全般" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>Power CMS 3の新しいDynamicMTMLでは、データベースを問わず、もしくは複数のデータベースを組み合わせて(もしくはデータベースがなくても)MTML(MTタグ)が使えるようになっています。</p>

<p>これにより、ステージ配信と組み合わせて静的ファイルを公開サーバーに転送しているようなケースで(公開サーバーからはDBを参照していない)端末の毎の振り分けや何らかの分岐にMTタグを使うことができるようになります。</p>

<p>これまでにも、<a href="https://github.com/alfasado/DynamicMTML/tree/master/Alfie">データベースなしでMTタグを動かすサンプル</a>や、<a href="https://github.com/alfasado/DynamicMTML/tree/master/plugins/WordPress">WordPressのDBを参照してMTタグで出力するWordPressプラグイン</a>などを公開していましたが(AlfieとWordPressプラグインはPowerCMS 3に含まれます)、同じくDynamicMTMLをベースにしてCakePHPのテンプレートエンジンとしてMTMLを利用できるようにする(ViewでMTタグを使えるようにする)MTCakeを作成しました。</p>

<p><a href="http://cakephp.jp/">CakePHP</a>はPHPで書かれたWebアプリケーションフレームワークで、Ruby on RailsのRuby on Railsの影響を強く受けていると言われています。Webアプリケーションを高速に開発するための様々な仕掛けが盛り込まれています。</p>

<ul>
	<li><a href="https://github.com/alfasado/cakephp-plugin-mt-cake">alfasado/cakephp-plugin-mt-cake - GitHub</a></li>
</ul>

<p><a href="http://book.cakephp.org/ja/view/219/CakePHPブログチュートリアル">CakePHPのブログチュートリアル</a>を例にとって、MTCakeを使うことでCakePHPのロジックとプレゼンテーションがどのように分離できるかを見ていきましょう。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%"><a href="http://book.cakephp.org/ja/view/219/CakePHPブログチュートリアル">CakePHPブログチュートリアル</a></h3>

<p>MTCakeをインストールしたら以下の1から6の手順でPostモデル/コントローラ/ビューを作成します。その後、作成した /app/controllers/posts_controller.php と /app/views/posts/index.ctp をMTCakeを使って書き換えてみましょう。</p>

<ol>
	<li><a href="http://book.cakephp.org/ja/view/330/ブログデータベースの作成">ブログデータベースの作成</a></li>
	<li><a href="http://book.cakephp.org/ja/view/331/Cakeのデータベース設定">Cakeのデータベース設定</a></li>
	<li><a href="http://book.cakephp.org/ja/view/331/Cakeのデータベース設定">Cakeのデータベース設定</a></li>
	<li><a href="http://book.cakephp.org/ja/view/334/Postモデルの作成">Postモデルの作成</a></li>
	<li><a href="http://book.cakephp.org/ja/view/335/Postsコントローラの作成">Postsコントローラの作成</a></li>
	<li><a href="http://book.cakephp.org/ja/view/336/Postビューの作成">Postビューの作成</a></li>
</ol>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">オリジナルのコード</h3>

<pre><code style="overflow:auto">&lt;!-- File: /app/controllers/posts_controller.php --&gt;
&lt;?php
class PostsController extends AppController {
    var $name = 'Posts';
    function index() {
        $this-&gt;set('posts', $this-&gt;Post-&gt;find('all'));
    }
}
?&gt;

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

<p>posts_controller.php のコードだけでもCakePHPフレームワークの利点が見えると思います。問題は/app/views/posts/index.ctp のほうです。WordPressでもそうなのですが、テンプレートがPHPのコードそのままになっています。ループの部分は &lt;?php foreach ($posts as $post): ?&gt;~ &lt;?php endforeach; ?&gt;、タイトルを取り出すのは配列 $postの[Post]の[title]をPHPのコードで取得しなければなりません。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MTCakeを使って書き換えたコード</h3>

<pre><code style="overflow:auto">&lt;!-- File: /app/controllers/posts_controller.php --&gt;
&lt;?php
class PostsController extends AppController {
    var $name = 'Posts';
    function index() {
        $ctx = $this-&gt;ctx;
        $ctx-&gt;__stash[ 'vars' ][ 'page_title' ] = 'Blog posts';
        $ctx-&gt;stash( 'Post', $this-&gt;Post-&gt;find( 'all' ) );
        // =&gt; &lt;mt:cake:loop model=&quot;Post&quot;&gt;~&lt;/mt:cake:loop&gt;
        // or $ctx-&gt;stash( 'posts', $this-&gt;Post-&gt;find( 'all' ) ); 
        // =&gt; &lt;mt:cake:loop model=&quot;Post&quot; stash=&quot;posts&quot;&gt;~&lt;/mt:cake:loop&gt;
    }
}
?&gt;

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

<p>posts_controller.php のコードはさほど変わっていませんが、/app/views/posts/index.ctp の方は大きく変わっており、PHPのコードは全く入っていません。デザイナーとプラグラマが完全に分業する場合には、MTタグがわかる前提ではありますが、後者の方がデザインテンプレートとしてはロジックとプレゼンテーションが分離できているように感じられませんか?</p>

<p>DynamicMTMLを利用すると、MTのテンプレートエンジンを独立して利用できるようになります。開発言語はPerlとPHPの両方で書くことができます。MTに限らず他のCMSやフレームワークと組み合わせることで、高度なサイト開発・構築が可能になりますが、このエントリでその可能性を感じていただければ幸いです。</p>]]>
        
    </content>
</entry>

<entry>
    <title>PowerCMS 3 (設計フリーなオブジェクト指向CMS) -1</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/06/power_cms_for_mt_ver3.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.260</id>

    <published>2011-06-07T04:59:54Z</published>
    <updated>2011-06-07T05:35:19Z</updated>

    <summary>2度目のPower CMS for MT ver.3 の製品発表セミナーが6月9...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>2度目のPower CMS for MT ver.3 の製品発表セミナーが6月9日(木)に開催されます。現段階でまだお申し込みは可能ですので、ご都合のつく方は是非ご参加ください。</p>

<ul>
	<li><a href="https://www.sixapart.jp/seminar/sa/2011/05/31-1433.html">Power CMS for MT ver3 製品発表セミナー : セミナー紹介 - Six Apart</a></li>
</ul>

<p>2007年にver.1をリリースしてから今秋で4年、これまでを少し振り返りながら新しいPower CMS for MTについて何回かにわけてご紹介したいと思います。</p>

<ul>
	<li><a href="http://alfasado.net/contents/news/200711221856.html">2007年11月 Power CMS for MT ver.1.0</a> - MT4上で動作する最初のバージョン。拡張フィールド＋テンプレートセレクタで管理画面をノンプログラミングでカスタマイズ可能、エントリーグループ(ブログ記事/ウェブページのGUIでの並び替え)、サイト内検索、承認ワークフローに対応。</li>
	<li><a href="http://alfasado.net/contents/news/200804031323.html">2008年4月 Power CMS for MT ver.1.1</a> - MT4.1対応。CSVインポート、アンケートフォーム、ステージ配信、アクセス解析に対応</li>
	<li><a href="http://alfasado.net/contents/news/200902121800.html">2010年6月 Power CMS for MT ver.1.5 / Power CMS for MT Enterprise</a> - MT4.2対応。Tree形式のダッシュボード、携帯サイト、会員限定サイト、エンタープライズサーチ、リビジョン管理、リンクチェック、リモートバックアップ、既存HTMLのインポートに対応。</li>
	<li><a href="http://alfasado.net/contents/news/201004071000.html">2010年4月 Power CMS for MT ver.2</a> - MT5対応。ユーザーインターフェイスの改良、Drag & Dropアップロード、DynamicMTML(静的ダイナミック・パブリッシング)に対応、ワークフローリビジョンに対応した新バージョン。</li>
	<li><a href="http://alfasado.net/contents/news/201006091200.html">2010年7月 Power CMS for MT ver.2.03</a> - 広告配信(バナー/キャンペーン管理)、カスタムオブジェクト、グループ&ソート機能の強化、携帯サイトの絵文字に対応。</li>
	<li><a href="http://alfasado.net/contents/news/201101201203.html">2011年1月 Power CMS for MT ver.2.05</a> - 最大250%のパフォーマンス向上。Google Analystics連携、DynamicMTMLを強化(PHP APIを整備)したバージョン。</li>
</ul>

<p>様々な新しい機能を取り込みながらバージョンアップを重ね来たことがおわかりいただけるかと思います。ver1.5の際に「多機能化」しましたが、その後はUIまわりや足回りの改良、単機能の追加が中心のアップデートであったといえます。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">PowerCMS 3</h3>

<p>新しいバージョンはこれまでの多機能化路線とは違い(それでも機能だけを見れば大きく増えているわけですが)、製品のコンセプト自体が大きく変わります。コンセプトは<strong>「CMS・サイト設計の在り方を変える」「PowerCMSのフレームワーク化」「製品のポテンシャルの底上げ」</strong>です。</p>

<p>アウトラインについてはセミナーのスライドを動画でアップしていますので、是非ご覧ください。</p>

<div style="text-align:center;padding:auto;margin-bottom:2.5em"><iframe width="425" height="349" src="http://www.youtube.com/embed/EJ7upk39yWE" frameborder="0" allowfullscreen></iframe></div>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">カスタムオブジェクト・フレームワークとスニペット・カスタムフィールド</h3>

<p>当社では“MT脳”と呼んでいるのですが、MT(に限らず一般的なCMS製品、もしくはBlogエンジン)でサイトを設計する時に、権限やコンテンツの種類ごとにウェブサイト(ブログ)をどんどん増やしていって結果として肝心の“マネジメント”がしにくい状況になってしまうケースを見かけます。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="MTのオブジェクトの構成(概略)" src="http://powercms.alfasado.net/blog/2011/06/07/Keynote001.png" width="496" height="303" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>

<p>MTのカスタムフィールドで管理画面のバリエーションをいくつも持てる、が故に今度はカスタムフィールドの数が数千規模になってしまうようなケースも見かけます。</p>

<p>これは、MTが基本的にウェブページ/ブログ記事という2種類のコンテンツ管理しか出来ないために、コンテンツの種類ごとにブログを分けてマルチブログ(ポータル機能)で連携させるという手法をとるわけです。使い勝手を上げるために管理画面のラベルを変更したりjQueryでフィールドのレイアウトを変更したりといった工夫をするわけですが、このような設計をしていると以下のような問題をどうするかが課題になってきます。</p>

<ul>
	<li>カスタマイズの工数とコスト負担を誰がみるのか</li>
	<li>行き過ぎたカスタマイズとバージョンアップ耐性問題</li>
	<li>再構築トリガーのためにシステム全体が重量化、サーバー負荷の増大</li>
</ul>

<p>一つ目の問題に対する新しいPowerCMSの答えは、「管理画面の操作とHTML(CSS)さえわかれば、ノンプログラミングで高度にカスタマイズできるCMS」です。その肝になるのが「カスタムオブジェクト・フレームワーク」と「スニペット・カスタムフィールド」の2つです。</p>

<p>カスタムオブジェクト・フレームワークは、MTが持っているMT::ObjectとMT5.1の新機能であるListing Frameworkを拡張したもので、管理画面であらゆるオブジェクトを管理、そしてコンテンツとして出力できるものです。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">オブジェクトとは何か</h3>

<p>一口にウェブサイトといっても、そこで扱う情報はサイトによってまちまちです。</p>

<ul>
	<li>BtoB企業のコーポレートサイト</li>
	<li>ECサイト</li>
	<li>出版社のサイト</li>
	<li>家電メーカーのサイト</li>
	<li>ニュース系ポータルサイト</li>
	<li>コミュニティサイト</li>
</ul>

<p>これらのサイトでは扱うモノ(オブジェクト)が違います。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="出版社のウェブサイトが扱うオブジェクト" src="http://powercms.alfasado.net/blog/2011/06/07/Keynote002.png" width="496" height="303" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>

<br />

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スポーツ系ポータルサイトが扱うオブジェクト" src="http://powercms.alfasado.net/blog/2011/06/07/Keynote003.png" width="496" height="303" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>


<ul>
	<li>すべてはオブジェクトである</li>
	<li>オブジェクトは相互に関連付けられている</li>
	<li>文章(テキスト)、画像(写真)、動画、サウンドもオブジェクト</li>
	<li>オブジェクトによって構造(オブジェクトが持つ情報=DBのカラム)は違う</li>
	<li>オブジェクトによって適している入力フォーマット、表現(ページのレイアウトやデザイン)は違う</li>
</ul>

<p>こういったものをひとつのツール(Movable Type=CMS)で管理するために、従来私たちははツールの持つ構造にサイトの情報を当てはめていく発想、手法を用いていたように思います。もしくはサイトで扱う種類にあわせて“近い”ツールを選ぶといったことを行っていました。</p>
<p>PowerCMSでは<strong>ツールにサイトが歩み寄るのではなく、サイトにあわせてツールが歩み寄ること</strong>ができます。</p>

<p>カスタムオブジェクト・フレームワークとは、Movable Typeが持つMT::ObjectのAPIとMT5.1のListing Frameworkを拡張し、自由なCMS設計を可能にする技術です。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="カスタムオブジェクト・フレームワークによって拡張されたメニュー/一覧画面" src="http://powercms.alfasado.net/blog/2011/06/07/Keynote004.png" width="496" height="562" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>

<ul>
	<li>様々なオブジェクトを一覧で画面できる</li>
	<li>各オブジェクトには専用の編集画面が用意される</li>
	<li>オブジェクト毎にユーザー権限を設定できる</li>
	<li>オブジェクトの表示順をGUIで設定できる</li>
	<li>オブジェクトの階層管理ができる</li>
	<li>オブジェクトをテンプレートエンジンを介してページ出力できる</li>
	<li>オブジェクトは相互に関連づけることができる</li>
	<li>オブジェクトはインポート/エクスポートできる</li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">スニペット・カスタムフィールド</h3>

<p>カスタムオブジェクトはサイトが扱う情報(オブジェクト)毎に“素直”にCMSの構成を設計することを可能にします。一方でスニペット・カスタムフィールドは、それぞれのオブジェクトの投稿・管理インターフェイスを自由に設計することを可能にします。</p>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://powercms.alfasado.net/blog/2011/06/07/Keynote005.png"><img alt="スニペット・カスタムフィールド" src="http://powercms.alfasado.net/blog/assets_c/2011/06/Keynote005-thumb-496x400-1088.png" width="496" height="400" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

<p>Adobe DreamweaverやMicrosoft Visual Studioにあるコードスニペットは文字通りあらかじめ登録した「コードの断片」を簡単に挿入できる機能ですが、PowerCMSのスニペット・カスタムフィールドはHTMLで作成したコードがそのまま管理画面のフォームに挿入されます。</p>

<p>受け取り側のコード(プログラム)は一切書く必要がありません。input要素やtextarea、typeがfileのinput要素で添付ファイルを付けることもできます。これにより、出力されるウェブサイト上のページのレイアウトに限りなく近い管理画面の投稿インターフェイスをつくることが可能になり、カスタム・フィールドを増やすことで陥りがちな“縦長で見通しの悪い管理画面”になることを防ぐことができます。</p>

<p>各機能の詳細については今後のエントリで何度かにわけてご紹介していきたいと思います。</p>

<p>実際の管理画面のデモは明後日のセミナーでも披露いたします。ご興味のある方は是非お越し下さい。</p>

<ul>
	<li><a href="https://www.sixapart.jp/seminar/sa/2011/05/31-1433.html">Power CMS for MT ver3 製品発表セミナー : セミナー紹介 - Six Apart</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>WordPressのテンプレートをMovable Typeのタグで処理する</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/04/wordpressmovable_type.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.255</id>

    <published>2011-04-01T04:43:10Z</published>
    <updated>2011-04-19T18:58:18Z</updated>

    <summary>WordPressはデータベースにMySQLを利用し、PHPで書かれたオープンソ...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p><a href="http://wordpress.org/">WordPress</a>はデータベースにMySQLを利用し、PHPで書かれたオープンソースのブログソフトウェアです。豊富なテーマやプラグインによる拡張性の高さから数多くのブログやウェブサイトで利用されています。</p>

<p>Power CMS for MTの<a href="https://github.com/alfasado/DynamicMTML/blob/master/README.ja.md">DynamicMTMLエンジン</a>を利用することで、WordPressのコンテンツをMTML(Movable Type Markup Language=MTタグ)で呼びだして表示制御することができます。この機能は<a href="https://github.com/alfasado/DynamicMTML/tree/master/plugins/WordPress">WordPressプラグイン</a>によって提供され、ダイナミックパブリッシングもしくはDynamicMTML上で動作します。</p>

<ul>
	<li><a href="https://github.com/alfasado/DynamicMTML/tree/master/plugins/WordPress">alfasado/DynamicMTML - GitHub</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">WordPressコンテンツを表示するMT:WPタグ</h3>

<p>WordPressのコンテンツを表示するにはMT:WPタグを利用します。MT:WP:Entriesはブログ記事(WordPressの「投稿」)をループ表示するブロックタグです。</p>

<p>テンプレート・タグの例を以下に示します。</p>

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

<p>WordPressの一般的なテンプレート記述はPHPコードですが、WordPressプラグインを利用することで、テンプレート・タグは完全にロジックと分離され、見通しが良くなることがおわかりいただけるかと思います。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">インストールと設定</h3>

<ol>
	<li>DynamicMTMLのインストール(<a href="https://github.com/alfasado/DynamicMTML/blob/master/README.ja.md">インストールについてはこちらのドキュメントを参照</a>)</li>
	<li>wp-config.cgiを設定します(mt/plugins/WordPress/wp-config.cgi)。<a href="https://github.com/alfasado/DynamicMTML/blob/master/plugins/WordPress/wp-config.cgi">記述方法についてはMovable Typeのmt-config.cgiと互換性があります。</a></li>
	<li><a href="https://github.com/alfasado/DynamicMTML/blob/master/plugins/WordPress/wp-prefix.php">wp-prefix.php</a>を設定(データベースのprefixを指定します)。</li>
</ol>

<p>*wp-prefix.phpの例</p>

<pre><code style="overflow:auto">&lt;?php
// DATABASE PREFIX
define( 'WP_PREFIX', 'wp_' );
?&gt;</code></pre>

<p>これでWordPressのコンテンツをMTMLで処理する準備が整いました。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">Movable TypeのコンテンツとWordPressコンテンツを一つのページに表示する</h3>

<p>簡単な例として、<a href="https://github.com/alfasado/DynamicMTML/blob/master/Alfie/README.ja.md">Alfie(DynamicMTMLのテンプレートエンジンの愛称)</a>を利用したテスト方法をご紹介します。</p>

<ol>
	<li>Movable TypeとWordPressをインストールします。Movable Typeではウェブサイトの直下にブログを1つ作成します(blog_idは2となります)。</li>
	<li>ドキュメントルート直下にalfieディレクトリを設置します。</li>
	<li>alfie/alfie.phpを編集します($mt_dirにMTのインストールパス、blog_idにMTのブログIDを指定します)。

<pre><code style="overflow:auto">&lt;?php
    $mt_dir = '/var/www/cgi-bin/mt';
    $SEP = DIRECTORY_SEPARATOR;
    $blog_id = 2;
    require_once( $mt_dir . $SEP . 'addons' . $SEP . 'DynamicMTML.pack' .
                            $SEP . 'php' . $SEP . 'dynamicmtml.run.php' );
?&gt;</code></pre>
</li>
<li>_htaccessを編集し、.htaccessにリネームします。この例は、/alfieディレクトリ以下の拡張子htmlのファイルを動的処理し、MTとWordPressのコンテンツを動的に処理可能にする例です。

<pre><code style="overflow:auto">Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex /alfie/alfie.php
&lt;IfModule mod_rewrite.c&gt;
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f [OR]
  RewriteCond %{REQUEST_FILENAME} -d [OR]
  RewriteCond %{REQUEST_FILENAME} ^[^.]+$|\.(html|HTML)$ [NC]
  RewriteRule ^ alfie.php [L]
&lt;/IfModule&gt;
&lt;IfModule !mod_rewrite.c&gt;
  Order Deny,Allow
  Deny from all 
&lt;FilesMatch (^(|[^.]+)|alfie.php?)$&gt;
  Allow from all
&lt;/FilesMatch&gt;
  ErrorDocument 403 /alfie/alfie.php
  ErrorDocument 404 /alfie/alfie.php
&lt;/IfModule&gt;
php_flag short_open_tag off</code></pre>
</li>
<li>/alfie/index.htmlを作成し、テンプレートを記述します。
<pre><code style="overflow:auto">&lt;h1&gt;&lt;$mt:BlogName$&gt;&lt;/h1&gt;
&lt;h1&gt;&lt;$mt:wp:BlogName$&gt;&lt;/h1&gt;</code></pre>
</li>
<li>ブラウザで/alfie/にアクセスします。</li>
</ol>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><p><a href="http://powercms.alfasado.net/blog/2011/04/01/WP.png"><img alt="Movable TypeとWordPressのコンテンツをブラウザで表示" src="http://powercms.alfasado.net/blog/assets_c/2011/04/WP-thumb-264x133-1052.png" width="264" height="133" class="mt-image-none" style="" /></a></p></span>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MT:WPテンプレートタグ</h3>

<dl>
<dt>mt:wp:Entries(ブロックタグ) * mt:wp:get_posts, mt:wp:postsはmt:wp:Entriesのエイリアス</dt>

<dd><p>WordPressの「投稿」(ブログ記事)をループ出力します。下記のモディファイアが利用可能です。</p>

<pre><code style="overflow:auto">id            :IDが一致する投稿を1件読み込みます。
category      : カテゴリ名で投稿を絞り込みます。
category_id   : カテゴリIDで投稿を絞り込みます。
tag           : Tagで投稿を絞り込みます。
status        : ステータスを指定します。'*'を指定するとすべてを対象にします。 'publish' がデフォルト値です。
type          : 投稿の種類(type)を指定します。'*'を指定するとすべてを対象にします。 'post' がデフォルト値です。
sort_by       :投稿の表示順を指定します。IDが初期値です。
sort_order    : 'ascend(昇順)'または'descend(降順 - 初期値)'を指定します。
lastn         : 表示する投稿の数を指定します。
offset        : limitモディファイアと一緒に指定し、先頭のoffset件をスキップしてロードします。
limit         :数値を指定してロードする投稿件数を指定します。
glue          : ループ出力の区切り文字を指定します。</code></pre>
</dd>

<dt>mt:wp:EntryNext(ブロックタグ) * mt:wp:next_postはmt:wp:EntryNextのエイリアス</dt>
<dd><p>現在のコンテキストの投稿の1件次の投稿をブロックコンテキストにセットします。キーはauthored dateです。</p></dd>

<dt>mt:wp:EntryPrevious(ブロックタグ) * mt:wp:previous_postはmt:wp:EntryPreviousのエイリアス</dt>
<dd><p>現在のコンテキストの投稿の1件前の投稿をブロックコンテキストにセットします。キーはauthored dateです。</p></dd>

<dt>mt:wp:Categories(ブロックタグ) * mt:wp:list_categoriesはmt:wp:Categoriesのエイリアス</dt>

<dd><p>WordPressの「カテゴリ」をループ出力します。下記のモディファイアが利用可能です。</p>

<pre><code style="overflow:auto">hide_empty    : 1を指定するとカテゴリに属する投稿がないカテゴリを含んで読み込みます。
toplevel      : mt:wp:SubCategoriesと同様です。
sort_by       :投稿の表示順を指定します。IDが初期値です。
sort_order    : 'ascend(昇順)'または'descend(降順 - 初期値)'を指定します。
lastn         : 表示する投稿の数を指定します。
offset        : limitモディファイアと一緒に指定し、先頭のoffset件をスキップしてロードします。
limit         :数値を指定してロードする投稿件数を指定します。
glue          : ループ出力の区切り文字を指定します。</code></pre>
</dd>

<dt>mt:wp:Tags(ブロックタグ) </dt>

<dd><p>WordPressの「タグ」をループ出力します。下記のモディファイアが利用可能です。</p>

<pre><code style="overflow:auto">hide_empty    : 1を指定するとタグに属する投稿がないタグを含んで読み込みます。
sort_by       :投稿の表示順を指定します。IDが初期値です。
sort_order    : 'ascend(昇順)'または'descend(降順 - 初期値)'を指定します。
lastn         : 表示する投稿の数を指定します。
offset        : limitモディファイアと一緒に指定し、先頭のoffset件をスキップしてロードします。
limit         :数値を指定してロードする投稿件数を指定します。
glue          : ループ出力の区切り文字を指定します。</code></pre>
</dd>

<dt>mt:wp:EntryCategories(ブロックタグ) * mt:wp:get_the_categoryはmt:wp:EntryCategoriesのエイリアス</dt>
<dd><p>現在の投稿が属するカテゴリをループ出力します。このタグの中ではmt:wp:Category関係のテンプレートタグが利用できます。</p></dd>

<dt>mt:wp:EntryTags(ブロックタグ) * mt:wp:get_the_tagsはmt:wp:EntryTagsのエイリアス</dt>
<dd><p>現在の投稿につけられたタグをループ出力します。このタグの中ではmt:wp:Tag関係のテンプレートタグが利用できます。</p></dd>

<dt>mt:wp:ArchiveList(ブロックタグ)</dt>
<dd><p>月別アーカイブのリストを出力するためのブロックタグです。テンプレートの例:</p>
<pre><code style="overflow:auto">&lt;mt:wp:ArchiveList archive_type=&quot;Monthly&quot;&gt;
&lt;mt:if name=&quot;__first__&quot;&gt;&lt;ul&gt;&lt;/mt:if&gt;
    &lt;li&gt;
        &lt;a href=&quot;&lt;mt:wp:ArchiveLink archive_type=&quot;Monthly&quot;&gt;&quot;&gt;
            &lt;mt:wp:archivetitle format=&quot;%b %Y&quot;&gt;(&lt;mt:wp:ArchiveCount&gt;)
        &lt;/a&gt;
    &lt;/li&gt;
&lt;mt:if name=&quot;__last__&quot;&gt;&lt;/ul&gt;&lt;/mt:if&gt;
&lt;/mt:wp:ArchiveList&gt;</code></pre>
</dd>

<dt>mt:wp:SubCategories(ブロックタグ) * mt:wp:get_the_tagsはmt:wp:EntryTagsのエイリアス</dt>
<dd><p>サブカテゴリを階層化してリスト表示するブロックタグです。</p>

<pre><code style="overflow:auto">hide_empty    : 1を指定するとカテゴリに属する投稿がないカテゴリを含んで読み込みます。
sort_by       :投稿の表示順を指定します。IDが初期値です。
sort_order    : 'ascend(昇順)'または'descend(降順 - 初期値)'を指定します。
lastn         : 表示する投稿の数を指定します。
offset        : limitモディファイアと一緒に指定し、先頭のoffset件をスキップしてロードします。
limit         :数値を指定してロードする投稿件数を指定します。
glue          : ループ出力の区切り文字を指定します。</code></pre>

<p>テンプレートの例:</p>

<pre><code style="overflow:auto">&lt;mt:wp:SubCategories hide_empty=&quot;1&quot;&gt;
&lt;mt:wp:SubCatisFirst&gt;&lt;ul&gt;&lt;/mt:wp:SubCatisFirst&gt;
    &lt;li&gt;
        &lt;a href=&quot;&lt;mt:wp:CategoryLink&gt;&quot;&gt;
        &lt;mt:wp:CategoryLabel&gt; (&lt;mt:wp:CategoryCount&gt;)
        &lt;/a&gt;
    &lt;mt:wp:SubCatsRecurse&gt;&lt;/li&gt;
&lt;mt:wp:SubCatisLast&gt;&lt;/ul&gt;&lt;/mt:wp:SubCatisLast&gt;
&lt;/mt:wp:SubCategories&gt;</code></pre>
</dd>

<dt>mt:wp:SubCatIsFirst(ブロックタグ)</dt>
<dd><p>mt:wp:SubCategoriesループの最初のループで出力されます。</p></dd>

<dt>mt:wp:SubCatIsLast(ブロックタグ)</dt>
<dd><p>mt:wp:SubCategoriesループの最後のループで出力されます。</p></dd>

<dt>mt:wp:SubCatIsLast(ブロックタグ)</dt>
<dd><p>mt:wp:SubCategoriesループの最後のループで出力されます。</p></dd>

<dt>mt:wp:SubCatsRecurse(ブロックタグ)</dt>
<dd><p>現在のカテゴリに属するサブカテゴリの mt:wp:SubCategories ブロックを再帰的に表示します。</p></dd>

<dt>mt:wp:BlogName(ファンクションタグ)</dt>
<dd><p>ブログ名を表示します。</p></dd>

<dt>mt:wp:BlogInfo(ファンクションタグ)</dt>
<dd><p>ブログに関する情報を表示します。
テンプレートの例:
</p>

<pre><code style="overflow:auto">&lt;$mt:wp:BlogInfo name=&quot;blogdescription&quot;$&gt;

=&gt;Just another WordPress site</code></pre>
</dd>

<dt>mt:wp:BlogURL(ファンクションタグ) * mt:wp:site_urlはmt:wp:BlogURLのエイリアス</dt>
<dd><p>ブログのURLを表示します。</p></dd>

<dt>mt:wp:EntriesCount(ファンクションタグ) * mt:wp:count_postsはmt:wp:EntriesCountのエイリアス</dt>
<dd><p>ブログに属する投稿数を表示します。</p>
<pre><code style="overflow:auto">category      : 対象とする投稿が属するカテゴリ名。
category_id   :対象とする投稿が属するカテゴリID。
tag           :対象とする投稿につけられたタグ名。
status        : ステータスを指定します。'*'を指定するとすべてを対象にします。 'publish' がデフォルト値です。
type          : 投稿の種類(type)を指定します。'*'を指定するとすべてを対象にします。 'post' がデフォルト値です。</code></pre>
</dd>

<dt>mt:wp:EntryTitle(ファンクションタグ) * mt:wp:the_titleはmt:wp:EntryTitleのエイリアス</dt>
<dd><p>現在の投稿のタイトルを表示します。</p></dd>

<dt>mt:wp:EntryBody(ファンクションタグ) * mt:wp:the_content, mt:wp:EntryContentはmt:wp:EntryBodyのエイリアス</dt>
<dd><p>現在の投稿の本文を表示します。</p></dd>

<dt>mt:wp:EntryExcerpt(ファンクションタグ) * mt:wp:the_excerptはmt:wp:EntryExcerptのエイリアス</dt>
<dd><p>現在の投稿の概要を表示します。</p></dd>

<dt>mt:wp:EntryGUID(ファンクションタグ) * mt:wp:the_guidはmt:wp:EntryGUIDのエイリアス</dt>
<dd><p>現在の投稿のguidを表示します。</p></dd>

<dt>mt:wp:EntryAuthorDisplayName(ファンクションタグ)</dt>
<dd><p>現在の投稿の投稿者名を表示します。</p></dd>

<dt>mt:wp:EntryAuthor(ファンクションタグ) * mt:wp:the_authorはmt:wp:EntryAuthorのエイリアス</dt>
<dd><p>現在の投稿の投稿者IDを表示します。</p></dd>

<dt>mt:wp:EntryDate(ファンクションタグ) * mt:wp:the_dateはmt:wp:EntryDateのエイリアス</dt>
<dd><p>現在の投稿の投稿日を表示します。<a href="http://www.movabletype.jp/documentation/appendices/date-formats.html">日付に関するモディファイア</a>が指定できます。</p></dd>

<dt>mt:wp:EntryPermalink(ファンクションタグ) * mt:wp:the_permalinkはmt:wp:EntryPermalinkのエイリアス</dt>
<dd><p>現在の投稿パーマリンクを表示します。テンプレートの例:</p>
<pre><code style="overflow:auto">&lt;$mt:wp:EntryPermalink$&gt;

=&gt; http://www.example.com/p=1</code></pre>
</dd>

<dt>mt:wp:EntryMeta(ファンクションタグ) * mt:wp:post_metaはmt:wp:EntryMetaのエイリアス</dt>
<dd><p>keyモディファイアを指定して現在の投稿のカスタムフィールドの値を表示します。</p></dd>

<dt>mt:wp:CategoryLabel(ファンクションタグ) * mt:wp:cat_nameはmt:wp:CategoryLabelのエイリアス</dt>
<dd><p>カテゴリのコンテキスト内でカテゴリ名を表示します。</p></dd>

<dt>mt:wp:CategorySlug(ファンクションタグ)</dt>
<dd><p>カテゴリのコンテキスト内でカテゴリの'slug'を表示します。</p></dd>

<dt>mt:wp:CategoryCount(ファンクションタグ)</dt>
<dd><p>カテゴリのに属する投稿の数を表示します。</p></dd>

<dt>mt:wp:TagName(ファンクションタグ) * mt:wp:tag_nameはmt:wp:TagNameのエイリアス</dt>
<dd><p>タグのコンテキスト内でタグ名を表示します。</p></dd>

<dt>mt:wp:TagSlug(ファンクションタグ)</dt>
<dd><p>タグのコンテキスト内でタグの'slug'を表示します。</p></dd>

<dt>mt:wp:TagCount(ファンクションタグ)</dt>
<dd><p>タグのコンテキスト内でタグが付けられた投稿の数を表示します。</p></dd>

<dt>mt:wp:ArchiveLink(ファンクションタグ) * mt:wp:get_month_link はmt:wp:ArchiveLinkのエイリアス</dt>
<dd><p>mt:wp:ArchiveListブロックタグの中でアーカイブへのリンクを表示します。</p>

<pre><code style="overflow:auto">&lt;$mt:wp:ArchiveLink archive_type=&quot;Monthly&quot;$&gt;

=&gt; http://www.example.com/?month=yyyymm</code></pre>
</dd>
</dl>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">様々なデータベースへの接続とテンプレートエンジンのメリットを活かす</h3>

<p>DynamicMTMLを利用すれば、このように複数のデータベースのデータをテンプレーエンジンを介して出力することができます。WordPressに限らず、他のCMSや既存のデータベースとMovable Typeを連携させるようなサイト構築にDynamicMTMLが活用いただけることがおわかりいただけたかと思います。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">参考リンク</h3>

<ul>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_1.html">New DynamicMTML(PHPによるMovable Typeの拡張)-1</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_2.html">New DynamicMTML(PHPによるMovable Typeの拡張)-2</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-3.html">New DynamicMTML(PHPによるMovable Typeの拡張)-3</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-4.html">New DynamicMTML(PHPによるMovable Typeの拡張)-4</a></a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Enterpriseエディションの全文検索をカスタマイズする</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/03/enterprise.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.254</id>

    <published>2011-03-05T03:34:30Z</published>
    <updated>2011-04-12T11:28:18Z</updated>

    <summary>Power CMS for MTのEnterprise版(Movable Typ...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 2" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p><a href="http://powercms.alfasado.net/02_product_enterprise.html">Power CMS for MTのEnterprise版</a>(<a href="http://www.sixapart.jp/movabletype/mta/">Movable Type Advanced</a>にバンドルのものを含む)にはオープンソースの<a href="http://fallabs.com/hyperestraier/">全文検索エンジンHyper Estraier</a>をMovable Typeから扱う<a href="http://powercms.alfasado.net/kinou/enterprisesearch.html">検索システム(PowerSearchプラグイン)</a>が含まれています。</p>
<p>Power CMS for MTのすべてのバージョンに含まれる<a href="http://powercms.alfasado.net/kinou/webdb.html">SQL検索(AltSearch)</a>と比較して下記のような特長があります。</p>

<ul>
	<li>キーワードに対する文書のマッチング順に検索結果を出力することができます</li>
	<li>PDF文書やCMSで管理していない文書を検索対象にすることができます</li>
	<li>数万件単位の大量の文書もすばやく検索できます</li>
</ul>

<p>SQL検索(AltSearch)では標準でカテゴリのAND,OR指定ができますが、PowerSearchプラグインでは基本的に全文検索結果をキーワードに対する文書のマッチング順に表示する仕様になっています。</p>
<p>このエントリではPowerSearchプラグインでカスタム検索条件を指定するカスタマイズ方法についてご紹介します。</p>

<p>カスタム検索条件を追加する手順は下記の通りです。</p>

<ol>
	<li>カスタムフィールドやPower CMS for MTの拡張フィールド、カテゴリ、タグなどでブログ記事やウェブページのカスタム属性を指定します。</li>
	<li>文書ドラフトテンプレートに必要な属性を出力するように指定します。</li>
	<li>$conditionにカスタム条件を追加するプラグインを作成します。</li>
	<li>検索フォーム、検索結果テンプレートでフォームと検索結果表示部をカスタマイズします。</li>
</ol>

<h3>文書ドラフトテンプレート</h3>

<p>文書ドラフトは、Hyper Estraier独自のデータ形式です。文書ドラフトを中間フォーマットとして使うことで、様々な形式の文書を統合的に扱うことができます。
Power CMS for MTのテンプレートセットには、あらかじめブログ記事とウェブページの文書ドラフトテンプレートが付属しています。</p>

<p>※文書ドラフトの例</p>

<pre><code style="overflow:auto">@uri=http://powercms.alfasado.net/02_product_enterprise.html
@title=Power CMS for MT エンタープライズ版
@author=Alfasado Inc.
@cdate=2010-01-14T12:11:18+09:00
@mdate=2011-03-01T08:07:45+09:00

エンタープライズ検索やリモートバックアップ、既存HTMLの一括インポート等、
ブログエンジンの常識を覆る使いやすさと圧倒的なコストパフォーマンスで、
戦略的なサイト運用を強力にサポートします。
ドラッグ&amp;ドロップインターフェイス
画像やファイルの登録はデスクトップからドラッグ&amp;ドロップで。
リンクの挿入、フィールドや項目の並べ替えもドラッグ&amp;ドロップで自由自在に行えます。
...(以下、検索対象のテキストが続く)
    Power CMS for MT Blog ブログ モバイル 検索 PDF検索
...(タブ文字で始まっている行は隠しテキストとして扱われる)</code></pre>

<p>※Power CMS for MTのブログ記事ドラフトテンプレート</p>

<pre><code style="overflow:auto">@uri=&lt;$MTEntryPermalink$&gt;
@title=&lt;$MTEntryTitle is_draft=&quot;1&quot;$&gt; 
@cdate=&lt;$MTEntryDate format=&quot;%Y-%m-%dT%H:%M:%S&quot;$&gt;&lt;$MTBlogTimezone$&gt; 
@mdate=&lt;$MTEntryModifiedDate format=&quot;%Y-%m-%dT%H:%M:%S&quot;$&gt;&lt;$MTBlogTimezone$&gt; 
@blog_id=&lt;$MTBlogID$&gt; 
@suffix=html 
&lt;mt:if tag=&quot;EntryCategory&quot;&gt;parent=&lt;$MTEntryCategory is_draft=1$&gt; 
parentUrl=&lt;$MTEntryLink archive_type=&quot;Category&quot;$&gt;&lt;/mt:if&gt; 
 &lt;$MTEntryTitle is_draft=&quot;1&quot;$&gt; 
&lt;$MTEntryBody is_draft=&quot;1&quot;$&gt; 
&lt;$MTEntryMore is_draft=&quot;1&quot;$&gt; 
&lt;$MTEntryKeywords is_draft=&quot;1&quot;$&gt;</code></pre>

<p>ブログ記事ドラフトテンプレートの以下の部分にブログ記事のメインカテゴリを出力する記述が書かれています。</p>

<pre><code style="overflow:auto">&lt;mt:if tag=&quot;EntryCategory&quot;&gt;parent=&lt;$MTEntryCategory is_draft=1$&gt; 
parentUrl=&lt;$MTEntryLink archive_type=&quot;Category&quot;$&gt;&lt;/mt:if&gt;</code></pre>

<pre><code style="overflow:auto">parent=CMS
parentUrl=http://example.com/path/to/category/index.html</code></pre>

<p>これを以下のURLで検索できるようにカスタマイズします。</p>

<pre><code style="overflow:auto">http://example.com/cgi-bin/mt/mt-estraier.cgi?blog_id=1&amp;category=CMS&amp;query=検索文字列</code></pre>

<h3>プラグインによるカスタマイズの実装</h3>

<p>カスタマイズはプラグインを作成して pre_estraier_search コールバックに対応したコードを記述することで実装します。
カスタム条件は pre_estraier_search の第3引き数 $condition に対して add_attr メソッドで指定します。</p>

<p>※config.yaml</p>

<pre><code style="overflow:auto">id:  CustomSearch',
key: customsearch',
name: Custom Search
callbacks:
    pre_estraier_search: &gt;
    sub {
        my ( $cb, $app, $condition ) = @_;
        my $category = $app-&gt;param( 'category' );
        my $cond = &quot;parent STREQ $category&quot;;
        $$condition-&gt;add_attr( $cond );
    }
</code></pre>

<p>STREQは文字列の一致を意味します。その他に様々な条件の指定が可能です。</p>

<ul>
	<li><a href="http://fallabs.com/hyperestraier/uguide-ja.html">User's Guide of Hyper Estraier Version 1 (Japanese)</a></li>
</ul>

<p>※条件の指定</p>

<ul>
	<li>EQ : 指定した文字列と一致する。</li>
	<li>STRNE : 指定した文字列と一致しない。</li>
	<li>STRINC : 指定した文字列を含む。</li>
	<li>STRBW : 指定した文字列で始まる。</li>
	<li>STREW : 指定した文字列で終わる。</li>
	<li>STRAND : 指定した文字列の全てのトークンを含む。</li>
	<li>STROR : 指定した文字列の一つ以上のトークンを含む。</li>
	<li>STROREQ : 指定した文字列の一つ以上のトークンと一致する。</li>
	<li>STRRX : 指定した文字列の正規表現に合致する。</li>
	<li>NUMEQ : 数値や日付が指定したものと等しい。</li>
	<li>NUMNE : 数値や日付が指定したものと等しくない。</li>
	<li>NUMGT : 数値や日付が指定したものより大きい。</li>
	<li>NUMGE : 数値や日付が指定したものと同じかより大きい。</li>
	<li>NUMLT : 数値や日付が指定したものより小さい。</li>
	<li>NUMLE : 数値や日付が指定したものと同じかより小さい。</li>
	<li>NUMBT : 数値や日付が指定したものの間である。</li>
</ul>

<p>複数の条件を指定するには add_attr メソッドを複数呼び出します。この場合すべての条件にマッチするAND条件指定になります。</p>

<p>no_smoking(禁煙席有り)、japanese(和食メニューあり)といったカスタム属性を指定してその両方にマッチするものを検索する場合、下記のように指定することができます。</p>

<pre><code style="overflow:auto">$$condition-&gt;add_attr( &quot;no_smoking NUMEQ 1&quot; );
$$condition-&gt;add_attr( &quot;japanese NUMEQ 1&quot; );</code></pre>

<p>set_orderメソッドで検索結果の表示順を特定の属性値をキーにすることができます。</p>

<pre><code style="overflow:auto">$$condition-&gt;set_order( 'no_smoking NUMA' );</code></pre>

<p>※表示順の指定</p>

<ul>
	<li>STRA : 文字列（辞書順）の昇順。</li>
	<li>STRD : 文字列（辞書順）の降順。</li>
	<li>NUMA : 数値または日付の昇順。</li>
	<li>NUMD : 数値または日付の降順。</li>
</ul>

<p>テンプレートの実装にはカスタムフィールドやPower CMS for MTの拡張フィールドを使えば簡単に実現できます。</p>

<p>OR条件指定は属性名をカンマで区切ることで行えます。japanese、chineseいずれかにマッチするものは以下のように指定します。</p>

<pre><code style="overflow:auto">japanese,chinese NUMEQ 1</code></pre>

<p>もう少し曖昧な条件指定をしたい場合は、文書ドラフトのボディ部に条件をつないだ形で値を入れることも検討すると良いかもしれません。</p>

<p>カスタム属性に指定した値を検索結果テンプレートで呼び出すにはMTEstraierResults(MTEstraierBlock)ブロックタグのループの中で MTEstResultAttribute タグを使います。</p>
<p>さきほどの例は(カテゴリ名、カテゴリURL)、以下のタグで呼び出すことができます。</p>

<pre><code style="overflow:auto">&lt;$MTEstResultAttribute attribute=&quot;parent&quot;$&gt;
&lt;$MTEstResultAttribute attribute=&quot;parentUrl&quot;$&gt;</code></pre>

<p>複雑な検索も簡単なカスタマイズで可能ですので、ぜひ<a href="http://fallabs.com/hyperestraier/uguide-ja.html">マニュアル</a>をお読みいただき、カスタム検索の実装にチャレンジしてみてください。</p>

<p>検索のカスタマイズのご依頼やご相談も受け付けています。<a href="https://www.alfasado.co.jp/contents/contact.html">詳細についてはこちらからお問合せください</a>。</p>]]>
        
    </content>
</entry>

<entry>
    <title>GitHubでMovable Typeプラグインを公開中</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/02/githubmovable_type.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.252</id>

    <published>2011-02-21T04:28:08Z</published>
    <updated>2011-02-28T06:26:58Z</updated>

    <summary>Movable Type の開発が GitHub に移行されたことをきっかけに、...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p><a href="http://www.movabletype.jp/blog/movable_type_github.html">Movable Type の開発が GitHub に移行</a>されたことをきっかけに、<a href="http://alfasado.net/">アルファサード</a>でも<a href="https://github.com/">GitHub</a> に <a href="https://github.com/alfasado">alfasadoアカウント</a>を作成しました。Power CMS for MTに含まれるプラグインのβ版や実験的なものなど、いくつかのプラグインを公開中です。各プラグインのライセンスは各プラグインのドキュメントを参照ください。</p>

<ul>
	<li><a href="https://github.com/alfasado">alfasadoのプロフィール - GitHub</a></li>
</ul>

<p>これまで何回かに分けて紹介してきたDynamicMTMLをはじめとして、現在下記のプラグインを公開中です。今後もちょっとしたものや実験的なものなどを公開していきたいと考えています。個々のプラグインについては今後のエントリーでご紹介します。</p>

<h2 style="font-weight:bold;margin-bottom:0.7em;font-size:120%;border-bottom:1px solid gray">公開中のプラグイン</h2>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">DynamicMTML</h3>

<p>PHPによるMovable Typeの拡張。静的ファイル中のMTMLを解釈・実行したりデータベースなしでMTMLを扱えるようにします。実験的なものとしてWordPressプラグイン(WordPressのデータをMTタグとして出力)とMTGeshiプラグインが含まれます。</p>

<ul>
	<li><a href="https://github.com/alfasado/DynamicMTML">alfasado / DynamicMTML  - GitHub</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_1.html">(参考リンク)New DynamicMTML(PHPによるMovable Typeの拡張)-1</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_2.html">(参考リンク)New DynamicMTML(PHPによるMovable Typeの拡張)-2</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-3.html">(参考リンク)New DynamicMTML(PHPによるMovable Typeの拡張)-3</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-4.html">(参考リンク)New DynamicMTML(PHPによるMovable Typeの拡張)-4</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">Fast Field</h3>

<p>カスタムフィールドが大量にある時に管理画面のパフォーマンスを向上させるプラグインです。初期化が不要な際に処理をスキップさせたりカスタムフィールドの情報をMemcachedにキャッシュさせることで速度向上を図ります。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-fastfield">alfasado / mt-plugin-fastfield - GitHub</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">Folder Archiver</h3>

<p>フォルダ・アーカイブを作成できるようにします。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-folderarchiver">alfasado / mt-plugin-folderarchiver - GitHub</a></li>
</ul>


<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">CountGroupBy</h3>

<p>オブジェクトをグループ化してその個数を出力するMTCountGroupByブロックタグを提供します。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-countgroupby">alfasado / mt-plugin-countgroupby - GitHub</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">Custom Config</h3>

<p>管理画面でシステムスコープのカスタム設定を管理できるようにします。カスタム設定の値はカスタムフィールドのようにカスタムMTタグとして出力することが可能です。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-customconfig">alfasado / mt-plugin-customconfig - GitHub</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">Request Cache</h3>

<p>単一のリクエスト中でのみ有効なシンプルなテンプレートキャッシュを提供します。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-requestcache">alfasado / mt-plugin-requestcache - GitHub</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/01/post_3.html">(参考リンク)ブログのサイドバーを見直す(ランキング/表示順/高速化)</a></li>
</ul>

<p><ins><a name="add228" style="text-decoration:none">(2月28日以下を追加)</a></ins></p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">rebuild-archives</h3>
<p>コマンドラインまたはCronジョブで再構築を行うツールです。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-tools-rebuild-archives">alfasado / mt-tools-rebuild-archives - GitHub</a></li>
</ul>


<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:115%">Rebuild On Demand</h3>
<p>再構築をページへの(最初の)リクエストがあった時点で実行するプラグインです(旧名 RebuildAt1stView)。</p>

<ul>
	<li><a href="https://github.com/alfasado/mt-plugin-rebuild-on-demand">alfasado / mt-plugin-rebuild-on-demand- GitHub</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Power CMS for MTのCSVインポート(インポートフォーマット)</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/02/post_8.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.251</id>

    <published>2011-02-17T03:28:15Z</published>
    <updated>2011-08-16T05:35:07Z</updated>

    <summary>Power CMS for MTでは、既存HTML、CSV(TSV)、CSV(T...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 2" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="サポート" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>Power CMS for MTでは、既存HTML、CSV(TSV)、CSV(TSV)-カテゴリ、カスタムオブジェクト、Link等一括インポートの機能が充実していますが、CSV(TSV)インポータでエントリをインポートする場合の1行目の項目指定についての質問をいただくことが多いのでマニュアルを補足する形でご紹介します。</p>

<p>例えばMovable Typeのテーブルのカラム名が「entry_text」テンプレートタグは「MTEntryBody」というように必ずしもカラム名とタグ名が一致しないことに注意してください。テーブルのカラム名については<a href="http://www.phpmyadmin.net/home_page/index.php">phpMyAdmin</a>等のツールが役に立つと思います。</p>

<ul>
	<li>フォーマットはCSV又はTSV(タブ区切りテキスト)です。拡張子を必ず指定してください。</li>
	<li>entry_idをキーにインポートします(重複するentry_idがあればそのエントリを上書きします)。</li>
	<li>1行目にエントリーのカラム名、メタデータの名称を下記の表の通りに指定してください。</li>
</ul>

<h3>インポート書式</h3>

<table>
<tr>
<th>エントリーのカラム名</th><th>内容</th>
</tr><tr>
<th>entry_id</th><td>エントリのID</td>
</tr><tr>
<th>entry_author_id</th><td>エントリの所有者のauthor_id *必須</td>
</tr><tr>
<th>entry_authored_on</th><td>公開日(YYYYMMDDhhmmss形式のタイムスタンプ)</td>
</tr><tr>
<th>entry_basename</th><td>出力ファイル名</td>
</tr><tr>
<th>entry_blog_id</th><td>ブログID *必須</td>
</tr><tr>
<th>entry_text</th><td>本文</td>
</tr><tr>
<th>entry_text_more</th><td>続き</td>
</tr><tr>
<th>entry_title</th><td>タイトル</td>
</tr><tr>
<th>entry_class</th><td>クラス(entryもしくはpage) *必須</td>
</tr><tr>
<th>entry_convert_breaks</th><td>本文/続きのフォーマット=>0(なし)、__default__(改行を変換)、richtext(リッチテキスト等)</td>
</tr><tr>
<th>entry_excerpt</th><td>概要</td>
</tr><tr>
<th>entry_ext_datas</th><td>拡張フィールドとカスタムフィールドの値を連結したもの(検索用)</td>
</tr><tr>
<th>entry_isolation</th><td>どのカテゴリにも属さない場合1</td>
</tr><tr>
<th>entry_keywords</th><td>キーワード</td>
</tr><tr>
<th>entry_modified_on</th><td>最終更新日(YYYYMMDDhhmmss形式のタイムスタンプ)</td>
</tr><tr>
<th>entry_status</th><td>ステータス=>1(下書き)、2(公開)、6(承認依頼中)、7(テンプレート) *必須</td>
</tr><tr>
<th>entry_template_id</th><td>エントリーテンプレートのID</td>
</tr><tr>
<th>entry_template_module_id</th><td>エントリーテンプレートで紐付けられたのテンプレートモジュールのID</td>
</tr><tr>
<th>entry_allow_comments</th><td>コメントを許可する場合1</td>
</tr><tr>
<th>entry_allow_pings</th><td>トラックバックを許可する場合1</td>
</tr><tr>
<th>entry_unpublished</th><td>指定日非公開が指定されている場合1</td>
</tr><tr>
<th>entry_unpublished_on</th><td>非公開日(YYYYMMDDhhmmss形式のタイムスタンプ)</td>
</tr><tr>
<th colspan="2">メタデータ</th>
</tr><tr>
<th>customfield_basename名</th><td>カスタムフィールドの値(basenameで指定)</td>
</tr><tr>
<th>extfields_file_拡張フィールドのラベル名</th><td>拡張フィールドの値( %r/images/img_001.jpg のようにすると添付ファイルが指定可能)。「file」の部分はtext、textarea、checkbox、radio、cbgroupのようにフィールドの種別に変更可能です。</td>
</tr><tr>
<th>primary_category</th><td>主カテゴリ</td>
</tr><tr>
<th>category</th><td>カテゴリ(複数列指定可能、_(アンダースコア)で繋ぐとカテゴリの階層指定が可能</td>
</tr><tr>
<th>tag</th><td>タグ(複数列指定可能)</td>
</tr>
</table>

<h3>参考</h3>
<ul>
	<li><a href="http://www.sixapart.jp/pressroom/alfasado_ndl60.pdf">事例紹介「国立国会図書館開館60周年記念貴重書展 学ぶ・集う・楽しむ」(PDF:4MB)</a></li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>New DynamicMTML(PHPによるMovable Typeの拡張)-4</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-4.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.250</id>

    <published>2011-01-26T08:08:42Z</published>
    <updated>2011-01-26T09:41:04Z</updated>

    <summary>引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。 	...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 2" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。</p>

<ul>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_1.html">New DynamicMTML(PHPによるMovable Typeの拡張)-1</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_2.html">New DynamicMTML(PHPによるMovable Typeの拡張)-2</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-3.html">New DynamicMTML(PHPによるMovable Typeの拡張)-3</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MTPluginクラス</h3>

<p>Movable TypeのPHPプラグイン作成についてはドキュメントが少ないこと、Perlとお作法が違うこと(<a href="http://www.movabletype.jp/documentation/developer/plugins/plugin-dev-1-5.html#a005">ファンクションタグの例</a>)から作成している人はPerlと比較して少ないようです。DynamicMTMLのPerl互換ライブラリによってコードは比較的近い形で書けますが、プラグインの構造やお作法については何となく馴染めない(例:タグの数だけファイルが必要)、という方も多いのではないでしょうか。</p>

<p>新しいPower CMS for MT(DynamicMTML)では、PHPのプラグインのベースとなるMTObjectクラスが追加されました。これを利用することで、プラグインの利用、設定へのアクセス、タグの追加などをひとつのconfig.phpの中に記述できるようになり、メンテナンス性が大きく向上するとともに、PHPの(忌まわしい!)関数名の重複などを気にする必要がなくなります。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">config.phpの記述ルール</h3>

<p>プラグインがMyPluginの場合、mt/plugins/MyPlugin/php/config.phpに設置したものがプラグインとして認識されます。プラグインはクラスMTPluginを継承する形で記述します。以下に例をあげます。</p>

<pre><code style="overflow:auto">&lt;?php
class MyFirstPlugin extends MTPlugin {
    // var $registryに設定やタグ、コールバック等をまとめて記述します。
    var $registry = array(
        'name' =&gt; 'MyFirstPlugin',
        'key'  =&gt; 'myfirstplugin',
        'config_settings' =&gt; array(
            'PluginConfigSetting' =&gt; array( 'default' =&gt; 0 ),
        ),
        'settings' =&gt; array(
            'example_setting' =&gt; array( 'default' =&gt; 1 ),
        ),
        'tags' =&gt; array(
            'block'    =&gt; array( 'example_block'     =&gt; 'hdlr_block' ), // ,...
            'function' =&gt; array( 'example_function1' =&gt; 'hdlr_function' ), // ,...
            'modifier' =&gt; array( 'example_modifier1' =&gt; 'filter_modifier' ), // ,...
        ),
        'callbacks' =&gt; array(
            'build_page' =&gt; 'filter_build_page',
            'post_init'  =&gt; 'post_init_routine',
        ),
    );
    // 以下、タグやコールバックに対応するメソッド
}
?&gt;</code></pre>

<p>テンプレートタグの場合、ハッシュのキーがタグ名、値がメソッド名です。上記の例の場合、クラスメソッドhdlr_functionを指定することでファンクションタグ&lt;mt:example_function1&gt;が動的にロードされ利用できるようになります。</p>

<p>このプラグインをconfig.php形式にすると以下のようになります。タグが一つの場合はconfig.phpにするメリットはあまりありませんが、複数のタグを管理したり共通のメソッドを記述することで開発規模が大きくなってきた際にその効果を実感できるのではないかと思います。</p>

<pre><code style="overflow:auto">&lt;?php
class HelloWorld extends MTPlugin {
    var $registry = array(
        'name' =&gt; 'MyFirstPlugin',
        'tags' =&gt; array(
            'function' =&gt; array( 'helloworld' =&gt; 'hdlr_helloworld' )
        ),
    );
    function hdlr_helloworld( $args, &amp;$ctx ) {
        return 'Hello, world!';
    }
}
?&gt;</code></pre>


<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">config.yamlでの定義</h3>

<p>DynamicMTMLはプラグインの初期化の際にプラグイン直下にconfig.yamlがあればそのファイルをロードしてタグやコールバックを登録します。よって、config.phpに記述するかわりにconfig.yamlに記述しても同じように動作します(この時config.phpに設定が存在すればそちらが優先されます。そして、この時ハッシュの値に指定するメソッドはconfig.php内に記述します)。</p>

<p>MTで開発をしている人ならおわかりいただけるかと思いますが、PerlとPHPの両方に対応させる時に、構造や設定をconfig.yamlに、Perlのコードはlib/Tags.pmに、PHPのコードはphp/config.phpに記述するといった管理ができます(もちろんconfig.phpからphp/Tags.phpをincludeするようにするなどのやり方もできるでしょう)。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">config.yamlとプラグインのローカライゼーション</h3>

<p>MTは(<strong>2月から!!</strong>)国産CMSとなるわけですが開発のベースは英語で作られており、各国語にローカライズされています。</p>

<ul>
	<li><a href="http://www.movabletype.jp/documentation/developer/plugins/plugin-dev-1-4.html">プラグインのローカライゼーションについて(movabletype.jp)</a></li>
</ul>

<p>DynamicMTMLはローカライズについてもPerlときわめて近い方法で行うことが可能です。config.yamlを起点としたHelloWorldプラグインのファイル構成を以下に示します。</p>

<pre><code style="overflow:auto">MT_DIR/
|＿ plugins/
   |＿ HelloWorld/
      |＿ config.yaml
      |＿ lib/
      |  |＿ HelloWorld/
      |     |＿ Tags.pm
      |     |＿ L10N.pm
      |     |＿ L10N/
      |        |＿ ja.pm
      |＿ php/
         |＿ config.php
         |＿ l10n/
             |＿ l10n_ja.php
</code></pre>

<p>PHPの言語ファイルはpluginディレクトリのphp/l10n/以下にl10n_ja.phpのような名前で設置します。</p>

<pre><code style="overflow:auto">&lt;?php
$Lexicon = array(
    'Hello, world!' =&gt; 'こんにちは、世界!',
);
?&gt;</code></pre>

<p>テンプレートタグで各言語に翻訳するにはmt:setvarとmt:transタグを使います。この時、翻訳される言語は、1.ユーザーがログインしていてユーザーのコンテキストがセットされているブロックでは現在のユーザーの言語、2.それ以外ではDefaultLanguageで設定されている言語になります。</p>

<pre><code style="overflow:auto">&lt;$mt:HelloWorld setvar=&quot;hello&quot;$&gt;
&lt;$mt:trans phrase=&quot;$hello&quot;$&gt;</code></pre>

<p>プラグイン内での翻訳は以下のようになります。</p>

<pre><code style="overflow:auto">&lt;?php
class HelloWorld extends MTPlugin {
    function hdlr_helloworld( $args, &amp;$ctx ) {
        return $this-&gt;translate( 'Hello, world!' );
    }
}
?&gt;</code></pre>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:110%">サンプルプラグイン</h3>

<ul>
	<li><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://powercms.alfasado.net/blog/2011/01/26/HelloWorld.zip">HelloWorld.zip</a></span></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MT::Plugin(MT::PluginData)互換のメソッド</h3>

<dl>
<dt>$app-&gt;component($plugin_name)</dt>
<dd><p>config.yamlまたはconfig.phpで定義したクラスを取得します。config.yamlのみでconfig.phpが存在しない場合はMTPluginクラス、config.phpが存在する場合はconfig.phpで定義したクラスを取得します。</p></dd>

<dt>$plugin-&gt;get_config_obj($scope)</dt>
<dd><p>該当のプラグインのMT::PluginDataオブジェクトを取得します。MT::PluginDataが存在しない場合はプラグインの初期設定値をセットしたオブジェクトを生成して返します。$scopeは&quot;blog:1&quot;のようにブログIDを含む文字列を渡します。書略した場合はシステムスコープのプラグイン設定を返します。</p></dd>

<dt>$plugin-&gt;get_config_hash($scope)</dt>
<dd><p>MT::PluginDataオブジェクトから設定値のみをキーと値の配列で返します。MT::PluginDataが存在しない場合はプラグインの初期設定値をセットした値を返します。</p></dd>

<dt>$plugin-&gt;reset_config($scope)</dt>
<dd><p>MT::PluginDataに保存された値をクリアして設定を初期値にリセットします。</p></dd>

<dt>$plugin-&gt;config_vars()</dt>
<dd><p>プラグイン設定のキーの配列を返します。</p></dd>

<dt>$plugin-&gt;get_config_value($key,$scope)</dt>
<dd><p>キーとスコープを指定してプラグイン設定を取得します。MT::PluginDataが存在しない場合は初期値を返します。</p></dd>

<dt>$plugin-&gt;set_config_value($key[,$value,$scope])</dt>
<dd><p>キーと値、スコープを指定してプラグイン設定を更新します。$keyにキーと値の配列を渡した場合、第二引数$valueがスコープとなります。</p></dd>
</dl>]]>
        
    </content>
</entry>

<entry>
    <title>New DynamicMTML(PHPによるMovable Typeの拡張)-3</title>
    <link rel="alternate" type="text/html" href="http://powercms.alfasado.net/blog/2011/01/new_dynamicmtmlphpmovable_type-3.html" />
    <id>tag:powercms.alfasado.net,2011:/blog//1.249</id>

    <published>2011-01-21T03:17:13Z</published>
    <updated>2011-01-21T02:35:58Z</updated>

    <summary>引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。 	...</summary>
    <author>
        <name>Junnama Noda</name>
        <uri>http://powercms.alfasado.net/mte/mt-cp.cgi?__mode=view&amp;blog_id=1&amp;id=2</uri>
    </author>
    
        <category term="Power CMS 2" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プラグイン" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術情報" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://powercms.alfasado.net/blog/">
        <![CDATA[<p>引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。</p>

<ul>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_1.html">New DynamicMTML(PHPによるMovable Typeの拡張)-1</a></li>
	<li><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_2.html">New DynamicMTML(PHPによるMovable Typeの拡張)-2</a></li>
</ul>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">Perl APIとの互換メソッド</h3>

<p>Movable Typeの特徴のひとつにPerlによる静的出力とPHPによるダイナミックパブリッシングの両方が使えることがあげられますが、プラグインを両方に対応させるためには、両方のコードを書かないといけないことから両対応していないプラグインが数多く存在します(Power CMS for MTはすべて両対応しています)。</p>

<p>理由の一つに、PerlとPHPでコードの書き方が違うことがあげられると思います。今回のDynamicMTMLは静的ファイル中のMTML実行に留まらず、PHPプラグインを簡単に作成するための様々なライブラリを実装しました。</p>

<p><a href="http://powercms.alfasado.net/blog/2010/12/new_dynamicmtml_1.html#mt_app">MT::App互換メソッドについてはこちらのエントリで紹介</a>済みですが、その他にも様々なメソッドが実装されています。</p>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MT::Objectを扱うためのPerl互換メソッド</h3>

<dl>
<dt>$app-&gt;load($class,$terms[,$args])</dt>
<dd><p>オブジェクト$classを$terms、$argsの条件に従ってロードします。
$termsが数値の場合(ID)、及び$args['limit']に1が指定されている場合に返り値は単一のオブジェクトとなり、それ以外の場合はオブジェクトの配列を返します。$termsの各値には配列を指定可能です(OR検索になります)。</p>

<pre><code style="overflow:auto"><strong>例:ブログIDとエントリーIDを指定してエントリーを1件ロードする</strong>
$terms = array( 'blog_id' =&gt; $blog_id, 'id' =&gt; $id );
$args  = array( 'limit' =&gt; 1 );
$entry = $app-&gt;load( 'Entry', $terms, $args );

※次のように書くこともできます。
$entry = $app-&gt;load( 'Entry', $id );

<strong>例:カテゴリーIDを指定してブログ記事を10件ロードする</strong>
$terms = array( 'blog_id' =&gt; $blog_id,
                'status'  =&gt; 2 );
$args  = array( 'sort' =&gt; 'authored_on',
                'direction' =&gt; 'descend',
                'limit' =&gt; 10 );
$join  = array( 'mt_placement', 'entry_id',
                array( 'category_id' =&gt; $category_id ) );
$args[ 'join' ] = $join;
$entries = $app-&gt;load( 'Entry', $terms, $args );

<strong>例:公開日が今日のブログ記事/ウェブページをロードする</strong>
$current_ts = $app-&gt;current_ts( $blog );
$ymd = substr( $current_ts, 0, 4 ) . '-' .
       substr( $current_ts, 4, 2 ) . '-' .
       substr( $current_ts, 6, 2 ) ;
// 2011-01-01 or
// $current_ts = $app-&gt;db()-&gt;ts2db( $current_ts );
// $ymd = preg_replace( '/^(([0-9][^0-9]*){8}).*$/', '$1', $current_ts );
$terms = array( 'blog_id' =&gt; $blog-&gt;id,
                'class'   =&gt; array( 'entry', 'page' ),
                'authored_on' =&gt; array( 'like' =&gt; $ymd . '%' ),
                'status'  =&gt; 2 );
$entries = $this-&gt;load( 'Entry', $terms );

<strong>例:日付を範囲指定してブログ記事をロードする</strong>
$terms = array( 'blog_id' =&gt; $blog_id,
                'authored_on' =&gt; array( '20110101000000',
                                        '20110131235959' ),
                'status'  =&gt; 2 );
$args  = array( 'sort' =&gt; 'authored_on',
                'direction' =&gt; 'descend',
                'range_incl' =&gt; array( 'authored_on' =&gt; 1 ),
                // or 'start_val' =&gt; '20110131000000',
                );
$entries = $this-&gt;load( 'Entry', $terms, $args );</code></pre>

<p>これにより、Perlとほぼ同じ書き方でコードを書くことができます。</p>
<pre><code style="overflow:auto"><strong>例:プレビュー一時ファイルの削除</strong>

<strong>Perl(MT::Core.pm)</strong>
sub remove_temporary_files {
   require MT::Session;

   my @files = MT::Session-&gt;load(
       { kind =&gt; 'TF', start =&gt; [ undef, time - 60 * 60 ] },
       { range =&gt; { start =&gt; 1 } } );
   my $fmgr = MT::FileMgr-&gt;new('Local');
   foreach my $f (@files) {
       if ($fmgr-&gt;delete($f-&gt;name)) {
           $f-&gt;remove;
       }
   }
   # This is a silent task; no need to log removal of temporary files
   return '';
}

<strong>PHP</strong>
function remove_temporary_files() {
   $files = $app-&gt;load( 'Session',
            array( 'kind' =&gt; 'TF', 
                   'start' =&gt; array( NULL, time() - 60 * 60 ) ),
            array( 'range' =&gt; array( 'start' =&gt; 1 ) ) );
   foreach ( $files as $f ) {
       if ( $app-&gt;delete( $f-&gt;name ) ) {
           $f-&gt;Delete();
           // または $app-&gt;remove( $f );
       }
   }
   return '';
}</code></pre>
</dd>

<dt>$app-&gt;get_by_key($class,$terms)</dt>
<dd><p>$class,$termsからオブジェクトをロードし、条件に一致するものがなければオブジェクトを作成します(戻り値は常に単一のオブジェクトです)。</p></dd>

<dt>$app-&gt;exists($class,$terms)</dt>
<dd><p>$class,$termsからオブジェクトをロードし、条件に一致するものが存在する場合に1を返します。</p></dd>

<dt>$app-&gt;column_values($obj)</dt>
<dd><p>オブジェクトのカラム名とカラム値の配列を返します($obj-&gt;GetArray()と同様)。</p></dd>

<dt>$app-&gt;column_names($obj)</dt>
<dd><p>オブジェクトのカラム名の配列を返します($obj-&gt;GetAttributeNames()と同様)。</p></dd>
</dl>
</dl>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MT::WeblogPublisher互換のメソッド</h3>

<p>ダイナミックパブリッシングエンジンを利用して再構築を行います。この時、$param['build_type']でテンプレートのbuild_typeを配列で指定することができます。build_typeが1,2のテンプレートではビルドした結果を静的ファイルとして出力します。build_typeが3のテンプレートはmt_fileinfoレコードの更新のみを行います(ファイルが存在する場合は.static拡張子を付けたファイルにリネームされます)。build_typeが4のテンプレートは再構築キューに登録されます。</p>

<dl>
<dt>$app-&gt;rebuild($args)</dt>
<dd><p>ブログ、インデックス、アーカイブを再構築します。再構築の対象を限定する場合には、対象を引数$argsに指定します。$argsには、次の項目を指定できます。</p>

<dl>
<dt>Blog</dt>
<dd>再構築するブログに対応するMT::Blogオブジェクトです。BlogまたはBlogIDのいずれか一方を必ず指定してください。</dd>
<dd>BlogID:再構築するブログのブログIDです。BlogIDまたはBlogのいずれか一方を必ず指定してください。</dd>
<dt>ArchiveType</dt>
<dd>再構築するアーカイブの種類です(複数指定する場合はカンマ区切りテキストで指定してください)。この引数はオプションです。指定しない場合はすべてのアーカイブの種類が再構築の対象となります。</dd>
<dt>NoIndexes</dt>
<dd>rebuildメソッドは、デフォルトではすべてのアーカイブを再構築したあとでインデックス・テンプレートを再構築します。インデックス・テンプレートを再構築したくない場合は、TRUEをこの引数に指定してください。この引数はオプションです。</dd>
<dt>NoStatic</dt>
<dd>この値をtrueにすると、再構築ルーチンに対して、スタティックな出力ファイルの再構築の必要がないことを指示します(build_typeが1と2のアーカイブを再構築対象から外します)。</dt>
<dt>Limit</dt>
<dd>再構築するエントリーの件数を、当該ブログ中の最新N件に限定します(アーカイブタイプが'Indivisual'及び'Page'の時のみ有効です)。</dd>
<dt>Offset</dt>
<dd>Limitと組み合わせて指定し、エントリー・アーカイブの再構築の開始位置を指定します(アーカイブタイプが'Indivisual'及び'Page'の時のみ有効です)。</dd>
</dd>
</dl>
<pre><code style="overflow:auto">例:最新10件のブログ記事を再構築する
$app-&gt;rebuild( array( 'Blog' =&gt; $blog,
                      'ArchiveType' =&gt; 'Individual',
                      'NoIndexes' =&gt; 1,
                      'Limit' =&gt; 10 ) );</code></pre>
</dd>

<dt>$app-&gt;rebuild_indexes([$params])</dt>
<dd><p>現在のブログまたは$param['blog']にセットしたブログのインデックス・テンプレートを再構築します。</p>
<pre><code style="overflow:auto">$app-&gt;rebuild_indexes( array( 'blog' => $blog,
                       'build_type' =&gt; array( 1, 3, 4 ) );</code></pre>
</dd>

<dt>$app-&gt;rebuild_archives([$params])</dt>
<dd><p>現在のブログまたは$param['blog']にセットしたブログのテンプレートのうち$param['recipe']で指定したアーカイブを再構築します。$param['updated']を指定することでアクティブなリクエストで更新、保存されたエントリー及びエントリーに関連するアーカイブだけを再構築対象とすることができます。</p>

<pre><code style="overflow:auto">$archives = array( 'Index', 'Category', 'Monthly' );
$app-&gt;rebuild_archives( array( 'blog' =&gt; $blog,
                               'recipe' =&gt; $archives,
                               'updated' =&gt; 1 ) );
</code></pre>
<p>$param['limit'],$param['offset']を指定することで再構築対象範囲を指定することができます。アーカイブによってカウント対象となるオブジェクトは変わります。</p>

<dl>
<dt>インデックス・アーカイブ</dt>
<dd>テンプレートの数</dd>
<dt>ブログ記事</dt>
<dd>ブログ記事の数</dd>
<dt>ウェブページアーカイブ</dt>
<dd>ウェブページの数</dd>
<dt>カテゴリ</dt>
<dd>カテゴリの数</dd>
<dt>日付アーカイブ</dt>
<dd>出力されるアーカイブの数</dd>
<dt>ユーザー/日付アーカイブ</dt>
<dd>ユーザーの数</dd>
<dt>カテゴリ/日付アーカイブ</dt>
<dd>カテゴリの数</dd>
</dl>
<p>* PluginName/php/publishers/ArchiveTypeName.php を設置することでカスタム・アーカイブタイプを再構築させることができます。</p>
</dd>

<dt>$app-&gt;rebuild_entry($param)</dt>
<dd><p>引数$paramで指定されたエントリーを再構築します。$param['BuildDependencies']を指定することで関連するアーカイブを同時に再構築します。</p>
<pre><code style="overflow:auto">$app-&gt;rebuild_entry( array( 'entry' =&gt; $entry,
                            'BuildDependencies' =&gt; 1 ) );</code></pre>
</dd>

<dt>$app-&gt;rebuild_category($param)</dt>
<dd><p>引数$paramで指定されたカテゴリを再構築します。</p>
<pre><code style="overflow:auto">$app-&gt;rebuild_category( array( 'category' =&gt; $category ) );</code></pre>
</dd>

<dt>$app-&gt;rebuild_from_fileinfo($fileinfo)</dt>
<dd><p>MT::FileInfoオブジェクトから該当するアーカイブを再構築します。MT::FileInfoオブジェクトのbuild_typeによって静的再構築、再構築キューへの登録のいずれかを行います。</p>
</dd>
</dl>

<h3 style="font-weight:bold;margin-bottom:0.7em;font-size:120%">MT::FileMgr互換のメソッド</h3>

<dl>
<dt>$app-&gt;put($src,$dest[,$type ])</dt>
<dd><p>$dest で指定したパスのファイルへ $src ファイルの内容を出力します。$src はローカル・ファイルのパス名またはURLです。$dest はローカル・ファイルのパス名です。<br />
$type はオプションで、put がアップロード・ファイル用のものか、HTMLファイル出力かを指定します。これは書き込みのモードや umask設定などを伝えるためのものです。$type には&quot;upload&quot;か&quot;output&quot;が指定可能で、デフォルトは&quot;output&quot;です。戻り値は出力したバイト数(0のこともあります)になります。エラー発生時にはFALSEを返します。</p>
</dd>

<dt>$app-&gt;put_data($data,$dest[,$type ])</dt>
<dd><p>$dest で指定したパスのファイルへ $src ファイルの内容を出力します。$src はローカル・ファイルのパス名またはURLです。$dest はローカル・ファイルのパス名です。<br />
$type はオプションで、put がアップロード・ファイル用のものか、HTMLファイル出力かを指定します。これは書き込みのモードや umask設定などを伝えるためのものです。$type には&quot;upload&quot;か&quot;output&quot;が指定可能で、デフォルトは&quot;output&quot;です。戻り値は出力したバイト数(0のこともあります)になります。エラー発生時にはFALSEを返します。</p>
</dd>

<dt>$app-&gt;get_data($src)</dt>
<dd><p>$src に指定したパスからデータ・ブロックを取得し、取得したデータを返します。$src はローカル・ファイルのパス名またはURLです。取得に失敗するとFALSEを返します。</p></dd>

<dt>$app-&gt;mkpath($path[,$perms])</dt>
<dd><p>$pathに指定したパスを再帰的に作成します。つまり、パス中に一つでも存在しないものがあれば、それを作成します。作成に失敗すると(または作成したディレクトリに書き込み権限がない場合)FALSEを返します。$perms を指定すると作成したディレクトリのパーミッションを $perms に設定します。$permsの指定を省略すると $app-&gt;config('DirUmask')で指定されたパーミッションに設定されます。</p></dd>

<dt>$app-&gt;content_is_updated($file,$content)</dt>
<dd><p>$fileが存在しないか $fileの内容が$contentの内容と異なる場合に1を返します。</p></dd>

<dt>$app-&gt;delete($file)</dt>
<dd><p>$fileを削除します。削除に成功した場合、および$fileが存在しないか $fileがシンボリックリンクである場合、TRUEを返します。</p></dd>

</dl>

<p>引き続き次回のエントリではClass MTPlugin(config.yaml又はconfig.phpで定義するPHPプラグイン)のしくみと作成方法についてご紹介します。</p>]]>
        
    </content>
</entry>

</feed>

