<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3"
	xml:lang="ja"
	xmlns="http://purl.org/atom/ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">
	<title>開発室ノート</title>
	<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/" />
	<modified>2007-07-05T11:27:18+00:00</modified>
	<tagline><![CDATA[]]></tagline>
	<generator url="http://serenebach.net/">Serene Bach</generator>
	<entry>
		<title>管理用プラグイン</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid8.html" />
		<id>http://serenebach.net/_technote/log/eid8.html</id>
		<issued>2007-07-05T20:15:00+09:00</issued>
		<modified>2007-07-05T11:15:00Z</modified>
		<summary>Serene Bachでは、プラグインにより「追加機能」メニューに追加される管理画面を作成することができます。例えば、sbでは標準の機能だった「アクセス解析」と「データ移行」はプラグインとして提供され、ユーザー...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>Serene Bachでは、プラグインにより「追加機能」メニューに追加される管理画面を作成することができます。</p>
<p>例えば、sbでは標準の機能だった「アクセス解析」と「データ移行」はプラグインとして提供され、ユーザー側で自由に外すことができます。</p>
<p>管理用プラグインとして機能させるためには<q><code>register_plugin</code></q>の後、<q><code>register_admin_module</code></q>メソッドにより、管理用プラグインとして登録する必要があります。</p>
<pre>sb::Plugin-&gt;register_admin_module(
  <span class="quote">'mode'</span>   =&gt; <span class="quote">'memo'</span>,
  <span class="quote">'level'</span>  =&gt; 1,
  <span class="quote">'module'</span> =&gt; <span class="quote">'sb::Admin::Memo'</span>,
);</pre>
<p><q><code>register_admin_module</code></q>メソッドには<q><code>mode</code></q>, <q><code>level</code></q>, <q><code>module</code></q>という3つの引数があります。</p>
<p><q><code>mode</code></q>は必ず指定する必要があります。これは管理画面で利用するモード名としても利用され、ユニークな名称を利用する必要があります。</p>
<p>以下の名称はシステムで予約されているので、利用できません。</p>
<ul>
<li> new</li>
<li> edit</li>
<li> list</li>
<li> category</li>
<li> upload</li>
<li> amazon</li>
<li> link</li>
<li> profile</li>
<li> comment</li>
<li> trackback</li>
<li> refuse</li>
<li> user</li>
<li> rebuild</li>
<li> template</li>
<li> editor</li>
<li> config</li>
<li> status</li>
<li> help</li>
<li> bm</li>
<li> view</li>
<li> login</li>
<li> logout</li>
<li> edittemp</li>
<li> edituser</li>
</ul>
<p>また、上記以外でも標準プラグインで利用されているaccesslog, convert, memoは混乱を避けるため、利用しない方がよいでしょう。</p>
<p><q><code>level</code></q>はそのメニューを利用できるユーザー管理レベルを規定します。この引数が無指定の場合、0として扱われます。</p>
<ul>
<li> 0 : 全ユーザー</li>
<li> 1 : 上級ユーザー・管理ユーザー</li>
<li> 2 : 管理ユーザーのみ</li>
</ul>
<p>例えば、<q><code>'level' =&gt; 1,</code></q>と指定すると、その管理用プラグインは上級ユーザーと管理ユーザーが利用できます。</p>
<p><q><code>module</code></q>は管理用プラグインを実装しているパッケージ名を指定します。<q><code>module</code></q>が無指定の場合、カレントパッケージ(プラグイン内のパッケージ)名が<q><code>module</code></q>として利用されます。</p>
<p>ここで指定されたパッケージには必ず「<q><code>callback</code></q>」というサブルーチンを定義しておく必要があります。</p>]]></content>
	</entry>
	<entry>
		<title>変数%varについて</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid7.html" />
		<id>http://serenebach.net/_technote/log/eid7.html</id>
		<issued>2007-07-05T20:00:00+09:00</issued>
		<modified>2007-07-05T11:00:00Z</modified>
		<summary>コンテンツ用プラグインで登録したコールバック関数で受け取るハッシュ%varには、コンテンツ表示に必要だと思われる様々な情報が含まれています。特に利用頻度の高い変数には以下のものがあります。ハッシュキー種...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>コンテンツ用プラグインで登録したコールバック関数で受け取るハッシュ%varには、コンテンツ表示に必要だと思われる様々な情報が含まれています。</p>
