初期設定の拡張設定機能

初期設定の拡張設定機能

初期設定の拡張設定機能を利用すれば、初期設定の内容(lib/webliberty/App/Init.pm の80行目~あたりにある項目)を動的に変更する事ができます。(Professional版のみ。)
これで何ができるかというと、管理者ページのみ別デザインにしたり、特定の分類一覧ページを別デザインにしたり…と、柔軟な設定を行う事ができます。

少し設定方法が難しいですが、普通に使う分にはこの機能を利用する必要はないでしょう。

機能をONにするには lib/webliberty/App/Init.pm の90行目あたりにある

rewrite_mode => 0,

この部分を

rewrite_mode => 1,

に変更します。これで拡張設定が有効になります。あとは220行目あたりにある以下の部分に、拡張設定項目を設定します。

#拡張設定
%{$init->{rewrite}} = (
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
);

初期状態では設定できる数は5つになっていますが、'' => '', のセットを増やせば、いくつでも設定可能です。

以下で具体例を挙げつつ、拡張設定機能の記述方法を紹介します。

動作モードによってスキンを変更する

拡張設定部分を

#拡張設定
%{$init->{rewrite}} = (
  '{query}{mode}={admin}' => '{skin_header}={admin_header.html}',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
);

このように記述すると、「管理者ページでは、ヘッダ部分のスキンは admin_header.html を読み込む」となります。admin_header.html には header.html と同じ内容を記述しておき、CSSファイルへのパスのみ変更しておけば、管理者ページとそれ以外のページで、デザインを大きく変化させる事ができます。

拡張設定はすべて「'A=B' => 'C=D',」という形式で設定し、「条件Aの内容がBのとき、初期設定Cの内容をDに変更する」という形式になっています。

上の場合、「クエリー(ブラウザから送信される情報)の modeadmin のとき、skin_header の設定内容を admin_header.html に変更する」という意味になります。

クエリーの指定は {query}{クエリー文字} で可能です。

管理モードが呼ばれるとき、必ず mode=admin という情報が送信されるので、これを利用して条件を設定しています。

変更内容を複数指定する

#拡張設定
%{$init->{rewrite}} = (
  '{query}{mode}={admin}' => '{skin_header}={admin_header.html}&{skin_footer}={admin_footer.html}',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
);

このように記述すると、「管理者ページでは、ヘッダ部分とフッタ部分のスキンは admin_header.htmladmin_footer.html を読み込む」となります。

この場合、「クエリー(ブラウザから送信される情報)の modeadmin のとき、skin_header の設定内容を admin_header.html に変更し、skin_footer の設定内容を admin_footer.html に変更する。」という意味になります。

項目は & で繋げて、いくつでも設定する事ができます。

条件を複数指定する

#拡張設定
%{$init->{rewrite}} = (
  '{query}{mode}={}&{query}{field}={2}' => '{skin_diary}={diary_memo.html}',
  '{query}{mode}={}&{query}{field}={6}' => '{skin_diary}={diary_music.html}',
  '' => '',
  '' => '',
  '' => ''
);

このように記述すると、特定の分類一覧ページでのみ、記事表示部分のスキンを変更する事ができます。{query}{mode}={} は、管理者ページなどでこの設定が反映されないようにするためのものです。

この場合、「クエリー(ブラウザから送信される情報)の mode がカラで、field2 のときは skin_diary の設定内容を diary_memo.html に変更、field6 のときは skin_diary の設定内容を diary_music.html に変更する。」という意味になります。

条件も & で繋げて、いくつでも設定する事ができます。

また、分類コードから一覧を表示するようにスキンを編集している場合、

#拡張設定
%{$init->{rewrite}} = (
  '{query}{mode}={}&{query}{field}={雑記<>日常}' => '{skin_diary}={diary_memo.html}',
  '{query}{mode}={}&{query}{field}={音楽}'       => '{skin_diary}={diary_music.html}',
  '' => '',
  '' => '',
  '' => ''
);

このように記述します。階層化された分類を指定する場合、親分類と子分類は <> で連結して指定します。分類を追加する可能性がある場合、こちらで指定した方が後々の修正が容易です。

