### 目次

- プラグインの概要
- サポートとバグ報告
- インストール
- アンインストール
- 他のプラグインとの競合
- 使用上の注意
- スキン変数の実装
- オプションの解説
- グローバル設定の日付の付加による動作の違い
- それぞれのウェブログがある個別ディレクトリでのファイル管理について
- イベントの発生
- バージョン履歴
- 動作の仕組み

### プラグインの概要

このプラグインは、Nucleusのmedia.phpという、ファイルの記事への挿入やアップロードを行うプログラムを改良し、プラグインとして利用しやすくしたものです。 Orangoo projectsのGreyBox (ver.5.54) を、LGPL ver.2.1のもと、同梱しています。

機能は以下です

1. アップロード、記事への挿入、ファイル名の変更そして削除、サブディレクトリの作成・削除・名前変更を行う事ができます。
2. media.phpのNucleus Mediaウィンドウから、インターフェースを改良してあります。
3. ファイルの挿入時は、代替テキストの入力を必須としました。これはアクセシビリティの観点に拠ります。
4. プライベート・コレクション・ディレクトリ機能をオン・オフして、共有ディレクトリのみによる運用ができます。
5. オプションで指定することにより、NP_EachBlogDirで提供していた機能を利用することができます。

### サポートとバグ報告

サポートフォーラムにおいて行います。 このヘルプの最新は、NP_ImprovedMedia - Nucleus CMS WIKIで参照することができます。

### インストール

1. 圧縮フォルダを展開し、内容物をPLUGINフォルダにコピー。
2. Nucleusにログインし、「管理ホーム」から、「プラグイン管理」の画面に移動。
3. 画面下部の「新しいプラグインをインストール」で、「ImprovedMedia」を選択し、「プラグインのインストール」ボタンをクリック。
4. 「プラグインの管理」画面の「インストール済み」のリストに表示されているのを確認します。
5. リスト右の「編集」で、オプションを変更することができます。
6. 通常どおり、アイテムの編集画面で外部ファイルを呼び出すボタンをクリックすると、ファイルのアップロード画面が開きます。ファイルのアップロードが成功すると、記事への埋め込みを行う画面となります。

### アンインストール

オプションデータを持ちますが、そのままプラグイン管理で削除すれば、きれいになくなります。

### 他のプラグインとの競合

NP_ImageManager、NP_EachBlogDir、NP_Mediatocuと同時に使う事はできません。その他のプラグインは、おそらく大丈夫だと思います。

### 使用上の注意

- ユーザがログアウト状態である時は、ログイン画面を表示します。再度ログインすることで、機能を利用できます。
- Media Controlウィンドウは呼び出されたウェブログ情報を保持しているので、もしもユーザがウェブログ・チームに所属しておらず、最高管理権限も持っていない場合は、エラー画面を表示します。
- 代替テキストは40文字に制限されています。英数字でも記号でも日本語でも構いません。
- ファイル名変更時に、拡張子を変更する事はできません。
- 変更後のファイル名は30文字に制限されています。使用できる文字種は、英数字と3種類の記号（ハイフンマイナス、アンダースコア、プラス）です。
- ファイルを削除するときは、ほんとうに削除していいのか、少し考える時間を設けるとよいでしょう。
- サブ・ディレクトリの名前は20文字に制限されています。使用できる文字種は、英数字と3種類の記号（ハイフンマイナス、アンダースコア、プラス）です。
- サブ・ディレクトリを削除すると、その中に保存されているファイルも削除されます。ほんとうに削除していいのか、少し考える時間を設けるとよいでしょう。
- プライベート・コレクション・ディレクトリ、共有コレクション・ディレクトリをとわず、コレクション・ディレクトリは削除できません。

### スキン変数の実装

スキンに変数を記述することで、スキンから機能を呼び出すことができます。以下の2つの記述を、スキンに追加してください。 なお、テンプレートからの呼び出しはサポートしていません。

#### <head></head>要素内

    <%if(hasplugin,ImprovedMedia)%>
    <%ImprovedMedia(head)%>
    <%endif%>

#### <body></body>要素内

    <%if(hasplugin,ImprovedMedia)%>
    <%ImprovedMedia(anchor)%>
    <%endif%>

