### プラグインの概要

NucleusCMSで作成したwebサイトのアイテム・カテゴリに好きな名前をつけて、静的URLとしてリンクを生成します。
FancyURLモードでのみの動作、及びmod_Rewrite必須です
カテゴリ、サブカテゴリ、アーカイブリスト等を、それぞれディレクトリとみなし、カテゴリで絞り込んだ時は当該カテゴリのディレクトリにあるindexファイルを参照するイメージになります

- ex.
- カテゴリへのアクセスのイメージ:
  - http://example.jp/nucleuscms/
- サブカテゴリへのアクセスのイメージ:
  - http://example.jp/nucleuscms/plugins/
- アーカイブへのアクセスのイメージ:
  - http://example.jp/archives/
  - http://example.jp/archives/nucleuscms/

メンバーの詳細ページと個別アイテムページは、当該htmlファイルにアクセスするイメージになります

- ex.
- http://example.jp/nucleuscms/plugins/NP_CustomURL.html
- http://example.jp/new_nucleus_comming_soon.html
- http://example.jp/member/Hiroyuki.html

### インストール・動作開始手順

1. ダウンロードしたファイルを解凍して出来た「NP_CustomURL.php」ファイルと「customurl」ディレクトリをサーバの plugins ディレクトリにアップロード後、「プラグインの管理」ページで「CustomURL」を選択して「プラグインのインストール」ボタンをクリックします
   (この文章を読んでいるということは、ここまでは出来ていると思います)
2. まず始めに、管理画面の「グローバル設定」ページで「URL モード」を「Fancy」に変更します
3. 通常の「extra」ディレクトリの「fancyurls.config.php」を、FancyURLsの手順通りトップディレクトリへコピーして編集します
   このときコピーするのは「fancyurls.config.php」ファイルだけで、後のファイルはコピーする必要がありません
4. 次に「index.php」を編集しますの `$CONF['Self']` の行を `$CONF['Self'] = '.'` に書き換え、 `$curl_blogid = 1;`("1"は「index.php」でアクセスするブログのID) と一行書き加えます

   >     <?php
   >     // This file will generate and return the main page of the site
   >     $CONF = array();
   >     $CONF['Self'] = '.';
   >     $curl_blogid = 1;

   >     include('./config.php');
   >     include('./fancyurls.config.php');

   >     selector();

   >     ?>

5. 次に`.htaccess`を編集します
   - 内容はこちら

     >     RewriteEngine on
     >     RewriteCond %{REQUEST_FILENAME} !-f
     >     RewriteCond %{REQUEST_FILENAME} !-d
     >     RewriteRule ^(.*)$ index.php?curl=$1 [L,QSA]

     この4行だけで、後は何も書かなくても大丈夫です

これで準備完了です
注1：現在 FancyURLs で運用されている方は、Fancy 用のファイルを削除するか別ディレクトリへ退避してください。すべてこのプラグインで受けているので必要ありません
また、下記プラグイン用のFancyファイルは組み込み済みですので不要です

- 各ページスイッチ用「page」ファイル
- タグ用「tag」ファイル(「NP_TagEX」「NP_MultiTags」両方対応。「NP_MultiTags」の「タグクエリー 」の変更にも対応しています)
- 「NP_Trackback」のトラックバック受信専用「trackback」ファイル

### 使い方

- ブログ・アイテム・カテゴリ・メンバーの編集ページにそれぞれオプションが追加してありますので、好きな名前をつけてください
- メンバーの新規追加、及び「ブログの設定の編集」ページからのカテゴリの新規追加の時にはこれらの編集画面が出ませんので、追加したあとにそれぞれ編集してください
- 新規追加時のデフォルトの名前は、ブログは[ショートネーム]カテゴリーは[category_(catid)]、アイテムは[item.html]、メンバーは[ログインネーム.html]がそれぞれ設定されます
  なお、プラグインのインストール時にブログに存在した全てのブログ・アイテム・カテゴリ・メンバーには自動でパスを生成済みです
- 同一ブログ内、同一キーでの名前は重複できませんので気をつけてください
  登録しようとしたパスが重複していた場合は、末尾にそれぞれのIDが'_id'の形で追加されます
  同一ブログであっても、カテゴリーとサブカテゴリー、アイテムは同じ名前をつけることが出来ます
  つまり、http://example.jp/nucleuscms/nucleuscms/nucleuscms.htmlは有効なパスとなります
- メンバー、及びアイテムのパスには、末尾に自動的に[.html]が付加されるので、編集時に[.html]をつけないように気をつけてください
  うっかり付けてしまうと、[item_html.html]というような、なんだかよく解らないファイル名が出来上がってしまいます