<p>特に利用頻度の高い変数には以下のものがあります。</p>
<table>
<tr><th>ハッシュキー</th><th>種類</th><th>内容</th></tr>
<tr><td>mode</td><td>文字列</td><td>選択されているモードを示します。</td></tr>
<tr><td>conf</td><td>object</td><td>環境設定オブジェクトが格納されています。$var&#123;'conf'&#125;-&gt;value('conf_srv_base')のようにvalueメソッドにより環境設定の読み出しができます(この場合、トップページのアドレスが取得できます)。</td></tr>
<tr><td>lang</td><td>object</td><td>言語設定オブジェクトが格納されています。日本語リソースに格納された文字列を読み出すときに利用します。</td></tr>
<tr><td>blog</td><td>object</td><td>ウェブログ名などいくつかのウェブログデータを収めたデータオブジェクトが格納されています。</td></tr>
<tr><td>user</td><td>ハッシュ</td><td>ウェブログユーザー情報がユーザーidをキーとするハッシュの形で格納されています。</td></tr>
<tr><td>cat</td><td>ハッシュ</td><td>カテゴリーデータがカテゴリーidをキーとするハッシュの形で格納されています。</td></tr>
<tr><td>entryinfo</td><td>ハッシュ</td><td>月別・カテゴリー別の記事数などの記事情報が格納されています。</td></tr>
</table>]]></content>
	</entry>
	<entry>
		<title>sb::TemplateManagerモジュール</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid6.html" />
		<id>http://serenebach.net/_technote/log/eid6.html</id>
		<issued>2007-06-09T17:00:00+09:00</issued>
		<modified>2007-06-09T08:00:00Z</modified>
		<summary>コンテンツ用のプラグインで指定されたコールバック関数の第一引数はsb::TemplateManagerインスタンスになります。sb::TemplateManagerを通して、独自タグの置換操作・独自ブロックの表示数指定を行います。sb::T...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>コンテンツ用のプラグインで指定されたコールバック関数の第一引数は<q><code>sb::TemplateManager</code></q>インスタンスになります。</p>
<p><q><code>sb::TemplateManager</code></q>を通して、独自タグの置換操作・独自ブロックの表示数指定を行います。</p>
<p><q><code>sb::TemplateManager</code></q>のインスタンスは慣例上、<q><code>$cms</code></q>という変数を利用します。以下、特に断りがない場合、<q><code>$cms</code></q>は<q><code>sb::TemplateManager</code></q>のインスタンスを示します。</p>
<p>コンテンツ用プラグインにおいて、利用する<q><code>sb::TemplateManager</code></q>のメソッドは3つです。</p>
<ul>
<li> tag</li>
<li> block</li>
<li> num</li>
</ul>
<dl>
<dt>tag</dt>
<dd>独自タグの置換操作を行います。</dd>
</dl>
<pre><em class="variable">$cms</em>-&gt;tag(<span class="quote">'tag_name'</span>=&gt;<span class="quote">'hogehoge'</span>);</pre>
<p>ここで<q><code>tag_name</code></q>は独自タグ名です。独自タグは<q><code>&#123;tag_name&#125;</code></q>という形式ですが、このうち先頭の「&#123;」と末尾の「&#125;」を省いた文字列になります。</p>
<dl>
<dt>block</dt>
<dd>独自ブロックの表示数指定(該当ブロックの繰り返し表示数)を行います。</dd>
</dl>
<pre><em class="variable">$cms</em>-&gt;block(<span class="quote">'block_name'</span>=&gt;1);</pre>
<p>ここで<q><code>block_name</code></q>は独自ブロック名です。独自ブロックは<q><code>&lt;!-- BEGIN block_name --&gt;</code></q>と<q><code>&lt;!-- END block_name --&gt;</code></q>という形式で表現されますが、このうち<q><code>block_name</code></q>にあたる文字列になります</p>
<dl>
<dt>num</dt>
<dd>独自タグの対象ブロック番号を指定します。</dd>
</dl>
<pre><em class="variable">$cms</em>-&gt;num(0);</pre>
<p>原則として、tagメソッドを呼び出す前に宣言する必要がありますが、<q><code>&quot;type&quot; =&gt; &quot;main&quot;</code></q>以外のコンテンツ用プラグインではプラグインが呼び出される前に必ず呼び出されているので、通常利用する必要はありません。 </p>]]></content>
	</entry>
	<entry>
		<title>コンテンツ用プラグインの仕組み</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid5.html" />
		<id>http://serenebach.net/_technote/log/eid5.html</id>
		<issued>2007-05-30T18:00:00+09:00</issued>
		<modified>2007-05-30T09:00:00Z</modified>
		<summary>コンテンツ用プラグインは、記事やプロフィール情報をテンプレートデータに展開する際に呼ばれます。コンテンツ用プラグイン登録register_content_moduleメソッドの「callback」で指定したサブルーチンが呼び出さ...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>コンテンツ用プラグインは、記事やプロフィール情報をテンプレートデータに展開する際に呼ばれます。</p>
