カスタムパネルカテゴリの追加

製品メニューを操作すると、Webコンテンツサイト設定などのパネルアプリが、*[Content][設定]*などのパネルカテゴリに整理されていることがわかります。このチュートリアルでは、新しいパネルカテゴリをメニューに追加する方法について説明します。新しいパネルアプリの追加については、次のセクションで説明します。

新しいカテゴリを作成するには、3つの手順があります。

  1. OSGi構造とメタデータを作成します。

  2. Liferayのフレームワークを実装します。

  3. コントロールメニューカテゴリを定義します。

OSGiモジュールの作成

最初にプロジェクトを作成する必要があります。

  1. お気に入りのサードパーティツールを使用してOSGiモジュールを作成するか、Blade CLIを使用します。Blade CLIは、パネルカテゴリとパネルアプリを作成するためのPanel Appテンプレートを提供します 。

  2. モジュールのsrcディレクトリに一意のパッケージ名を作成し、そのパッケージに新しいJavaクラスを作成します。命名規則に従うには、クラスに一意の名前を付け、その後にPanelCategoryを付けます(例:ControlPanelCategory)。

Liferayのフレームワークの実装

次に、OSGiモジュールをLiferayのフレームワークに接続し、それらを使用してエントリに関する情報を定義する必要があります。必要な手順は2つのみです。

  1. パネルカテゴリキーを宣言する@Componentアノテーションを挿入します。

  2. PanelCategoryインターフェイスを実装します。

これらの手順の両方を以下で説明します。

@Componentアノテーションの挿入

クラスの宣言のすぐ上に、次のアノテーションを挿入します。

@Component(
immediate = true,
property = {
"panel.category.key=" + [Panel Category Key],
"panel.category.order:Integer=[int]"
},
service = PanelCategory.class
)

property要素は、カテゴリに割り当てる必要がある2つのプロパティを指定します。panel.category.keyは、カスタムカテゴリの親カテゴリを指定します。割り当てる一般的な親カテゴリは、PanelCategoryKeysクラスにあります。たとえば、コントロールパネルで子カテゴリを作成する場合、PanelCategoryKeys.CONTROL_PANELを割り当てることができます。同様に、コントロールパネルやサイト管理などのルートカテゴリを作成する場合は、PanelCategoryKeys.ROOTを割り当てることができます。

panel.category.order:Integerプロパティは、カテゴリが表示される順序を指定します。数値(整数)が大きいほど、親に割り当てられている他の兄弟カテゴリの中であなたのカテゴリのリスト順が低くなります。

最後に、service要素でPanelCategory.classサービスを指定する必要があります。UserPanelCategoryクラスに対する同様の@Componentアノテーションの例を以下に示します。

@Component(
immediate = true,
property = {
"panel.category.key=" + PanelCategoryKeys.ROOT,
"panel.category.order:Integer=200"
},
service = PanelCategory.class
)

**注:**デフォルトメニューの既存のカテゴリの間にパネルカテゴリを挿入するには、既存のカテゴリのpanel.category.order:Integerプロパティを把握する必要があります。指定されたpanel.category.keyを持つデフォルトのカテゴリには、100から始まる100単位の番号が付けられています。 たとえば、製品メニューの3つのメインセクション(コントロールパネル、ユーザーメニュー、サイト管理)には、それぞれ100、200、300のpanel.category.order:Integerプロパティがあります。コントロールパネルとユーザーメニューの間に挿入された新しいパネルには、ROOTのpanel.category.keyと150のpanel.category.order:Integerが必要です。

PanelCategoryインターフェイスの実装

PanelCategoryインターフェイスでは、次のメソッドを実装する必要があります。

  • getNotificationCount:パネルカテゴリに表示される通知の数を返します。
  • include:パネルカテゴリのボディをレンダリングします。
  • includeHeader:パネルカテゴリヘッダーをレンダリングします。
  • isActive:パネルが選択されているかどうか。
  • isPersistState:パネルカテゴリの状態をデータベースに保持するかどうか。これにより、メニューから移動するときにパネルカテゴリの状態が保存されます。