- メンバーディレクトリ、アーカイブディレクトリ、アーカイブリストディレクトリはプラグインの編集画面で変更できます。初期値はそれぞれの`$CONF['***Key']`の値になっています
- ディレクトリ名、及びファイル名として使用できる文字は半角英数字(a-z,A-Z,0-9)と半角ハイフン(-)と半角アンダーバー(_)のみです
  なお、指定された文字列の中に含まれている '/'(スラッシュ)や'.'(ピリオド)は、自動的に '_'(半角アンダーバー)に変換されますが、それ以外のときはエラーを返します
  URL生成のときはアルファベットの大文字小文字の区別はしますが、アクセスのときはURLの使用上区別できません
  通常のHTMLリンク同様、 http://example.jp/NucleusCMS/ と表示してあるリンクに対し、ブラウザのアドレス欄に http://example.jp/nucleuscms/ でアクセス可能です
- サブカテゴリ用のディレクトリ名は、現在管理画面でのみ編集可能です
  新しく追加されたサブカテゴリについてはリンク生成のタイミングでデータベースを更新しているので、実用上問題ないと思います
  デフォルトのサブカテゴリ用ディレクトリ名は[subcatid_(subid)]です
- 管理画面、編集画面でディレクトリ名を空白にした場合は、データベースからその名前が削除され、URLは従来のFancyURLsのものになります
  (但しサブカテゴリーについては、追加・削除のタイミングがプラグイン側で判断できないため、「空白文字列 = デフォルト名」になります)
- ブログアクセス用パスとカテゴリーアクセス用パスには同じ名前をつけることが出来ません
  これは `hostname` の次に来るパス名がカテゴリのものであるのかブログのものであるのかを見分ける有効な手段が見つからないための制限です