すると、<%ImprovedMedia(anchor)%>を追加したところにアンカー「ファイル管理」が出現します。 このアンカーをクリックすることで、機能の呼び出しをすることができます。 なお、こうして呼び出されたMedia Controlは、ファイルの一覧画面をデフォルトで表示します。またボタン「文書に挿入」を持たず、ファイルのアップロード・削除・ファイル名の変更とサブディレクトリ管理のみ利用できます。

### オプションの解説

以下の4つのオプションを持ちます。

#### プライベート・コレクションのオン・オフ。

デフォルトでは、Nucleusインストール時と同様に、プライベート・コレクション・ディレクトリ機能がオンとなっています。 オフにすることで、メンバー間の共有ディレクトリの使用を徹底することができます。
なお、メディア・ディレクトリに子ディレクトリ（このプラグインでは、コレクション・ディレクトリと呼んでいます）が作成されていない状態でこの機能をオフにすると、エラーとなります。 その場合は、FTPソフトかサーバ提供環境でディレクトリを作成してください。

#### Media Controlページに表示するファイル数

表示ファイル数を5件から50件の間で指定できます。

#### GreyBoxユーティリティの利用

GreyBoxの提供する効果によってMedia Controlを開くオプションを追加しています。 このオプションを利用しない方は、このプラグインの構成ファイルのうち、ディレクトリ「greybox」を削除するとよいでしょう。

#### それぞれのウェブログがある個別ディレクトリでのファイル管理

NP_EachBlogDirで提供していた、それぞれのウェブログがある個別ディレクトリでのファイル管理機能を利用することができます。 このオプションは、アップロードしてブログで利用するファイルが、そのブログに属している状態を作り出します。詳しくはこのヘルプのそれぞれのウェブログがある個別ディレクトリでのファイル管理についてを参照してください。

### グローバル設定の日付の付加による動作の違い

Nucleusのグローバル設定にある「アップロードするファイル名の頭に日付を付加する」オプションにより 一覧画面での日付とファイル名の表示およびファイル名変更時の動作が異なります。

「はい」のとき

- 一覧画面での日付の表示は、「登録日」となり、ファイルの先頭に追加されている日付が入ります。
- 一覧画面でのファイル名の表示は、先頭の日付を取り去ったものとなります。
- ファイル名変更時に、ファイル名の先頭に日付（数字8桁）+ハイフンがついていないファイルは、そのファイルの最終更新日を先頭に追加します。
- 一覧画面でのファイルの並びは、先頭に付加されている日付を含めたファイル名の降順です。

「いいえ」のとき

- 一覧画面での日付の表示は、「更新日」となります。
- 一覧画面でのファイル名の表示は、ファイル名そのままとなります。
- ファイル名変更時に、ファイル名の先頭に日付を付加する事はありません。
- 一覧画面でのファイルの並びは、ファイルの最終更新日の降順です。

### それぞれのウェブログがある個別ディレクトリでのファイル管理について

複数ウェブログを以下のようなディレクトリ構成で運用する事で、アップロードしたファイルがウェブログに属し、ウェブログ管理チームに所属しているユーザのみ、そのファイルを利用することができるようにします。

    Nucleus CMS
    Nucleus Admin : /(Document Root)/nucleus/

    Blog1(ShortName1, Default)
    Weblog Path: /(Document Root)/index.php
    Media  DIR : /(Document Root)/media/

    Blog2(ShortName2)
    Weblog Path: /(Document Root)/(shortname2)/index.php
    Media  DIR : /(Document Root)/(shortname2)/media/

    Blog3(ShortName3)
    Weblog Path: /(Document Root)/(shortname3)/index.php
    Media  DIR : /(Document Root)/(shortname3)/media/

    Blog4(ShortName4)
    ...

なお、メディア・ディレクトリの名前は任意ですが、どのウェブログのディレクトリでも共通の名前にしてください。PHPスクリプト・ファイルの名前は、index.phpでなくとも構いません。

具体的に言うと、管理領域(Nucleusディレクトリ)と同じ階層に、各ウェブログの短縮名のディレクトリを作成し、その中にPHPファイルとメディアディレクトリを配置。 このようにしたときに、プラグイン内の改造を加えたmedia.phpが、それぞれのウェブログにおかれたメディアディレクトリを参照します。 また、ウェブログが表示されたときに、アイテムに埋め込まれたファイルへのパスが通るようにします。