<p>コンテンツ用プラグイン登録<q><code>register_content_module</code></q>メソッドの「callback」で指定したサブルーチンが呼び出されます。</p>
<p><q><code>register_content_module</code></q>メソッドで指定する「type」によって、コールバック関数の引数が変わります。</p>
<table>
<tr><th>type</th><th>コールバック関数の引数</th></tr>
<tr>
<th>main</th>
<td><ol>
<li>$cms : sb::TemplateManagerインスタンス</li>
<li>%var : 環境変数・記事情報変数など</li>
</ol></td>
</tr>
<tr>
<th>entry</th>
<td><ol>
<li>$cms : sb::TemplateManagerインスタンス</li>
<li>$entry : 対象となる記事情報</li>
<li>%var : 環境変数・記事情報変数など</li>
</ol></td>
</tr>
<tr>
<th>comment</th>
<td><ol>
<li>$cms : sb::TemplateManagerインスタンス</li>
<li>$com : 対象となるコメント情報</li>
<li>%var : 環境変数・記事情報変数など</li>
</ol></td>
</tr>
<tr>
<th>trackback</th>
<td><ol>
<li>$cms : sb::TemplateManagerインスタンス</li>
<li>$tb : 対象となるトラックバック情報</li>
<li>%var : 環境変数・記事情報変数など</li>
</ol></td>
</tr>
<tr>
<th>profile</th>
<td><ol>
<li>$cms : sb::TemplateManagerインスタンス</li>
<li>$user : 対象となるユーザー情報</li>
<li>%var : 環境変数・記事情報変数など</li>
</ol></td>
</tr>
</table>
<p>最初の引数は必ず<q><code>sb::TemplateManager</code></q>インスタンスで、最後の引数(厳密には残りの引数)は環境設定・記事情報などをひとまとめにしたハッシュ(連想配列)になっています。</p>
<p><q><code>&quot;type&quot; =&gt; &quot;main&quot;</code></q>以外のコールバック関数では、第二引数として対象となるデータオブジェクトのインスタンスが格納されます。</p>
<pre>   <em class="keyword">sub</em> _topmemo &#123;
     <em class="keyword">my</em> <em class="variable">$cms</em> = <em class="keyword">shift</em>;
     <em class="keyword">my</em> <em class="variable">%var</em> = <em class="variable">@_</em>;
     <span class="comment"># 以下、処理内容</span>
     <em class="keyword">return</em> 1;
   &#125;</pre>
<p><q><code>&quot;type&quot; =&gt; &quot;main&quot;</code></q>のコールバック関数では、<q><code>register_content_module</code></q>メソッドで指定する「field」と同名の独自ブロックを処理します。そのブロックの繰り返し数を返り値としてreturnする必要があります。</p>
<p>例えば、上述の例は「ちょっと一言」プラグインから引用していますが、「field」として「topmemo」が指定されています。返り値が1の場合、&lt;!-- BEGIN topmemo --&gt;〜&lt;!-- END topmemo --&gt;領域が1度だけ表示されます。返り値として、0を返すと、該当領域は非表示になります。</p>
<pre>   <em class="keyword">sub</em> content &#123;
     <em class="keyword">my</em> <em class="variable">$cms</em> = <em class="keyword">shift</em>;
     <em class="keyword">my</em> <em class="variable">$entry</em> = <em class="keyword">shift</em>;
     <em class="keyword">my</em> <em class="variable">%var</em> = <em class="variable">@_</em>;
     <span class="comment"># 以下、処理内容</span>
   &#125;</pre>
<p><q><code>&quot;type&quot; =&gt; &quot;main&quot;</code></q>以外のコールバック関数では、返り値を指定する必要はありません。</p>
<p><q><code>&quot;type&quot; =&gt; &quot;main&quot;</code></q>以外のコールバック関数では、第二引数として対象となるデータオブジェクトのインスタンスを受け取ります。このインスタンスの実体は<q><code>sb::Data::Object</code></q>を継承したSerene Bachのデータオブジェクトです。</p>
<p>上記の例では、<q><code>$entry</code></q>という変数に記事データオブジェクト<q><code>sb::Data::Entry</code></q>のインスタンスが格納されます。例えば、<q><code>$entry-&gt;subj</code></q>というアクセサにより、記事タイトルを取得できます。</p>]]></content>
	</entry>
	<entry>
		<title>コンテンツ用プラグイン</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid4.html" />
		<id>http://serenebach.net/_technote/log/eid4.html</id>
		<issued>2007-05-29T18:30:00+09:00</issued>
		<modified>2007-05-29T09:30:00Z</modified>
		<summary>コンテンツ用プラグインは、既存の独自ブロック・独自タグの動作を変更したり、新しく独自ブロック・独自タグを追加するプラグインです。Serene Bachでは既存の独自ブロックを置き換えるプラグインを有効にすると...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>コンテンツ用プラグインは、既存の独自ブロック・独自タグの動作を変更したり、新しく独自ブロック・独自タグを追加するプラグインです。</p>