- トップディレクトリ直下に実在するディレクトリ名やファイル名をパスとして登録することは出来ますが、httpサーバは実在するものの方を返すので、このパスは事実上無効となります
- このプラグインのインストール後でも、従来のクエリ式のURL(ex. http://example.jp/index.php?catid=123)やFancyURLs式のURL(ex. http://example.jp/category/12/item/34)でのアクセスは可能です
- 各ブログ毎にオプションで URI を変更する・しないを選択することが出来ます。このオプションを「使用しない」にした場合は、通常のFancyURLs(ex. http://example.jp/category/12/item/34)になります
  また「使用しない」にした場合でも、生成される URI が FancyURLs になるだけで、カスタマイズされた URI でリクエストがあった場合のリンクは成立しますので、このプラグインの使用をやめる場合などは外部からのリンクの書き換えが全て終わるまで、このオプションで「使用しない」を選択した状態での運用によってスムーズに移行できると思います
- デフォルトで生成されるURIの接頭語はオプション画面で変更できます
- アイテムの接頭語のみ、<%year%>、<%month%>、<%day%>の各変数が使用できます
  この値を<%month%>-<%day%>とした場合、アイテムの投稿時に自動で作成されるURIは「08-21_(id)」のようになります

### スキン・テンプレート変数

スキン・テンプレート、及び記事中に記入することが出来ます
記入方法：`<%CustomURL(リンク先, リンク文字列, リンクタイトル)%>`

- リンク先：リンク先の種類/id または名前/指定種別
  - 第一パラグラフ：i、c、s、b、m のいずれか。それぞれ、item、category、subcategory、blog、member の頭文字
  - 第二パラグラフ：リンク先の id、もしくは名前。名前はパス名ではなく、「カテゴリー名」「ブログの短縮名」等になります。リンク先にアイテムを選択した場合は、ここに指定できるのは id のみになります
  - 第三パラグラフ：第二パラグラフに id を指定した場合は 'i' 、名前を指定した場合は 'n' と記入してください
- リンク文字列：a タグに挟まれる文字列。省略された場合は url のみが生成されます
- リンクタイトル：a タグの「title」属性に設定されます。省略された場合は、リンク文字列が存在すれば変わりに設定されます。リンク文字列を指定せずにタイトルのみを指定してもリンクタグは生成されません
- 全てのパラメータを省略して<%CustomURL%>と書くことも出来ます。この場合は記入場所によってデフォルトの URI が書き出されます
  - スキン　　　：選択中の「ブログ」のトップページへの URI が書き出されますす
  - テンプレート：書き出されるアイテムへの URI が書き出されます(<%itemlink%>の置き換え)
  - 記事中　　　：自分自身への URI が書き出されます

記入例：

- id が123のアイテムにリンクする場合：<a href="<%CustomURL(i/123/i)%>">'ここは自由に書き込んでください'</a>
  書き出される文字列：<a href="http://blog.example.jp/item_123.html">'ここは自由に書き込んでください'</a>
- カテゴリー名が「日記」のカテゴリーの URI を書き出す場合：<%CustomURL(c/日記/n)%>
  書き出される文字列(「日記」カテゴリーのidが12の場合)：http://blog.example.jp/category_12/
- ブログの短縮名「bibouroku」へのリンクを「このブログ」という文字列からのリンクに設定する場合：<%CustomURL(c/bibouroku/n, このブログ)%>
  書き出される文字列：<a href="http://blog.example.jp/">このブログ</a>

スキン・テンプレート・記事共に、<%CustomURL(123)%>のように id のみを記入した場合は、その id を持つアイテムへの URI が書き出されます
またアイテムの場合のみ、<%CustomURL(123/path)%>と書くことで、item_123 のようにその id を持つアイテムに設定したパスを書き出すことが出来ます

### 動作報告・バグレポート

動作報告・バグレポートは、以下のURLにコメント・トラックバックをお願いします
http://shizuki.kinezumi.net/NucleusCMS/Plugins/NP_CustomURL/NP_CustomURL.html

### バージョン履歴

- Version 0.2.3: 不具合修正・機能追加
  - リダイレクト周りにバグがあったので修正
  - 「カスタマイズされたURLを使用する」を「はい」にしている時、旧来のFancuURLでアクセスしてきたクライアントに301を返してリダイレクトするように変更
- Version 0.2.2a: 不具合修正
  - SQLインジェクションを引き起こす可能性がある脆弱性に対処
- Version 0.2.2: 不具合修正・機能追加
  - バグフィックス
  - アイテム・カテゴリー・サブカテゴリーの新規作成時のデフォルトの接頭語のオプションでの変更に対応
    アイテムの接頭語のみテンプレート化
- Version 0.2.1a: 不具合修正
  - バグフィックス
- Version 0.2.1: 機能追加
  - サブカテゴリの多段URL化
  - カテゴリ・ブログの削除時にサブカテゴリのデータが消去できていなかった不具合を修正
  - その他修正
- Version 0.1.9: 機能追加
  - カテゴリ及びアイテムのブログ間移動に対応
- Version 0.1.8a: 不具合修正・機能追加
  - 新規サブカテゴリのパス登録のタイミング変更に伴う修正
  - ブログ毎にカスタマイズした URI を使用する・しないを選択できるようにオプションを追加
  - ヘルプファイルの修正
- Version 0.1.8: 不具合修正
  - 新規ブログ作成時に自動で作成される'General'カテゴリーに対するURIが正常に動作しなかった不具合に対応
  - ブログを削除した時に、削除したブログに属する「カテゴリー」「サブカテゴリー」「アイテム」のURIがテーブルに残ったままになっていた不具合に対応
  - 新規サブカテゴリーのパスの登録のタイミングをリンクが生成される時に変更(リンク生成前に管理画面でURIを設定していた場合は設定したURIが使用されます)
  - 管理ページでアイテムURIがおかしくなっていたのを修正
- Version 0.1.7: 不具合修正
  - ほぼ全面的に書き直し
  - 新規アイテム追加時にトラックバックを送信した時に、トラックバック元のURLが正しく送信できなかった
  - 管理画面からサブカテゴリのパスを編集したときに、リストが表示されなかった
- Version 0.1.5: 公開バージョン
- Version 0.01: 初期バージョン(NP_Pathの改造バージョン)

### 謝辞

本プラグインの英語版ランゲージファイル、及びヘルプファイル作成に当たりまして、多大なるご協力をいただきましたTucker氏に心より感謝申し上げます

### プラグイン改造情報

「NP_TagEX」と「NP_ContentsList」で 「http://example.jp/nucleuscms/plugins/tag/NP_CustomURL」 形式のリンクを表示させる方法
「NP_TagEX」の場合
・一番最後のファンクション`creatTagLink()`の最後の`return addLinkParams($link, $linkparams);`の直前に、次のコードを挿入します

>     global $manager;
>     if ($manager->pluginInstalled('NP_CustomURL')) {
>         $customurls = $manager->getPlugin('NP_CustomURL');
>         $link = 'tag/' . $ready.$sep.$this->_rawencode($tag);
>         return $CONF['BlogURL'] . '/' . $customurls->_addLinkParams($link, $linkparams) . '/';
>     }

これでタグがURLの一番最後になります
「NP_ContentsList」の場合
・`doSkinVar()`の467行目付近、`$catdata['catlink']`の生成が終了したところでサブカテゴリのリンクを生成する直前、

>     // sub category ---
>     if ($subcat && (!$subcurrent || $catid == $catdata['catid']) && !$subnoOpen) {

の前の行に

>     if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
>         $catdata['catlink'] = createCategoryLink($catdata['catid']);
>     }

の一行を追加して、カテゴリのリンクを上書きします
さらにそこからもう少し下の

>     $subdata['sublink'] = addLinkParams($catdata['catlink'], array($subrequest => $subdata['subcatid']));

となっている行の下に

>     global $manager;
>     if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
>         $customurls = $manager->getPlugin('NP_CustomURL');
>         $subdata['sublink'] = $customurls->_addLinkParams($catdata['catlink'], array($subrequest => $subdata['subcatid']));
>     }

と追加、350行目付近の`$data['self'] = $data['blogurl'];`の前に

>     if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
>         $data['blogurl'] = createBlogidLink($data['blogid']);
>     }

を追加して終了です