新規のウェブログの設置方法

1. 新規に作成するウェブログの短縮名を決めます。
2. Nucleusがインストールされているディレクトリと同じ階層に、その短縮名のディレクトリを作成。
3. 短縮名のディレクトリの中に、メディアディレクトリを作成します。ディレクトリの名前は、あなたがconfig.phpに記述したメディアディレクトリと同一の名前にしてください。
4. Nucleusにログインし、「新規Blog作成」をクリック。
5. 各種項目を入力しますが、「Blogの短縮名」は、先ほど決めたものにします。
6. ボタン「Blogを作成」をクリック。
7. 次の画面に表示される「方法1」のスクリプトをコピーし、テキストエディタを開いて貼り付け。
8. テキストファイルの書き換えを行います。include('../config.php')
9. テキストファイルはphpファイルとして、先ほど作成したディレクトリに保存。
10. 「URL」を変更します。「(Document Root)/短縮名のディレクトリ/テキストファイルのファイル名」
11. 「作成!」をクリック。新規ウェブログを作成します。
12. これまでの設定に不備があっても、「管理ホーム」のウェブログそれぞれの「設定」から修正することができます。
13. 通常通り、「アイテムの追加」「アイテムの編集/削除」、スキンから誘導される「アイテムの編集」で使うことができます。

アンインストールの際、プラグインはそっくりなくなるのですが、このプラグインを利用して作成したアイテムにおいて、MEDIAファイルへのアンカー切れが発生します。 その時は、それぞれのMEDIAディレクトリの内容をコレクション・ディレクトリごとコピーし、config.phpに書いた$DIR_MEDIAへ移動してください。アンカーが回復します。

メディアディレクトリの名前は、すべて統一されたものにしてください。 たとえば、あなたがconfig.phpに記述したメディアディレクトリの名前が「media」なら、 それぞれのウェブログのフォルダにあるメディアディレクトリも、同じように「media」ディレクトリとしてください。

### イベントの発生

すでにアップロードされているメディア・ファイルの名前を変更する前後、削除する前後にイベントを発生します。それぞれ、「PreMediaRename」、「PostMediaRename」、「PreMediaErase」、「PostMediaErase」です。 また、コレクション・ディレクトリにサブ・ディレクトリを作成する前後、サブ・ディレクトリの名前を変更する前後、サブ・ディレクトリを削除する前後にもイベントを発生します。 それぞれ、「PreSubdirCreate」、「PostSubdirCreate」、「PreSubdirRename」、「PostSubdirRename」、「PreSubdirRemove」、「PostSubdirRemove」です。 Nucleus CMSのバージョン3.3以降では、メディア・ファイルをアップロードする前後のイベント「PreMediaUpload」と「PostMediaUpload」を、コアが提供しています。

なお、NP_ActionLogPlusをこのプラグインと一緒に利用している場合、外部ファイルに関する履歴に「ファイル削除」と「ファイル名変更」、「サブ・ディレクトリの作成」、「サブ・ディレクトリの名前変更」、「サブ・ディレクトリの削除」が加わります。このプラグインが発生するイベント「PostRenameMedia」と「PostDeleteMedia」、「PostSubdirCreate」、「PostSubdirRename」、「PostSubdirRemove」をキャッチするからです。このプラグインは「PostMediaUpload」もキャッチします。