PanelCategoryインターフェイスをすでに実装している基本クラスを拡張する場合、実装する必要のあるメソッドの数を減らすことができます。これを行うための推奨される方法は、BasePanelCategoryまたはBaseJSPPanelCategory抽象クラスを拡張することです。通常、BasePanelCategoryは、カテゴリ名のみを表示する基本的なカテゴリ(コントロールパネルのカテゴリなど)向けに拡張されます。さらに複雑な機能を追加するには、PanelCategoryインターフェイスからinclude()またはincludeHeader()を実装することにより、任意のフロントエンドテクノロジーを使用してパネルにカスタムUIを提供できます。

フロントエンドテクノロジーとしてJSPを使用する場合は、メソッドinclude()およびincludeHeader()をすでに実装しているBaseJSPPanelCategoryという基本クラスを拡張します。これについては、以下で詳しく説明します。

**注:**このチュートリアルでは、JSPの例を使用して、パネルのカテゴリとアプリに機能を提供する方法を説明しています。ただし、JSPは、カテゴリ/アプリにフロントエンド機能を提供する唯一の方法ではありません。PanelCategoryを実装する独自のクラスを作成して、FreeMarkerなどの他のテクノロジーを使用できます。

コントロールメニューカテゴリの定義

カテゴリの作成に使用するフレームワークを確立したら、カスタムパネルカテゴリの作成に必要な他のメソッドを追加する必要があります。 前に学習したように、BasePanelCategoryおよびBaseJSPPanelCategory抽象クラスを拡張して、PanelCategoryを実装できます。

BasePanelCategory

パネルカテゴリに名前のようなシンプルなものが必要な場合は、BasePanelCategoryを拡張するだけで十分でしょう。たとえば、ControlPanelCategoryBasePanelCategoryを拡張し、getLabelメソッドを指定してパネルカテゴリ名を設定および表示します。

@Override
public String getLabel(Locale locale) {
return LanguageUtil.get(locale, "control-panel");
}

BaseJSPPanelCategory

より複雑な機能が必要な場合は、BaseJSPPanelCategoryを拡張し、JSPを使用してパネルカテゴリをレンダリングします。たとえば、SiteAdministrationPanelCategorygetHeaderJspPathおよびgetJspPathメソッドを指定します。レンダリングするUIを使用してJSPを作成し、次のようなメソッドでそのパスを指定できます。

@Override
public String getHeaderJspPath() {
return "/sites/site_administration_header.jsp";
}

@Override
public String getJspPath() {
return "/sites/site_administration_body.jsp";
}

一方のJSPはパネルカテゴリのヘッダー(パネルが折りたたまれたときに表示される)をレンダリングし、もう一方のJSPはそのボディ(パネルを展開したときに表示される)をレンダリングします。

JSPファイルをロードするサーブレットコンテキストも指定する必要があります。これがOSGiモジュール内にある場合は、bnd.bndファイルがWebコンテキストパスを定義していることを確認してください。

Bundle-SymbolicName: com.sample.my.module.web
Web-ContextPath: /my-module-web

次に、以下のようにモジュールのシンボル名を使用してサーブレットコンテキストを参照します。

@Override
@Reference(
target = "(osgi.web.symbolicname=com.sample.my.module.web)",
unbind = "-"
)
public void setServletContext(ServletContext servletContext) {
super.setServletContext(servletContext);
}

製品メニューに表示するカスタムパネルカテゴリを作成できました。多くの場合、パネルカテゴリには、ユーザーがアクセスできるようにパネルアプリが保持されます。次に、パネルアプリをパネルカテゴリに追加する方法を学習します。

« 製品メニューのカスタマイズカスタムパネルアプリの追加 »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています