# CustomMenu Editor プラグイン

## バージョン: 0.4.2

## 作成者: Yoshinori Tahara - dengen

## 公開日: 2009.1.9

## ライセンス: GPL

## 概要:

- CustomMenu Editor プラグインは，メインメニュー（ヘッダーメニュー）の設定を管理画面で簡単に行えるようにするものです。
- 厳密に言うと、本プラグインはカスタムメニューエントリーを扱うものなのですが、メインメニューの全てのエントリーをカスタムメニューエントリーに統一することにより、快適なメニュー編集が可能になります。

## 機能:

- メインメニューの登録、修正、並べ替え、削除などの編集が管理画面で行えます。
- 多言語切り替え機能に対応しています。
- PHPモードにより、メニューに動的な変化を付けることができます。
- Geeklog標準のメニューエントリーがあらかじめ登録済みであり、また、各種プラグインにより登録されるメニューエントリーを自動的に収集します。
- 多階層メニューを設置できます。

## 条件:

- このプラグインは，Geeklog 1.4.1 および 1.5.0 用です。それ以外のバージョンでは動作確認を行っていません。

## この説明のセクション:

- １） インストール
- ２） アンインストール
- ３） メニューアイテムのモードについて
- ４） 多言語切り替え機能について
- ５） URLの照合機能について
- ６） 多階層メニューに対応した独自メニューレンダラについて
- ７） 著作権について
- ８） 改訂履歴

### １） インストール

インストールには，手動でプラグイン用のディレクトリを作成し，適切なディレクトリへファイルをコピーする必要があります。

以下の説明で，

- <geeklog_dir> は，システムの config.php が存在するディレクトリ
- <public_html> は，lib-common.php が存在するディレクトリ
- <admin> は，管理者用ファイルが存在するディレクトリ（普通は，<public_html>/admin/ ）

を表しています。

#### Step 0 - データベースのバックアップ

- CustomMenu Editor プラグインはテーブルを追加するので，管理者メニューの「DBのバックアップ」や phpMyAdmin を使用して，事前に Geeklog のデータベースをバックアップしておきます。

#### Step 1 - アーカイブの展開

- CustomMenu Editor プラグインのアーカイブを <geeklog_dir>/plugins ディレクトリに展開します。custommenu という名前のディレクトリができます。

#### Step 2 - 必要なディレクトリの作成

- <public_html> ディレクトリの下に custommenu という名前のディレクトリを作ります。
- <admin>/plugins/ ディレクトリの下にも custommenu という名前のディレクトリを作ります。

#### Step 3 - 必要なファイルのコピー

- <geeklog_dir>/plugins/custommenu/ ディレクトリに移動します。
- admin ディレクトリの内容を，Step 2 で作成した <admin>/plugins/custommenu/ ディレクトリにコピーします。
- public_html ディレクトリの内容を，Step 2 で作成した <public_html>/custommenu/ ディレクトリにコピーします。

#### Step 4 - Geeklog 本体の config.php の編集

- (参考) Geeklogのメニューエントリーには、'home', 'contribute', 'search', 'stats', 'directory', 'prefs', 'plugins', 'custom'の８種類があります。
- (参考) このうち、'custom' はカスタムメニューエントリーの集合であり、CUSTOM_menuEntries 関数が返すエントリー群を束ねたものです。
- このセクションでは、メニューエントリーを 'custom' だけ有効にし、その他の７種類のエントリーを無効にしてしまいます。
- あなたがコンフィギュレーションエディタプラグインを使用している場合は、これを使ってメニューエントリーを「カスタム」だけ残し、その他のチェックボックスをオフにしてください。
- あなたがコンフィギュレーションエディタプラグインを使用していない場合は、<geeklog_dir>/config.phpをテキストエディタで開き、変数 $_CONF['menu_elements'] を次のように変更して下さい。

    $_CONF['menu_elements'] = array(
        'custom'
    );

#### Step 5 - lib-custom.php の編集

- (参考) Geeklog 日本語版では、<geeklog_dir>/system/lib-custom.php からカスタムメニューエントリーを司る custom_menuentries.php をインクルードしています。
- (参考) さらに custom_menuentries.php にはカスタムメニューエントリーを定義する CUSTOM_menuEntries 関数が含まれています。
- 本プラグインでは、独自にCUSTOM_menuEntries 関数を定義していますので、lib-custom.php のインクルード指令を無効にしてやります。
- <geeklog_dir>/system/lib-custom.php をテキストエディタで開き、次のようにコメントアウトしてください。（既にコメントアウトされている場合は変更不要です）

    //require_once( 'custom/custom_menuentries.php' );

#### Step 6 - プラグインエディタでインストールの実行

- Root ユーザとしてログインし，プラグインエディタから custommenu のインストールを実行します。
- 失敗した場合には，エラーログ（ error.log ）を調べます。
- これで，CustomMenu Editor プラグインはインストールされました。
- 投稿管理メニューまたはサイドバーのメニューから、「カスタムメニュー」をクリックすると、カスタムメニューリストが表示されるでしょう。

#### Step 7 - テンプレートの配置（表示レイアウトの最適化）

- CustomMenu Editor プラグインのテンプレートは professional テーマをターゲットにして最適化しています。
- professional テーマや professional テーマから派生したテーマを使用している場合は次を読まなくても良いでしょう。
- ProfessionalCSS テーマや ProfessionalCSS テーマから派生したテーマを使用している場合は、ディレクトリ<geeklog-dir>/plugins/custommenu/layout/ProfessionalCSS/custommenuを、ディレクトリ<public_html>/layout/<テーマ名>/の下へコピーしてください。

Goto Top

### ２） アンインストール

#### Step 0 - データベースのバックアップ

- CustomMenu Editor プラグインはアンインストール時に，CustomMenu Editor プラグインが使用していたテーブルを破棄するので，管理者メニューの「DBのバックアップ」や phpMyAdmin を使用して，事前に Geeklog のデータベースをバックアップしておくことをお勧めします。

#### Step 1 - プラグインエディタでアンインストールの実行

- プラグインエディタから，custommenu をアンインストールします。このとき，CustomMenu Editor プラグインが使用していたテーブルは破棄され，その中に記録されていたデータも削除されます。

#### Step 2 - Geeklog 本体の config.php を元にもどす

- <geeklog_dir>/config.phpをテキストエディタで開き、変数 $_CONF['menu_elements'] を元にもどしてください。ちなみにGeeklog日本語版の初期値は次のようになっています。

    $_CONF['menu_elements'] = array(
        'home',         // ホーム へのリンク
        'contribute',   // 記事の新規作成へのリンク
        'calendar',     // カレンダ表示へのリンク
        'search',       // 検索オプションへのリンク
        'stats',        // ステータス情報
        'directory',    // 記事の一覧
        'prefs',        // アカウント情報
        'plugins'       // プラグイン {plg_menu_elements} 変数と同じ．
        // 'custom'     // CUSTOM_menuEntries 関数の返す文字列を表示．
        //（詳細はlib-custom.php参照）
    );

#### Step 3 - lib-custom.php を元にもどす

- １）の Step 5 で行った修正を元に戻します。

#### Step 4 - ディレクトリの削除

- インストールの過程で作成した3つのディレクトリ（ <geeklog-dir>/plugins/custommenu/ ，<public_html>/custommenu/ ，<admin>/plugins/custommenu/ ）を削除します。

Goto Top

### ３） メニューアイテムのモードについて

本プラグインではメニューアイテムを3種類のモードで使い分けることが可能です。各モードの説明を次に示します。

モード | 説明 | 難易度 | 柔軟性
--- | --- | --- | ---
固定 | タイトル文字列を固定するモードです。 併せて「タイトル（固定）」を入力します。 | 簡単 | 低
可変 | Geeklogの多言語切り替え機能に応じてタイトルを可変にするモードです。 併せて「タイトル（可変）」を入力します。 「タイトル（可変）」には言語ファイル内で定義されている配列変数を指定します。 例えば、$MY_WORD['label'] をタイトルにする場合は MY_WORD['label'] を記入します。 | やや難しい | 中
PHP | 多言語切り替え機能に応じてタイトルを可変にするモードです。 併せて「PHP関数名」を入力します。 「PHP関数名」にはメニューアイテムの情報を返り値として返す関数の関数名を指定します。 この関数は関数名に接頭辞「phpmenuitem_」を付けて定義して下さい。 関数の定義は system/lib-custom.php で行うのが適当でしょう。 サンプルとして、plugins/custommenu/functions.php に 次の関数を定義しています。
サンプル関数名 | メニュータイトル | 説明
--- | --- | ---
phpmenuitem_contribute | 記事投稿 | 話題に応じてURLを変化させる例です。
phpmenuitem_login | ログイン（ログアウト） | ユーザがログインしているかどうかに応じて、タイトルとURLを変化させる例です。
| 難しい | 高

Goto Top

### ４） 多言語切り替え機能について

バージョン0.2.3より多言語切り替え機能への対応を強化しました。

バージョン0.2.2以前のバージョンでは、多言語切り替えのために「可変モード」を用意していましたが、メニューアイテムの表示を切り替えることはできるものの、リンク先まで切り替えることはできませんでした。（そこまでやるにはPHPモードを活用する必要がありました。）

バージョン0.2.3からはGeeklog1.5.1から追加された「ブロックの多言語切り替え機能」と同様の機能をサポートします。

「ブロックの多言語切り替え機能」の詳細については以下のWikiを参照してください。

- http://wiki.geeklog.jp/index.php/Multi-Language_Support#.E3.83.96.E3.83.AD.E3.83.83.E3.82.AF
- http://wiki.geeklog.net/wiki/index.php/Multi-Language_Support#Blocks

一例として、英語と日本語を切り替える場合の使用方法を示します。

- カスタムメニュー管理画面で言語数＋１つ（つまり合計３つ）で１セットのメニューアイテムを作成します。
- そして「メニューアイテムID」を、例えば次のように設定します。

    about
    about_en
    about_ja

- ここで添字"_en"を付加したものは英語モードで、添字"_ja"を付加したものは日本語モードで用いるアイテムにします。
- そして、それぞれの「有効」オプションを次のように設定します。

    about        有効
    about_en     無効
    about_ja     無効

- 「タイトル（固定）」や「URL」はそれぞれの言語に応じて、表示させたいリンク先のURLを指定します。（「モード」が「固定」の場合）
- これで完了です。言語モードを切り替えてみてください。
- メニューアイテム"about"の情報が、システムの言語モードに応じて、メニューアイテム"about_en"やメニューアイテム"about_ja"の情報でオーバーライドされる仕組みです。システムの多言語モードがオフの時には、メニューアイテム"about"の情報がそのまま使われます。

Goto Top

### ５） URLの照合機能について

バージョン0.3.0よりURLの照合機能を追加しました。

URLの照合機能とは、Geeklogサイトの表示中のページのURLをメニューアイテムごとに照合し、マッチしたメニューアイテムのスタイルを変化させるものです。

例えば、リンクのページを開いているときに、リンクのメニューアイテムを反転させて表示させることが可能となります。

ただし、別途、システムの一部（lib-common.php）とテーマの一部を変更する必要があります。

一例として、リンクのメニューアイテムを反転させる方法を示します。ここでは、professionalテーマを用います。

- カスタムメニューの管理画面で「リンク」を編集します。
- 項目「URL照合文字列」へ"/links/"を入力し、更新ボタンをクリックします。カスタムメニューエディタでの作業はこれだけです。
  これは、「表示ページのURLに"/links/"が含まれていたときに、メニューアイテム「リンク」のスタイルを変化させる。」という意味の設定です。
- なお、「正規表現」を有効にすると、PHPがサポートしている正規表現で照合することができます。照合の条件が複雑な場合に使用することを想定した機能であり、使用する場面は少ないでしょう。照合にはpreg_match関数を使用しています。
  正規表現の詳細については http://jp.php.net/manual/ja/regexp.reference.php を参照してください。
- lib-common.phpの変更は実質2行追加するだけの簡単なものであり、副作用もありません。同梱の/bonus/lib-common.phpの623行目および681行目を参考にしてください。Geeklog1.5.1用ですので該当バージョンをお使いの方はそのまま使用されてもよいでしょう。
- テーマの変更は、menuitem.thtml、menuitem_last.thtml、style.css の3つのファイルを対象とします。
  /bonus/layout/professonal 内のファイルを参照してください。
  <li>タグに class="{menuitem_selected}" が追加されていることに注目してください。
- style.cssは1031行目から1033行目の3行を加えるだけです。(サンプルなので単純に背景色を変えただけ)
- これで完了です。メニューアイテム「リンク」をクリックして効果を確認してみてください。
  テーマをさらに変更してハイセンスなメインメニューを構築してください。

Goto Top

### ６） 多階層メニューに対応した独自メニューレンダラについて

バージョン0.4.0より多階層メニューや画像を使ったメニューに対応した独自メニューレンダラを搭載しました。

比較的大規模なサイトに多くみられるプルダウンメニューなどを実装可能なHTMLを出力できるようになりました。

Geeklog標準のメニューレンダラが出力するヘッダーメニュー部のHTMLは次のようなものです。

    <div class="header-navigation-container">
      <ul>
        <li class="menuitem"><a href="index1.php">text1</a></li>
        <li class="menuitem"><a href="index2.php">text2</a></li>
        <li class="menuitem"><a href="index3.php">text3</a></li>
            :
            :
            :
        <li class="menuitem last"><a href="indexx.php">textx</a></li>
      </ul>
    </div>

これに対して、今回搭載した独自メニューレンダラでは、次のような入れ子構造のHTMLを出力することができます。

    <div class="header-navigation-container">
      <ul>
        <li id="menu_id1" class="menuitem"><a href="index1.php">text1</a></li>
        <li id="menu_id2" class="menuitem"><a href="index2.php">text2</a>
        <ul>
          <li id="submenu_id1" class="menuitem"><a href="index_s1.php">text1</a></li>
          <li id="submenu_id2" class="menuitem"><a href="index_s2.php">text2</a></li>
          <li id="submenu_id3" class="menuitem"><a href="index_s3.php">text3</a></li>
              :
              :
              :
          <li id="submenu_idx" class="menuitem"><a href="index_sx.php">textx</a></li>
        </ul>
        </li>
        <li id="menu_id3" class="menuitem"><a href="index3.php">text3</a></li>
            :
            :
            :
        <li id="menu_idx" class="menuitem last"><a href="indexx.php">textx</a></li>
      </ul>
    </div>

また、メニューアイテムごとに次のテンプレート変数をサポートします。

テンプレート変数名 | 説明
--- | ---
menuitem_url | メニューアイテムのリンク先URL
menuitem_text | メニューアイテムのタイトル
menuitem_id | メニューアイテムのID
menuitem_class | メニューアイテムのクラス名 (例：'last')
class_property | メニューアイテムのクラスプロパティ (例：'class="last"')
menuitem_icon_url | メニューアイテムのアイコンとして用いる画像のURL

多階層メニューを試すには、次の操作を行って下さい。

- /bonus/lib-common.phpの657行～666行のように、lib-common.phpを修正する必要があります。
- コンフィギュレーション -> カスタムメニュー -> メニューレンダラ を「階層メニュー対応」に設定します。
- /bonus/layout/テーマ名 のファイル群を、テーマディレクトリにコピーします。(professional と ProfessionalCSS のみ対応)
  この操作で、各テーマの menuitem.thtml, menuitem_last.thtml, style.css, custom.css を上書きしますので、事前のバックアップをお忘れなく。
- 「メニューアイテムの編集」で「親アイテムID」を使って階層を設定します。
- 階層メニューの起点になるメニューアイテムのクラス名に 'drop' や 'fly' を設定してみて下さい。（アローアイコンが出現します）
- 子階層メニューの最初のアイテム、孫階層メニューの最初のアイテム、親階層メニューの最後のアイテムのクラス名に 'enclose' を設定して下さい。

画像を使ったメニューを試すには、テンプレート変数 menuitem_icon_url を使って、/layout/テーマ名/custommenu 内の menuitem.thtml, menuitem_drop.thtml を修正します。加えて、CSSを使ってレイアウトを調整してください。

Goto Top

### ７） 著作権について

本作品で、削除および矢印アイコンとして使用している delete.png, arrow-dn.png, arrow-up.pngは Joseph North さんの著作物です。
ライセンスは次のリンクをご覧ください。

Sweetie Icon Set
----------------
Author: Joseph North
Email: sublick@gmail.com
License: Creative Commons Attribution-ShareAlike 2.0
Year: 2005

Goto Top

### ８） 改訂履歴

バージョン | 公開日 | 説明
--- | --- | ---
0.4.2 | 2009.1.9 | 修正 掲示板プラグイン（forum）と併用した場合に、掲示板の「最新の投稿」が表示されなくなる問題に対応しました。
0.4.1 | 2009.1.4 | 追加 PHPモードで、ID、クラス名、子メニューエントリの配列を設定できるようにしました。 修正 メニューアイテムの編集におけるバリデーションを強化しました。 修正 0.4.0以降へのバージョンアップが正常に行えない問題に対応しました。 修正 メニューアイテムIDの変更に伴い親アイテムIDが更新されない問題に対応しました。 修正 テンプレートとCSSを一部修正しました。 修正 説明書（readme_jp.thml, readme_jp_1.5.html）を充実させました。
0.4.0 | 2008.12.24 | 追加 多階層メニューや画像を使ったメニューに対応する独自のメニューレンダラを搭載しました。 修正 同梱の/layoutディレクトリの内容が古くなっていた問題を解消しました。
0.3.0 | 2008.12.13 | 追加 URLの照合機能を追加しました。
0.2.3 | 2008.12.9 | 追加 インストール・アンインストール時に必要なコンフィギュレーションの設定を、自動的に行うようにしました。(Geeklog1.5以降で使用する場合のみ有効) 追加 多言語切り替え機能への対応を強化しました。
0.2.2 | 2008.9.26 | 修正 インクルード対策を実施しました。
0.2.1 | 2008.9.15 | 修正 CSRF対策のミスを修正しました。
0.2.0 | 2008.9.3 | 追加 Geeklog1.5で動作するようにしました。 追加 メニューアイテムの編集項目:URLで、サイトURLに置換されるタグ'[site_url]'が使えるようになりました。 修正 アンインストールしたプラグインのメニューアイテムが削除できない問題を修正しました。 修正 標準テンプレートをProfessionalCSS用のものからprofessional用のものへ変更しました。
0.1.0 | 2008.5.12 | 初期バージョン

Goto Top