名前 | いつ | パラメータ
--- | --- | ---
PreMediaUpload | （Nucleus CMSのバージョン3.3以降）選択したメディア・ファイルがアップロードされる前 | collection （参照渡し）アップロードするメディア・ファイルが保存されるコレクション・ディレクトリ uploadfile （値渡し）アップロードするメディア・ファイルがサーバ上で一時的に保存されているファイルの名前 filename （参照渡し）アップロードした後のファイル名
PostMediaUpload | （Nucleus CMSのバージョン3.3以降）選択したメディア・ファイルがアップロードされた後 | collection （値渡し）選択したメディア・ファイルが保存されたコレクション・ディレクトリ mediadir （値渡し）アップロードしたメディア・ファイルが保存されたコレクション・ディレクトリのサーバにおけるパス filename （値渡し）アップロードした後のファイル名
PreRenameMedia | 選択したメディア・ファイルのファイル名が変更される前 | collection （値渡し）選択したメディア・ファイルが保存されているコレクション・ディレクトリ oldfilename （値渡し）選択したメディア・ファイルの以前のファイル名 newfilename （値渡し）選択したメディア・ファイルの現在のファイル名
PostRenameMedia | 選択したメディア・ファイルのファイル名が変更された後 | collection （値渡し）選択したメディア・ファイルが保存されているコレクション・ディレクトリ oldfilename （値渡し）選択したメディア・ファイルの以前のファイル名 newfilename （値渡し）選択したメディア・ファイルの現在のファイル名
PreDeleteMedia | 選択したメディア・ファイルが削除される前 | collection （値渡し）削除したメディア・ファイルが保存されていたコレクション・ディレクトリ filename （値渡し）削除したメディア・ファイルのファイル名
PostDeleteMedia | 選択したメディア・ファイルが削除された後 | collection （値渡し）削除したメディア・ファイルが保存されていたコレクション・ディレクトリ filename （値渡し）削除したメディア・ファイルのファイル名
PreSubdirCreate | コレクション・ディレクトリにサブ・ディレクトリが作成される前 | collection （値渡し）コレクション・ディレクトリの名前 subdir （値渡し）サブ・ディレクトリの名前
PostSubdirCreate | コレクション・ディレクトリにサブ・ディレクトリが作成された後 | collection （値渡し）コレクション・ディレクトリの名前 subdir （値渡し）サブ・ディレクトリの名前
PreSubdirRename | コレクション・ディレクトリのサブ・ディレクトリの名前が変更される前 | collection （値渡し）コレクション・ディレクトリの名前 olddirname （値渡し）変更前のサブ・ディレクトリの名前 newdirname （値渡し）変更後のサブ・ディレクトリの名前
PostSubdirRename | コレクション・ディレクトリのサブ・ディレクトリの名前が変更された後 | collection （値渡し）コレクション・ディレクトリの名前 olddirname （値渡し）変更前のサブ・ディレクトリの名前 newsubdirname （値渡し）変更後のサブ・ディレクトリの名前
PreSubdirRemove | コレクション・ディレクトリのサブ・ディレクトリが削除される前 | collection （値渡し）コレクション・ディレクトリの名前 subdir （値渡し）サブ・ディレクトリの名前
PostSubdirRemove | コレクション・ディレクトリのサブ・ディレクトリが削除された後 | collection （値渡し）コレクション・ディレクトリの名前 subdir （値渡し）サブ・ディレクトリの名前

### バージョン履歴

2010.02.28 Ver.3.0.1
  - アイテムの編集画面から呼び出して画像ファイルをアップロードした際、<%media%>でしか埋め込まれない不具合を修正。
  - 同梱しているGreyBoxを最新のバージョン(var.5.54)にした。
2009.02.09 Ver.3.0.0
  - サブ・ディレクトリ管理機能を追加。以降、Ver.2.x.xとVer.3.x.x（サブ・ディレクトリ管理機能つき）の2系統とします。
2009.02.09 Ver.2.2.0
  - クラスとその要素（プロパティ）、関数（メソッド）を設定。PHP5を意識してPHP4にも対応するよう再設計した。
  - NP_EachBlogDirをNP_ImprovedMediaに統合した。
  - グローバル設定「アップロードするファイル名の頭に日付を付加する」に応じて、ファイルの並び順を変更するようにした。
  - アイテム編集画面からの呼び出しと、スキンからの呼び出して、アイテムへの埋め込みまでのルーチンが変わるように変更した。
  - ヘルプファイルを更新
2009.01.20 Ver.2.1.1
  - Super Admin権限を持つユーザのみ利用できるようにしていたが、ウェブログの編集権限をひとつでも持つユーザにまで利用範囲を広げた。
  - インターフェースの改善
2009.01.11 Ver.2.1.0
  - URL内の任意の文字列を渡すことによってディレクトリ操作が可能になる脆弱性を防ぐため、ファイル名とディレクトリに関する処理を修正。
  - インターフェースを改善。
  - グローバル設定のAllowUploadにを反映するように修正。
  - プラグインの利用をウェブログ・グループに所属しているユーザに限定。
  - Ver 2.0でマージしたファイル・アップロードに関するコードを削除。アップロードに関しても、コアの機能を最大限に利用します。
  - ヘルプファイルを更新。