<p>Serene Bachでは既存の独自ブロックを置き換えるプラグインを有効にすると、基本的に標準動作の代わりにプラグインが動作するようになります。</p>
<p>もし既存の独自ブロック内部に追加する形で動作させたいなどの場合は、プラグイン側で明示的に標準動作をハンドリングしているサブルーチンを呼び出す必要があります。</p>
<p>コンテンツ用プラグインとして機能させるためには<q><code>register_plugin</code></q>の後、<q><code>register_content_module</code></q>メソッドにより、管理用プラグインとして登録する必要があります。</p>
<pre>sb::Plugin-&gt;register_content_module(
  <span class="quote">'type'</span>     =&gt; <span class="quote">'main'</span>,
  <span class="quote">'callback'</span> =&gt; &amp;sb::Content::Memo::_topmemo,
  <span class="quote">'field'</span>    =&gt; <span class="quote">'topmemo'</span>,
  <span class="quote">'name'</span>     =&gt; <em class="keyword">undef</em>,
);</pre>
<p><q><code>register_content_module</code></q>メソッドには<q><code>type</code></q>, <q><code>callback</code></q>, <q><code>field</code></q>, <q><code>name</code></q>という4つの引数があります。</p>
<p>typeは必ず指定する必要があります。コンテンツ用プラグインが適用される種類を指定します。以下の5つからいずれかのtypeが指定されます。</p>
<ul>
<li> main</li>
<li> entry</li>
<li> comment</li>
<li> trackback</li>
<li> profile</li>
</ul>
<p><q><code>callback</code></q>は必ず指定する必要があります。コールバック関数のリファレンスを指定します。</p>
<p>上記例では、パッケージ<q><code>sb::Content::Memo</code></q>内にある<q><code>_topmemo</code></q>というサブルーチンのリファレンスを指定しています。</p>
<p><q>type</q>によって適用されるコールバック関数の引数が変わります。</p>
<p><q><code>field</code></q>では指定した<q><code>type</code></q>内におけるコンテンツ用プラグインの適用フィールドを指定します。<q><code>field</code></q>が未指定の場合、<q>name</q>の値が利用されます。</p>
<p><q><code>field</code></q>は<q><code>type</code></q>が「main」の時と、「main」以外の時(entry, comment, trackback, profile)で意味合いが異なります。</p>
<p><q><code>type</code></q>が「main」の時は、処理する独自ブロック名を示します。</p>
<p>上記の例では<q><code>topmemo</code></q>という独自ブロックを追加するため、<q><code>field</code></q>に「topmemo」と指定されています。</p>
<p>標準で処理されている独自ブロックの処理を置き換える場合には、置き換える独自ブロック名を指定します。</p>
<p><q><code>type =&gt; main</code></q>で処理される標準独自ブロックは以下の通りです。</p>
<ul>
<li> title</li>
<li> archives</li>
<li> category</li>
<li> link</li>
<li> recent_comment</li>
<li> recent_trackback</li>
<li> latest_entry</li>
<li> selected_entry</li>
<li> profile</li>
<li> calendar</li>
<li> amazon</li>
<li> page</li>
<li> option</li>
</ul>
<p><q><code>type</code></q>が「main」以外の時(entry, comment, trackback, profile)では、特定の独自ブロックだけを処理します。</p>
<dl>
<dt>entry</dt>
<dd>entryブロックを処理します。以下のfieldが標準で定義されています。</dd>
</dl>
<ul>
<li> date_time</li>
<li> authors</li>
<li> attach</li>
<li> category</li>
<li> body_text</li>
<li> discovery</li>
<li> sequel</li>
<li> others</li>
</ul>
<dl>
<dt>comment</dt>
<dd>comment_area並びにcommentブロックを処理します。_contentという<q><code>field</code></q>が定義されています。</dd>
<dt>trackback</dt>
<dd>trackback_area並びにtrackbackブロックを処理します。_contentという<q><code>field</code></q>が定義されています。</dd>
<dt>profile</dt>
<dd>profile_areaブロックを処理します。_contentという<q><code>field</code></q>が定義されています。</dd>
</dl>
<p>また、<q><code>type</code></q>によらず、「_main」という特殊な<q><code>field</code></q>が標準で定義されています。</p>
<p>コンテンツ用プラグインで「_main」フィールドの置き換えも可能ですが、その際には標準の処理サブルーチンを明示的に呼び出すことを強く推奨します。</p>
<p><q><code>name</code></q>はコンテンツ用プラグイン毎につけるユニークな名称を指定します。未指定(空もしくは未定義)の場合は、プラグイン名が利用されます。</p>
<p>ひとつのプラグインにつき、ひとつのコンテンツ用モジュールを登録するだけなら<q><code>name</code></q>を指定する必要はありません。ひとつのプラグインで複数のコンテンツ用モジュールを登録する場合、それぞれのモジュール毎にユニークな名称をつけます。</p>]]></content>
	</entry>
	<entry>
		<title>プラグインデータ</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid3.html" />
		<id>http://serenebach.net/_technote/log/eid3.html</id>
		<issued>2007-05-25T17:30:00+09:00</issued>
		<modified>2007-05-25T08:30:00Z</modified>
		<summary>Serene Bachではプラグイン毎に独立したデータをプラグインAPIを通して簡単に取り扱うことができます。my $data = sb::Plugin-&amp;gt;get_data;$data-&amp;gt;data($cgi-&amp;gt;value('topmemo'));$data-&amp;gt;setting($cgi-&amp;...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>Serene Bachではプラグイン毎に独立したデータをプラグインAPIを通して簡単に取り扱うことができます。</p>
<pre><em class="keyword">my</em> <em class="variable">$data</em> = sb::Plugin-&gt;get_data;
<em class="variable">$data</em>-&gt;data(<em class="variable">$cgi</em>-&gt;value(<span class="quote">'topmemo'</span>));
<em class="variable">$data</em>-&gt;setting(<em class="variable">$cgi</em>-&gt;value(<span class="quote">'topmemo_breaks'</span>));
<em class="variable">$data</em>-&gt;date(<em class="variable">$self</em>-&gt;&#123;<span class="quote">'time'</span>&#125;);
sb::Plugin-&gt;set_data(<span class="quote">'data'</span>=&gt;<em class="variable">$data</em>);</pre>
<p>プラグインデータの実体は<q><code>sb::Data::Plugin</code></q>という<q><code>sb::Data::Object</code></q>を継承したSerene Bachのデータオブジェクトです。</p>
<p><q><code>sb::Data::Plugin</code></q>には以下のようなフィールドがあります。</p>
<ul>
<li> data</li>
<li> text</li>
<li> setting</li>
<li> date</li>
<li> url</li>
<li> mail</li>
<li> extra</li>
</ul>
<p>他に<q><code>id</code></q>, <q><code>wid</code></q>, <q><code>name</code></q>というフィールドがありますが、これらはシステムで利用されるフィールドで通常プラグイン側で利用することはありません。</p>
<p><q><code>data</code></q>, <q><code>text</code></q>などのように便宜的に汎用的な名称が付けられていますが、各フィールドの中身自体は<q><code>url</code></q>と<q><code>mail</code></q>を除き、特別な処理は行われていませんので、プラグイン側で自由に定義してご利用いただけます。</p>
<p class="note"># <q><code>url</code></q>と<q><code>mail</code></q>は出力時に簡単なアドレスチェックを行います。無効なurl・無効なメールアドレスが指定された場合には空出力されます。ですから、<q><code>url</code></q>と<q><code>mail</code></q>のフィールドはアドレスチェッカとして利用することができます。</p><!-- class="note"-->
<p><q><code>sb::Plugin-&gt;get_data</code></q>によってデータオブジェクトを取得できます。上記例では<q><code>$data</code></q>という変数にデータオブジェクトを格納(代入)しています。</p>
<p>取得したデータオブジェクトに対してフィールド名のアクセサ(入出力関数)が利用できます。Serene Bachのデータオブジェクトには入出力(set/get)を兼用したアクセサを利用します。</p>
<pre><em class="keyword">my</em> <em class="variable">$data</em> = sb::Plugin-&gt;get_data;
<em class="keyword">print</em> <em class="variable">$data</em>-&gt;data; <span class="comment"># 出力(get) : data フィールドの内容を取得</span>
<em class="variable">$data</em>-&gt;data(<span class="quote">'new_data'</span>); <span class="comment"># 入力(set) : data フィールドに <span class="quote">'new_data'</span> をセット</span></pre>
<p>フィールドの内容を取得する時には基本的に引数は必要ありません(他のデータオブジェクトには出力時に引数を必要とするアクセサもあります)。</p>
<p>フィールドの内容を更新する際には更新したい内容を引数として同一名称のアクセサを呼び出します。</p>
<p>Serene Bachのデータオブジェクトはデータを更新してもそのままではファイル(データベース)には反映されません。</p>
<p>更新したデータオブジェクトの内容をファイル(データベース)に反映させるには2つ方法があります。</p>
<ol>
<li> プラグインAPIを利用する</li>
<li> sb::Dataによってハンドリングする</li>
</ol>
<p>上記例ではプラグインAPIを利用しています。<q><code>get_data</code></q>と対になる<q><code>set_data</code></q>というメソッドを呼び出します。</p>
<pre>sb::Plugin-&gt;set_data(<span class="quote">'data'</span>=&gt;<em class="variable">$data</em>);</pre>
<p><q><code>get_data</code></q>と異なり、<q><code>'data'=&gt;データオブジェクト</code></q>という形の引数が必要になることに注意してください。</p>
<p>後者は<q><code>sb::Data</code></q>モジュールに用意されている<q><code>update</code></q>メソッドを利用する方法です。</p>
<pre>sb::Data-&gt;update(<em class="variable">$data</em>);</pre>
<p>この方法で更新されたデータオブジェクト<q><code>$data</code></q>をファイル(データベース)に反映させることができます。</p>
<p>ただし、通常プラグインデータを取り扱う際にはプラグインAPIを通した<q><code>sb::Plugin-&gt;set_data</code></q>でデータ更新処理を行うことを強く推奨します。</p>]]></content>
	</entry>
	<entry>
		<title>プラグインリソース</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid2.html" />
		<id>http://serenebach.net/_technote/log/eid2.html</id>
		<issued>2007-05-24T19:00:00+09:00</issued>
		<modified>2007-05-24T10:00:00Z</modified>
		<summary>Serene Bachではプラグイン毎に独立してリソースファイルを持つことができます。リソースファイルは必須ではありませんが、言語毎にそのプラグイン情報を記述できます。また、言語リソース(エラーメッセージなど)...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>Serene Bachではプラグイン毎に独立してリソースファイルを持つことができます。</p>