条件に正規表現を利用する

拡張設定はすべて「'A=B' => 'C=D',」という形式で設定しますが、「B」の部分にはPerlの正規表現を使用することができます。例えば

#拡張設定
%{$init->{rewrite}} = (
  '{query}{mode}={}&{query}{field}={雑記(<>.+)?}' => '{skin_diary}={diary_memo.html}',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
);

このように記述すると、親分類「雑記」とその子分類すべてに適用されます。条件の部分に (<>.+)? という部分がありますが、これが正規表現を使用した指定です。これで 「<>」と「1つ以上の文字」があるかもしれないし、何も無いかもしれない という意味になります。つまり、「雑記」や「雑記<>日常」や「雑記<>仕事」などにマッチします。

うまく利用すれば拡張設定をすっきりと書くことができますが、正規表現は結構難しいです。なので無理に使用する必要はありません。

個別ページでの表示を変更する

#拡張設定
%{$init->{rewrite}} = (
  '{data}{field}={音楽}'       => '{skin_diary}={diary_music.html}',
  '{data}{field}={音楽::MIDI}' => '{skin_diary}={diary_music.html}',
  '' => '',
  '' => '',
  '' => ''
);

このように記述すると、記事の個別表示ページ(固定URLページ・コメント一覧ページ・トラックバック一覧ページ)でのスキンを変更する事ができます。上の例では、分類が「音楽」か「音楽::MIDI」の場合に、スキンを diary_music.html に変更しています。

この場合、「データ(ログファイルに記録された記事情報)の filed音楽 のときと filed音楽::MIDI のとき、skin_diary の設定内容を diary_music.html に変更する。」という意味になります。

階層化された分類を指定する場合、親分類と子分類は :: で連結して指定します。

データの指定は {data}{データ文字} で可能です。データ文字に指定できるのは datenoidstatfieldname で、それぞれ「記事投稿日時」「記事番号」「記事ID」「記事の状態」「記事分類」「記事投稿者」の意味になります。

ちなみに、正規表現で一括指定する場合、

#拡張設定
%{$init->{rewrite}} = (
  '{data}{field}={音楽(::.+)?}' => '{skin_diary}={diary_music.html}',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
);

このように書くことができます。条件の部分に (::.+)? という部分がありますが、これが正規表現を使用した指定です。これで 「::」と「1つ以上の文字」があるかもしれないし、何も無いかもしれない という意味になります。つまり、「音楽」や「音楽::MIDI」や「音楽::MP3」などにマッチします。

サンプル集

まとめを兼ねて、よく利用すると思われる拡張設定例をいくつか紹介します。

管理者ページでは、ヘッダ部分のスキンは admin_header.html を読み込む

'{query}{mode}={admin}' => '{skin_header}={admin_header.html}',

分類「雑記」の記事一覧では、記事部分のスキンは diary_memo.html を読み込む

'{query}{mode}={}&{query}{field}={雑記}' => '{skin_diary}={diary_memo.html}',

分類「雑記::日常」の記事一覧では、記事部分のスキンは diary_memo.html を読み込む

'{query}{mode}={}&{query}{field}={雑記<>日常}' => '{skin_diary}={diary_memo.html}',

分類「雑記」とその子分類すべての記事一覧では、記事部分のスキンは diary_memo.html を読み込む

'{query}{mode}={}&{query}{field}={雑記(<>.+)?}' => '{skin_diary}={diary_memo.html}',

分類「雑記」の個別表示ページでは、記事部分のスキンは diary_memo.html を読み込む

'{data}{field}={雑記}' => '{skin_diary}={diary_memo.html}',

分類「雑記::日常」の個別表示ページでは、記事部分のスキンは diary_memo.html を読み込む

'{data}{field}={雑記::日常}' => '{skin_diary}={diary_memo.html}',

分類「雑記」とその子分類すべての個別表示ページでは、記事部分のスキンは diary_memo.html を読み込む

'{data}{field}={雑記(::.+)?}' => '{skin_diary}={diary_memo.html}',