★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ Multi Skin module (for BBS Note Ver.7.x) Created by SIN (sin@vc-net.ne.jp) ※Thanks WonderCatStudio NoraNeko※ ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ■概要  お絵描き掲示板「BBS Note」Ver.7以降でスキンを任意に切替可能に  するためのモジュールです。  (BBS Note v7.1以降ではマルチスキンモジュールv1.10以上、v7.30以降   ではマルチスキンモジュールv1.31以上が必要です)  効能として  1.複数のサイトで掲示板を共有する際に、サイトごとに異なる   スキンを利用することができる。  2.ユーザが自分の好みで表示方法を選択することができる。   (ユーザによる切替表示の有無は任意に設定できます)  3.自分用と他の人用とで異なる表示をさせることができる。  4.たまに違うスキンをお試しで使うこともできる。  などが考えられるような気がします(^^; ■設置方法  基本的には、BBS Noteで使うスキン用CGI(skin.cgi)をこのmulti.cgiに  差し替えるだけです。($skin_cgi に 'multi.cgi' を設定する)  1.普通にBBS Noteを設置して動作確認しておく。   なお、この状態で表示されるスキンがデフォルト(パラメータで何も指定   しないとき)のスキンになります。  2.config.cgiの   $skin_cgi = 'skin.cgi';   を   $skin_cgi = 'multi.cgi';   に変更する。  3.任意のディレクトリを作って追加のスキンをアップロードする。   例えばAirスキンを cgi-bin/bbsnote/air の下に、とか。  4.multi.cgiの設定に追加したスキンのディレクトリを記述する。   形式は   [ '名前', '識別子', 'スキンディレクトリ', '画像ディレクトリ' ],   です。(※: 巻末に設定参考例を記載)   ・名前 : スキンの呼び名。選択リストで表示される名称になる。   ・識別子 : スキン呼び出し用の識別子。    URLで、bbsnote.cgi?skin=識別子 形式で使われます。    URLで使える文字(半角英数字と一部の記号のみ)であれば、    後はスキン間で重複していなければどんな名前でもOK。   ・スキンディレクトリ: 追加スキンのskin.cgiやmain.htmlのあるディレクトリ。   ・画像ディレクトリ : 追加スキンのGIF画像ディレクトリ。URLも可。    (config.cgiの$img_dir指定と同様のもの)    省略すると "スキンディレクトリ/images" となります。   ※設定はmulti.cgiに直接記述する以外に、外部config機能を利用することも    できます。巻末のAppendix参照のこと。  5.変更したconfig.cgiとmulti.cgiをアップロードすればOK。   multi.cgiのパーミッションはconfig.cgiやskin.cgiと同様。(666など)  6.スキンの切り替えは bbsnote.cgi?skin=スキン識別子 で呼び出すことで行うので、   掲示板呼び出しのリンクをそのように修正する。   あるいはユーザに選ばせる(切り替えフォーム利用時)のであれば特に修正は不要。 ■機能紹介  ☆スキン切替フォーム   掲示板のメニューに「スキン切替」のセレクトを追加します。   これにより、ユーザが好きに様々なスキンを選択することができます。  ☆スキン一覧作成   設定された全スキンへのリンクを一覧表示します。   自分で スキン名 とか書くのが   面倒くさい or HTMLの知識が無くて書けない(>_<)とかいう人向け?   一応、管理者モードでメニューから呼び出せるようになってますが、   bbsnote.cgi?fc=skinlist と直接URLで書いても使えます。   機能そのものには管理者パスワードのチェックとかは入れてないです。  ☆未定義スキン検索   multi.cgi内の設定に記述されてない識別子が skin=XXXX で指定された場合に、   それをスキンが置かれたディレクトリと解釈して検索し、skin.cgiがそこに   あれば自動でこれを利用してくれる機能です。   効能としては   1.一時的にダウンロードしてみた新スキンを試してみたいとき。    他のユーザに影響を与えることなく、こっそりとスキンが試せます。   2.いちいちmulti.cgiを書き換えずに複数のスキンを使うことができる。   とか?   現在の仕様ではスキンの画像ディレクトリが XXXX/images にあることを想定   しているので、Niftyなどで画像ファイルを別の場所に設置する必要のある   サーバでは正常に動作しません。 ■既知の問題  ・「現在の選択スキン」はCookieによって記録しています。よってCookieが   有効になっていないと、投稿とかするたびにデフォルトに戻ってしまいます。   そりゃもう、仕様ってことで…。いや、なんとかしたいんですが。   (2001/10/17)   今のままの方が案外都合がいいかも…?ってことでこの件の修正予定は破棄します。   いちいち指定しなくても、1度指定すれば各自で好きなスキンが使えるのは便利?   (2001/11/06)  ・同一のBBS Noteで複数のスキンを使ってしまうため、index.htmlでアクセス   させてると最後に使った人のスキンの内容になってしまうと思います。   直接bbsnote.cgiでアクセスさせてください。…仕様だよねぇ、これも。   (2001/10/17)  ・ブックマークなどで直接(スキン指定せずに)アクセスしている人の場合、   一定期間はCookieで指定スキンが表示されてますが、有効期限が切れると   デフォルト(通常はBASIC)で表示されるようになってしまいます。   (2001/10/17)  ・同様にスキン指定の無いブックマークでアクセスすると「最後に使ったスキン」   が適用され、本来のスキン指定したリンクからアクセスすると「管理者が指定   した初期スキン」が適用され直す、という挙動になります。   多分、こんなの疑問に思う人もいないと思うけど、まーそういうことで。   (2001/10/17)  ・改造/自作スキン、または将来登場するスキンの中には、skin.cgiやmain.html   などから外部のファイル(例えば.js(JavaScript)ファイルや.swf(フラッシュ)   ファイルなど)を読み込むものがあるかもしれませんが、マルチスキンは仕様   としてスキン一式がbbsnote.cgiと別の場所に配置されているという、通常   の状態と異なる構成になるため、このようなものは誤動作する可能性が高いです。   (動作時のカレントディレクトリがスキンと別のディレクトリになります)   v1.10以降ではスキン一式のあるディレクトリを$SKINDIR、画像ディレクトリを   $SKINIMGにそれぞれセットするようにしたので、マルチスキンへの対応を   配慮するときはこれらの変数を参照するようにしてみてください。   (注:ディレクトリの記述方法はBBS Note本体に準ずるため末尾に'/'は付きません)   (2001/11/10)   ちなみに、1番手っ取り早い対応法は、この手のリンクするファイルを全部GIF画像   と同じディレクトリ(images)に入れて、画像と同様のリンクで記述することです。   テンプレート型スキンではHTMLファイル中で   (imagesディレクトリを'./images'と./付きで指定するのがポイント)、非テンプ   レート型(高速版)ではプログラム中で''   のように記述することで、自動的にディレクトリが切り替わります。   なお、v1.20まではサブルーチン外(skin.cgiの先頭部)に書く「設定部分」でこの   $img_dirが正常に切り替わっていないというバグがありました。v1.21にて修正。   (2001/12/05)  ・Diary系スキンの特殊な投稿機能(その日の日記を書く、すでに同日の日記が   あれば編集を行う)は動作しません。それどころかADMINモードにしても日記の   ボタン自体が表示されません。これはスキン組み込みのタイミングの問題で、   相性みたいなものです。対策は悩めば(^^;可能かもしれませんが、実際問題   として通常モード(他のスキン)でも書き込めることを考えると、書き込み内容の   つじつまが合わなくなる可能性があるため、現状では対応予定なしとします。   なお、これによりDiaryスキンでは新規投稿が全くできないので、投稿時だけは   一時的に他のスキンに切り替えてから投稿操作を行うようにしてください。   (2001/11/12)   この問題はv1.12にて対処されました。   その代わり、skinパラメータはGET専用となり、POSTメソッドFORMでのスキン   切替はできなくなりました。   また、これによって一部の環境で発生してた投稿時の不具合も改善された模様です。   (2001/11/28) □□Appendix ■外部config機能  multi.cgiの設定として、multi.cgiを直接書き換える他に"multicfg.cgi"という  設定ファイル(config.cgiと同様のもの)を用意することもできます。  ・multi.cgiのアップデートをそのまま上書きで済ますことができる。  ・変数設定のみの単純なPerlファイルなのでCGIなどからオンライン設定も可能かも?  などの効能が考えられます。  ただし、処理速度としてはmulti.cgiで直接設定した方が速いです。  multicfg.cgiはbbsnote.cgiと同じディレクトリに置いてください。  中身はmulti.cgiの設定部分をそのままコピーすればOKです。  (最後の1行に 1; の1行を入れておくことをお忘れなく)  両方に同じ項目の設定を書いた場合、multicfg.cgiの設定が優先されるので、  「設定を変えたのに反映されない〜!」といったトラブルにはご注意ください。 ■外部I/F仕様  他のモジュールやスキンと連携処理を行なうための外部I/Fがあります。  ■■外部変数   $SKIN : 現在のスキン識別子   $SKINDIR : 現在のスキンディレクトリ   $SKINIMG : 現在のスキン画像ディレクトリ    これらの変数を利用すればスキンをマルチスキン対応にできます。   $SETSKIN : 切替スキンを指定する変数。ユーザ指定より優先される。    あらかじめスキン識別子をセットすることでスキンを強制できる。    この変数はmulti.cgiからは参照するのみで設定はしません。  ■■&call呼び出しタイミング   MULTISKIN : スキン切替時   MULTISKIN_SET : スキン切替ID取得時   LOADSKIN : スキン読み込み時   SEARCHSKIN : スキン検索時   SKINMENU : スキン切替フォーム呼び出し時   SKINMENU_ITEM : スキン切替フォーム各データ取得時   SKINMENU_OUT : スキン切替フォーム出力時   SKINLINK_ITEM : スキン一覧各データ取得時   ADMINSKIN : 管理者モードのスキン一覧ボタン設定時 ■設定参考例  1)本体ディレクトリの下に追加スキン用ディレクトリを作成するパターン。   標準的な設定のサーバではこの形が多いかと。   ─[cgi-bin]─[bbsnote]    ├bbsnote.cgi    ├config.cgi    ├skin.cgi    ├multi.cgi    ├*.html    ├*.log    ├[images]    │ └*.gif    ├[data]    │ └ログデータ    ├[Air]    │ ├skin.cgi    │ ├*.html    │ └[images]    │ └*.gif    └[Angel]    ├skin.cgi    ├*.html    └[images]    └*.gif # *** 設定 *** @SKIN_LIST = ( [ 'default skin', '', '', '' ], [ 'Air skin', 'AIR', './Air', '' ], [ 'Angel skin', 'AGL', './Angel', '' ], );   注:第4項目は「'./Air/images'」のように指定しても構いませんが省略可能です。  2)本体ディレクトリと異なる階層に画像用ディレクトリを作るパターン。   cgi-binディレクトリに画像ファイルを置けないサーバ用。   [public_html]    ├[cgi-bin]    │ └[bbsnote]    | ├bbsnote.cgi    | ├config.cgi    | ├skin.cgi    │ ├multi.cgi    │ ├*.html    │ ├*.log    │ ├[Air]    | │ ├skin.cgi    | │ └*.html    │ └[Angel]    │ ├skin.cgi    │ └*.html    ├[data]    │ └ログデータ    └[images]    ├*.gif    ├[Air]    │ └*.gif    └[Angel]    └*.gif # 設定 @SKIN_LIST = ( [ 'default skin', '', '', '' ], [ 'Air skin', 'AIR', './Air', '../../images/Air' ], [ 'Angel skin', 'AGL', './Angel', '../../images/Angel' ], );   注:「../」1つでディレクトリ階層が1つ上に上がります。  3)画像ファイルの表示が別サーバ扱いになってしまうパターン。(@niftyなど)   ディレクトリ構成は(2)とほぼ同様だが画像をURLで呼ぶ必要がある場合。   CGIを呼ぶのにURL中に「cgi-bin/」を記述する必要が無いサーバでも   この形式の方が楽かもしれません。(相対ディレクトリが難解なため)   [public_html]    ├[cgi-bin]    │ └[bbsnote]    | ├bbsnote.cgi    | ├config.cgi    | ├skin.cgi    │ ├multi.cgi    │ ├*.html    │ ├*.log    │ ├[Air]    | │ ├skin.cgi    | │ └*.html    │ └[Angel]    │ ├skin.cgi    │ └*.html    └[homepage]    ├[data]    │ └ログデータ    └[images]    ├*.gif    ├[Air]    │ └*.gif    └[Angel]    └*.gif # 設定 @SKIN_LIST = ( [ 'default skin', '', '', '' ], [ 'Air skin', 'AIR', './Air', 'http://(domain)/***/images/Air' ], [ 'Angel skin', 'AGL', './Angel', 'http://(domain)/***/images/Angel' ], );