<p>リソースファイルは必須ではありませんが、言語毎にそのプラグイン情報を記述できます。</p>
<p>また、言語リソース(エラーメッセージなど)の追加・書き換えなどの動作も可能です。</p>
<p>リソースファイルは以下のように記述されます。</p>
<pre>type[tab]管理用
name[tab]データ移行
text[tab]外部データ読み込みとデータ書出し
author[tab]takkyun
detail[tab]http://serennz.cool.ne.jp/sblog/
<span class="comment"># resources</span>
resource[tab]parts_import[tab]件のエントリーを取り込みました。
resource[tab]error_import_cond[tab]パスワードが設定されていません。
resource[tab]error_no_data[tab]読み込むデータがありません。</pre>
<p class="note"># [tab]はタブコードを示しています。グローバル環境設定の記述とは異なり、いわゆる半角スペースでは正しく認識されませんのでご注意ください。</p><!-- class="note"-->
<p><q><code>name</code></q>, <q><code>text</code></q>, <q><code>author</code></q>, <q><code>detail</code></q>はプラグイン情報として利用されます。admin moduleでは<q>name</q>が追加機能のメニュー名としても利用されます。</p>
<p>行頭に<q><code>#</code></q>がある行はコメント行として無視されます。</p>
<p><q><code>resource</code></q>は言語リソースとして追加する文字列を規定します。</p>
<pre>resource[tab]label[tab]内容</pre>
<p>のように記述され、<q><code>sb::Language-&gt;get-&gt;string('label')</code></q>で設定した文字列を呼び出すことができます。</p>
<p>リソースファイルの文字コードはプラグイン内に記述します。</p>
<p>文字コードは<code>EUC-JP</code>, <code>Shift_JIS</code>, <code>iso-2022-jp</code>, <code>UTF-8</code>が利用可能です。プラグインとリソースファイルの文字コードは同一に設定するようにしてください。</p>
<p>プラグインでは利用者がどの文字コードを利用しているかは基本的に意識する必要はありません。</p>
<p>ただし、外部ファイルの読込みやアクセスログの表示などソースとなるデータの文字コードが状況によって変化するような場合はこの限りではありません。</p>
<p>Serene Bachのプラグインではリソースファイルだけでなく、管理画面のテンプレートなどもリソースとしてプラグインディレクトリ内のリソースディレクトリに置くことができます。これらのファイルはSerene Bachで用意されているプラグインAPIを利用することで読み込むことができます。</p>
<p>リソースファイルはプラグインディレクトリ内にあるリソースディレクトリ内に置かれます。</p>
<p>日本語のリソースは<q><code>plugin/resource/ja/</code></q>に置かれ、言語に依存しないリソースは<q><code>plugin/resource/</code></q>に置かれることを想定しています。</p>
<pre>plugin/
  Memo.pm
  resource/
    ja/
      memo.txt
      memo.html</pre>]]></content>
	</entry>
	<entry>
		<title>プラグインの登録</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid1.html" />
		<id>http://serenebach.net/_technote/log/eid1.html</id>
		<issued>2007-05-23T16:30:00+09:00</issued>
		<modified>2007-05-23T07:30:00Z</modified>
		<summary>Serene Bachではプラグインは専用のAPIをコールすることで、プラグインとして登録されます。典型的なプラグインの登録ルーチンを以下に示します。use sb::Plugin ();sb::Plugin-&amp;gt;register_plugin(  'lang' =&amp;g...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>Serene Bachではプラグインは専用のAPIをコールすることで、プラグインとして登録されます。</p>
<p>典型的なプラグインの登録ルーチンを以下に示します。</p>
<pre><em class="keyword">use</em> sb::Plugin ();
sb::Plugin-&gt;register_plugin(
  <span class="quote">'lang'</span> =&gt; &#123;
    <span class="quote">'ja'</span> =&gt; <span class="quote">'euc'</span>,
    <span class="quote">'en'</span> =&gt; <span class="quote">'ascii'</span>,
  &#125;,
  <span class="quote">'text'</span> =&gt; &#123;
    <span class="quote">'type'</span>    =&gt; <span class="quote">'admin, cms'</span>,
    <span class="quote">'name'</span>    =&gt; <span class="quote">'Short Message'</span>,
    <span class="quote">'text'</span>    =&gt; <span class="quote">'Writing short message on the top page.'</span>,
    <span class="quote">'author'</span>  =&gt; <span class="quote">'takkyun'</span>,
    <span class="quote">'detail'</span>  =&gt; <span class="quote">'http://serennz.cool.ne.jp/sblog/'</span>,
    <span class="quote">'version'</span> =&gt; <span class="quote">'0.00'</span>,
  &#125;,
  <span class="quote">'file'</span> =&gt; <span class="quote">'memo.txt'</span>,
  <span class="quote">'data'</span> =&gt; 1,
);</pre>
<p>Serene BachのプラグインAPIを利用する際には、最初に<q><code>sb::Plugin</code></q>をロードする必要があります。上記例では、最初の行<q><code>use sb::Plugin ();</code></q>が該当します。</p>
<p>ここでは「use」を使っていますが、<q><code>require sb::Plugin;</code></q>としても構いません。</p>
<p>次の行、<q><code>sb::Plugin-&gt;register_plugin</code></q>がプラグインの登録になります。<q><code>sb::Plugin</code></q>の<q><code>register_plugin</code></q>メソッドにより、プラグインを登録します。</p>
<p>プラグインを登録すると、環境設定→プラグイン画面にて該当プラグインが表示されるようになります。</p>
<p><q><code>register_plugin</code></q>メソッドには引数を連想配列(ハッシュ)の形で記述します。</p>
<p class="note"># Serena BachではプラグインAPIに限らず、連想配列によるパラメータ引渡しが多用されていますので、この形式に慣れておくとプラグインの作成が容易になります。</p><!-- class="note"-->
<pre>sb::Plugin-&gt;register_plugin(
  <span class="quote">'lang'</span> =&gt; &#123; <span class="comment"># 言語設定(文字コード)</span>
    <span class="quote">'ja'</span> =&gt; <span class="quote">''</span>, <span class="comment"># 日本語</span>
    <span class="quote">'en'</span> =&gt; <span class="quote">''</span>, <span class="comment"># 英語</span>
  &#125;,
  <span class="quote">'text'</span> =&gt; &#123; <span class="comment"># テキスト情報</span>
    <span class="quote">'type'</span>    =&gt; <span class="quote">''</span>, <span class="comment"># プラグインのタイプ</span>
    <span class="quote">'name'</span>    =&gt; <span class="quote">''</span>, <span class="comment"># プラグインの名称</span>
    <span class="quote">'text'</span>    =&gt; <span class="quote">''</span>, <span class="comment"># プラグインの簡単な説明</span>
    <span class="quote">'author'</span>  =&gt; <span class="quote">''</span>, <span class="comment"># プラグインの作成者</span>
    <span class="quote">'detail'</span>  =&gt; <span class="quote">''</span>, <span class="comment"># プラグイン配布先・詳細説明ページのアドレス</span>
    <span class="quote">'version'</span> =&gt; <span class="quote">''</span>, <span class="comment"># プラグインのバージョン</span>
  &#125;,
  <span class="quote">'file'</span> =&gt; <span class="quote">''</span>, <span class="comment"># リソースファイル名</span>
  <span class="quote">'data'</span> =&gt; <em class="keyword">undef</em>, <span class="comment"># プラグインデータを利用するかどうか</span>
);</pre>
<p><q><code>register_plugin</code></q>の引数には<q><code>lang</code></q>, <q><code>text</code></q>, <q><code>file</code></q>, <q><code>data</code></q>という4つの大項目があります。</p>
<p>これらの値は必須ではありませんので、以下のように省略しても構いません。</p>
<pre>sb::Plugin-&gt;register_plugin();</pre>
<p>言語設定<q><code>lang</code></q>では、プラグイン並びにリソースファイルの文字コードを指定します。そのプラグインで利用する文字コードは統一しておく必要があり、またここで文字コードを明示しておく必要があります。</p>
<p>テキスト情報<q><code>text</code></q>ではプラグイン名称などを記述します。この中の<q><code>name</code></q>はadmin moduleではメニューの名称にも利用されます。</p>
<p>テキスト情報<q><code>text</code></q>の内容は<a href="http://serenebach.net/_technote/log/eid2.html">後述するリソースファイル</a>にも記述できます。リソースファイルを利用した場合、リソースファイルの内容が優先して利用されます。</p>
<p>リソースファイル名<q><code>file</code></q>ではリソースファイルの名称を指定します。この項目が存在しないあるいは空の場合はリソースファイルは利用されません。</p>
<p>プラグインデータ<q><code>data</code></q>ではプラグインAPIを介したプラグインデータを利用するかどうかを設定します。</p>
<p>プラグインデータを利用する場合には<q><code>'data' =&gt; 1</code></q>,のように<q><code>data</code></q>に対して「1」を設定します。</p>]]></content>
	</entry>
	<entry>
		<title>プラグインの種類</title>
		<link rel="alternate" type="text/html" href="http://serenebach.net/_technote/log/eid0.html" />
		<id>http://serenebach.net/_technote/log/eid0.html</id>
		<issued>2007-05-22T21:00:00+09:00</issued>
		<modified>2007-05-22T12:00:00Z</modified>
		<summary>Serene Bachには機能拡張の仕組みとして「プラグイン」という機構が用意されています。プラグインは基本的にperlのスクリプトとして提供され、特定ディレクトリにインストールすることでSerene Bachに認識すること...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>プラグイン</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>Serene Bachには機能拡張の仕組みとして「プラグイン」という機構が用意されています。</p>
