# CustomMenu Editor プラグイン

## バージョン: 0.7.0

## 作成者: Yoshinori Tahara - dengen

## 公開日: 2013.03.17

## ライセンス: GPLv2

## 概要:

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

## 機能:

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

## 条件:

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

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

- １） インストール
- ２）アップグレード (バージョン0.6.1以前からバージョン0.7.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」の「Geeklogの設定：テーマ」を選択し、「テーマ」フィールドの「メニュー項目」 に「カスタムエントリ」だけがあることを確認してください。（この設定はCustomMenu Editor プラグインがインストール時に自動で行った結果です。）
- (参考) Geeklogのメニューエントリーには、'Home', '投稿する', '詳しい検索', 'サイトステータス', 'ディレクトリ', 'マイアカウント', 'プラグインエントリ', 'カスタムエントリ'の８種類があります。
- (参考) このうち、'カスタムエントリ' はカスタムメニューエントリーの集合であり、CUSTOM_menuEntries 関数が返すエントリー群を束ねたものです。

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

- (参考) <geeklog_dir>/system/lib-custom.php にはカスタムメニューエントリーを定義する CUSTOM_menuEntries 関数が含まれています。
- 本プラグインでは、独自にCUSTOM_menuEntries 関数を定義していますので、lib-custom.phpの中の CUSTOM_menuEntries 関数を無効する必要があります。
- <geeklog_dir>/system/lib-custom.php をテキストエディターで開き、513行目付近の CUSTOM_menuEntries 関数を次のようにコメントアウトしてください。（既にコメントアウトされている場合は変更不要です）

    /*
    function CUSTOM_menuEntries ()
    {
        global $_CONF, $_USER;

        $myentries = array ();

        // Sample link #1: Link to Gallery
        $myentries[] = array ('url'   => $_CONF['site_url'] . '/gallery/',
                              'label' => 'Gallery');

        // Sample link #2: Link to the Personal Calendar - only visible for
        // logged-in users
        if (!empty ($_USER['uid']) && ($_USER['uid'] > 1)) {
            $myentries[] = array ('url'   => $_CONF['site_url']
                                             . '/calendar/index.php?mode=personal',
                                  'label' => 'My Calendar');
        }

        return $myentries;
    }
    */

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

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

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

- professional テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/professional/custommenu/ を、ディレクトリ <public_html>/layout/professional/ の直下へコピーしてください。
- ProfessionalCSS テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/professional_css/custommenu/ を、ディレクトリ <public_html>/layout/professional_css/ の直下へコピーしてください。
- Denim テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/denim/custommenu/ を、ディレクトリ <public_html>/layout/denim/ の直下へコピーしてください。
- Modern Curve テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/modern_curve/custommenu/ を、ディレクトリ <public_html>/layout/modern_curve/ の直下へコピーしてください。
- WAIproCSS テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/WAIproCSS/custommenu/ を、ディレクトリ <public_html>/layout/WAIproCSS/ の直下へコピーしてください。
- 上記以外のテーマを使用している場合は、上記テーマのうち最も近いテーマを選択して、同様にディレクトリ /custommenu/ を配置してください。そして、自分のテーマに合わせてテンプレート(*.thtml)やスタイルシート(custommenu.css)の調整を行なってください。

Goto Top

### ２） アップグレード (バージョン0.6.1以前からバージョン0.7.0へ)

CustomMenu Editorプラグインはバージョン0.7.0から利用者が少なくなったIE6とIE7のサポートを廃止します。
また、ナビゲーションメニューのスタイル設定を /layout/テーマ名/custommenu/custommenu.css で行うように変更しました。
これらのことから、バージョン0.6.1以前からバージョン0.7.0へアップグレードする場合は、以下の手順により行なってください。

#### Step 0 - Geeklog本体のアップグレード

- CustomMenu Editorプラグインはバージョン0.7.0から、Geeklog2.0.0以降でなければインストールできません。必ず事前にGeeklog本体をバージョン2.0.0以降にアップグレードしてください。
- また、念のためテーマをprofessionalに設定してから作業を行なってください。

#### Step 1 - プラグインエディターで無効化

- プラグインエディター（プラグイン管理ページ）でいったん'CustomMenu'を無効にします。

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

- 3つのディレクトリ（ <geeklog-dir>/plugins/custommenu/ ，<public_html>/custommenu/ ，<admin>/plugins/custommenu/ ）を削除します。

#### Step 3 - ディレクトリ/layout/テーマ名/custommenu/の削除

- /layout/テーマ名/custommenuをバックアップした後、削除します。（あなたが独自に設定したテンプレートやスタイルシートを失わないようにしてください。）

#### Step 4 - テンプレートファイルの復旧

- 以下のテンプレートファイルをオリジナルのファイルに戻してください。（これらのファイルは、バージョン0.6.1以前をインストールした際に書き換えられています。バージョン0.7.0からはこれらのファイルを書き換えません。）
  - /layout/テーマ名/menuitem.thtml
  - /layout/テーマ名/menuitem_last.thtml

#### Step 5 - スタイルシートの復旧

- テーマのスタイルシート: /layout/テーマ名/style.css のうち、ナビゲーションメニューに関する部分をオリジナルに戻します。
  ProfessionalCSS及びProfessionalCSSから派生したテーマの場合は、スタイルシート: /layout/テーマ名/custom.css のうち、ナビゲーションメニューに関する部分をオリジナルに戻します。

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

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

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

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

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

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

#### Step 9 - プラグインエディターで有効化

- プラグインエディター（プラグイン管理ページ）で'CustomMenu'を有効にします。

#### Step 10 - プラグインエディターでアップデート

- プラグイン管理ページで'CustomMenu'をアップデートします。（「アップデートしてください!」の直後のアイコンをクリックします）

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

- professional テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/professional/custommenu/ を、ディレクトリ <public_html>/layout/professional/ の直下へコピーしてください。
- ProfessionalCSS テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/professional_css/custommenu/ を、ディレクトリ <public_html>/layout/professional_css/ の直下へコピーしてください。
- Denim テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/denim/custommenu/ を、ディレクトリ <public_html>/layout/denim/ の直下へコピーしてください。
- Modern Curve テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/modern_curve/custommenu/ を、ディレクトリ <public_html>/layout/modern_curve/ の直下へコピーしてください。
- WAIproCSS テーマを使用している場合は、ディレクトリ <geeklog-dir>/plugins/custommenu/bonus/WAIproCSS/custommenu/ を、ディレクトリ <public_html>/layout/WAIproCSS/ の直下へコピーしてください。
- 上記以外のテーマを使用している場合は、上記テーマのうち最も近いテーマを選択して、同様にテンプレートを配置してください。そして、自分のテーマに合わせてテンプレート(*.thtml)やスタイルシート(custommenu.css)の調整を行なってください。

Goto Top

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

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

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

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

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

#### Step 2 - コンフィギュレーションの設定を元にもどす

- １）の Step 4 で行った修正を元に戻します。
- CustomMenu Editor プラグインはアンインストール時にメニュー項目をGeeklogの初期値に戻します。管理画面で「コンフィギュレーション：Geeklog」の「Geeklogの設定：テーマ」を選択し、「テーマ」フィールドの「メニュー項目」を必要に応じて設定してください。
- (参考) Geeklogのメニュー項目の初期値は、順に'投稿する', '詳しい検索', 'サイトステータス', 'ディレクトリ', 'プラグインエントリ' です。

#### 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

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

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の照合機能について

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

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

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

- コンフィギュレーション -> カスタムメニュー -> メニューレンダラ を「階層メニュー対応」に設定してください。
- カスタムメニューの管理画面で「リンク」を編集します。
- 項目「URL照合文字列」へ"/links/"を入力し、更新ボタンをクリックします。カスタムメニューエディターでの作業はこれだけです。
  これは、「表示ページのURLに"/links/"が含まれていたときに、メニューアイテム「リンク」のスタイルを変化させる。」という意味の設定です。
- なお、「正規表現」を有効にすると、PHPがサポートしている正規表現で照合することができます。照合の条件が複雑な場合に使用することを想定した機能であり、使用する場面は少ないでしょう。照合にはpreg_match関数を使用しています。
  正規表現の詳細については http://jp.php.net/manual/ja/regexp.reference.php を参照してください。
- これで完了です。メニューアイテム「リンク」をクリックして効果を確認してみてください。

Goto Top

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

CustomMenu Editor プラグインは多階層メニューや画像を使ったメニューに対応した独自メニューレンダラを搭載しています。

比較的大規模なサイトに多くみられるプルダウンメニューなどを実装可能な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

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

- コンフィギュレーション -> カスタムメニュー -> メニューレンダラ を「階層メニュー対応」に設定します。
- 「メニューアイテムの編集」で「親アイテムID」を使って階層を設定します。

画像を使ったメニューを試すには、テンプレート変数 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.7.0 | 2013.03.17 | 追加 Geeklog 2.0.0からの新テーマエンジンに合わせて最適化しました。 追加 Denim, Modern Curve, WAIproCSSの各テーマのサポートを開始しました。 追加 動作に必要なGeeklogのバージョンを 2.0.0以降に変更しました。 変更 メニューデザインを新しくシンプルなデザインに変更しました。 変更 メニューのスタイル設定用のスタイルシートcustommenu.cssを追加しました。 変更 IE6及びIE7のサポートを廃止しました。 変更 テーマ標準のテンプレートmenuitem.thtml、menuitem_last.thtmlや、style.cssの変更を行う必要がなくなりました。 修正 親アイテムIDとして自分・子・孫のメニューアイテムIDを設定できてしまう問題を修正しました。 修正 管理画面でページを切り替えた場合にタイトルのチェックボックスが間違ってオン・オフされる問題を修正しました。 修正 PHPモードのメニューアイテムにぶら下がる子メニューアイテムが表示されない場合がある問題を修正しました。 修正 Geeklog本体のアップグレードとともにインストールされる場合にエラーが発生する問題を修正しました。
0.6.1 | 2011.11.17 | 修正 インストール時に初期登録メニューアイテムのグループが正しく設定されない問題を修正しました。
0.6.0 | 2011.5.22 | 追加 Geeklog 1.8.0で強化されたコンフィギュレーションUIに対応しました。 変更 動作に必要なGeeklogのバージョンを 1.8.0以降に変更しました。
0.5.0 | 2010.5.6 | 追加 Geeklog 1.6.0で追加された自動インストール機能に対応しました。 追加 Geeklog 1.6.1で追加されたCUSTOM_renderMenuに対応しました。
0.4.3 | 2009.8.4 | 追加 Geeklog 1.6.0で追加されたサイト移行機能に対応しました。 変更 Geeklog 1.6.0から追加されたCOM_output関数を使用してHTMLを出力するようにしました。
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