フリーCGIスクリプト配布サイト。
初期設定の拡張設定機能を利用すれば、初期設定の内容(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に変更する」という形式になっています。
上の場合、「クエリー(ブラウザから送信される情報)の mode
が admin
のとき、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.html
と admin_footer.html
を読み込む」となります。
この場合、「クエリー(ブラウザから送信される情報)の mode
が admin
のとき、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
がカラで、field
が 2
のときは skin_diary
の設定内容を diary_memo.html
に変更、field
が 6
のときは 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}{データ文字}
で可能です。データ文字に指定できるのは date
、no
、id
、stat
、field
、name
で、それぞれ「記事投稿日時」「記事番号」「記事ID」「記事の状態」「記事分類」「記事投稿者」の意味になります。
ちなみに、正規表現で一括指定する場合、
#拡張設定
%{$init->{rewrite}} = (
'{data}{field}={音楽(::.+)?}' => '{skin_diary}={diary_music.html}',
'' => '',
'' => '',
'' => '',
'' => ''
);
このように書くことができます。条件の部分に (::.+)?
という部分がありますが、これが正規表現を使用した指定です。これで 「::」と「1つ以上の文字」があるかもしれないし、何も無いかもしれない
という意味になります。つまり、「音楽」や「音楽::MIDI」や「音楽::MP3」などにマッチします。
まとめを兼ねて、よく利用すると思われる拡張設定例をいくつか紹介します。
'{query}{mode}={admin}' => '{skin_header}={admin_header.html}',
'{query}{mode}={}&{query}{field}={雑記}' => '{skin_diary}={diary_memo.html}',
'{query}{mode}={}&{query}{field}={雑記<>日常}' => '{skin_diary}={diary_memo.html}',
'{query}{mode}={}&{query}{field}={雑記(<>.+)?}' => '{skin_diary}={diary_memo.html}',
'{data}{field}={雑記}' => '{skin_diary}={diary_memo.html}',
'{data}{field}={雑記::日常}' => '{skin_diary}={diary_memo.html}',
'{data}{field}={雑記(::.+)?}' => '{skin_diary}={diary_memo.html}',