<p>プラグインは基本的にperlのスクリプトとして提供され、特定ディレクトリにインストールすることでSerene Bachに認識することができます。</p>
<p class="note"># デフォルトではベースディレクトリ上の「plugin」がプラグインディレクトリです。</p><!-- class="note"-->
<p>プラグインには以下のような種類があります。</p>
<table>
<tr><th>項目</th><th>説明</th></tr>
<tr><td>コンテンツ用プラグイン</td><td>新しい独自ブロック・独自タグを定義したり、既存の独自ブロック・独自タグの動作を変更するプラグインです。</td></tr>
<tr><td>管理用プラグイン</td><td>「追加機能」として新たに管理画面を追加するためのプラグインです。</td></tr>
<tr><td>テキストフィルタ</td><td>記事の本文・続きのフォーマットを規定するプラグインです。</td></tr>
<tr><td>追加モジュール</td><td>特定のタイミングで読み出され、標準動作を置き換えるためのプラグインです。</td></tr>
</table>
<p>追加モジュールの種類として、以下のようなものがあります。</p>
<table>
<tr><th>項目</th><th>説明</th></tr>
<tr><td>カウンタ用</td><td>アクセスログ収集ならびにカウンタ表示を行うスクリプトが起動したときに呼び出されます。</td></tr>
<tr><td>レシーバ用</td><td>コメントないしトラックバックを受信した際に呼び出されます。</td></tr>
</table>
<p>いずれのプラグインもSerene Bach上で正しく動作させるためには、sb::Pluginモジュールを通した登録処理を行う必要があります。</p>]]></content>
	</entry>
</feed>