2009.01.06 Ver.2.0.2公開中止
  - 2008.12.17のメディアマネージャにおける脆弱性についてで報告された脆弱性を考慮し、公開を中止。修正に着手。
2008.02.08 Ver.2.0.2
  - アイテムへの埋め込み確認の際、埋め込まれるコードを表示をし、コードの再編集への注意を促すように修正。
  - メディア・ファイルを文書に挿入するへのボタンをクリックした際の動作に関して、バグの修正。
2008.01.31 Ver.2.0.1
  - GreyBox機能がオフの際のコード埋め込み不具合を修正。
  - ヘルプファイルを更新
2008.01.15 Ver.2.0
  - コードの見直しに伴い、バージョンをあげた。
  - ファイル・アップロード、ファイル名変更、ファイル削除の各プラグイン・イベントを設定。
  - プラグイン・イベントに関するNucleus CMSのバージョン間での違いを吸収するために、ファイル・アップロードに関するコードをマージ。
  - Internet Explorerでファイルを開く際に、ポップアップしないJavaScriptのバグを修正。
  - ヘルプの更新。
  - プラグイン関連のディレクトリ構造の変更。
2007.11.20 Ver.1.3
  - スキン変数を実装。スキンからの呼び出しを可能とした。
  - スキンから呼び出された際は、ボタン「文書へ挿入」を非表示にした。
  - GreyBoxを含むパッケージにした。
2007.11.06 Ver.1.2(Bundling GreyBox)
  - GreyBoxユーティリティによるウィンドウオープンを実装。
2007.11.01 Ver.1.2
  - ヘッダ追加情報の上書き状態を修正。
  - オプションの追加。
  - パースエラーの修正。
  - Nucleus3.3のコードを合体。
  - ヘルプの更新。
  - プラグイン関連のディレクトリ構造の変更。
2007.06.21 Ver.1.1
  - プライベート・コレクションのオン・オフを追加。
  - パースエラーの修正。
  - ヘルプの更新。
2007.02.17 Ver.1.0.2 (RC3)
  - リリースキャンディデート3
2006.12.31 Ver.1.0.1 (RC2)
  - リリースキャンディデート2
2006.12.29 Ver.1.0 (RC1)
  - リリースキャンディデート
2006.12.22 Beta
  - ベータバージョン
2006.12.20 Alpha
  - アルファバージョン

### 動作の仕組み

備忘録として残しておきます。

#### アイテムの追加/編集の時

1. 変数「action」によりイベント「AdminPrePageHead」、「BookmarkletExtraHead」が発生した際、XHTML要素「head」にJavaScript関数を挿入。 action.php経由でプラグインの出力するMedia Controlをポップアップ表示するJavaScript関数「AddMedia()」を埋め込む。
2. また同時に、JavaScript関数「includeImage()」と「includeOtherMedia()」もヘッダに追加。
3. 追加したJavaScript関数はXHTMLファイルに直接埋め込まれているため、コアのJavaScript関数「AddMedia()」よりも呼び出し優先される。
4. JavaScript関数「AddMedia()」はMedia Controlにユーザを誘導し、JavaScript関数「includeImage()」と「includeOtherMedia()」は代替テキスト入力を代行する。
5. 追加したJavaScript関数「AddMedia()」は、blogidもしくはitemidをget変数としてMedia Controlに渡す。
6. blogid（ない場合はitemid）を用いてグローバル変数の$DIR_MEDIAと$CONF[’MediaURL’]を置き換える。
7. Media Controlが自分を呼び出す際は、必ずblogidをget変数として渡す。
8. あとはコアの機能を利用して、ポップアップや埋め込みのコードが生成される。

#### 表示される時

1. action変数により、イベント「InitSkinParse」が発生したとき、つまりスキンの初期化の直前に、プラグイン内のあるメソッドが実行される。
2. メソッドは、blogオブジェクトからshortnameを参照し、それを用いてグローバル変数の$DIR_MEDIAと$CONF[’MediaURL]を置き換える。
3. 画像へのアンカーが、スキン変数<%popup%>、<%image%>において、置き換えられる。
4. イベント発生をPreItemにしなかったのは、ポップアップで呼び出されるウィンドウにも変更を適用したかったから。