JSPを使用したインラインコンテンツのオーバーライド

タグライブラリタグなどの一部のLiferay DXPコアコンテンツは、.readmeで終わるJSPを使用しないとオーバーライドできません。サフィックス.readmeはそれらを見つけやすくするものです。 これらのJSPからのコードはインライン化され(Liferay DXP Javaソースファイルに組み込まれ)、パフォーマンスが向上しました。Liferay DXPは、サフィックス.readmeが付いたJSPファイルを無視します。JSP .readmeファイルにコードを追加して、.readmeサフィックスを削除すると、Liferay DXPはコアのインラインコンテンツの代わりにそのJSPを使用します。このチュートリアルでは、これらのカスタマイズを行う方法を示します。

重要:このタイプのカスタマイズは最後の手段です。この実装の性質によりオーバーライドが壊れる可能性があり、コア機能がそれとともに機能しなくなる可能性があります。Liferayは、JSP .readmeファイルを使用してオーバーライドされたコンテンツのアップグレードを保証できません。

警告:Liferay DXPタグライブラリタグを変更すると、Liferay DXPのインストール時にそのタグのすべての使用が影響を受けます。

JSPを使用してインラインコンテンツをオーバーライドする方法は次のとおりです。

  1. JSPをデプロイするためのカスタムJSPバッグを作成します。JSPを保存しているモジュールフォルダをメモします。デフォルトのフォルダは[your module]/src/main/resources/META-INF/jsps/です。

    :JSPはどこでも展開できますが、カスタムJSPバッグモジュールを使用すると、簡単にビルドおよびデプロイできます。

  2. Liferay DXPのソースコードをダウンロードするか、GitHub (Liferay Portal CE)でソースコードを参照します。

  3. カスタマイズしているタグをオーバーライドする.jsp.readmeファイルのソースコードを検索します。

    -ext.jsp.readmeで終わるファイルを使用すると、既存のコンテンツの先頭に新しいコンテンツを追加できます。 たとえば、Liferay DXPアプリケーションのportal-web/docroot/html/common/themesフォルダ内のbottom-test.jsp.readmebottom-ext.jsp.readmebody_top-ext.jsp.readme、およびbody_bottom-ext.jsp.readmeファイルがあります。

  4. .jsp.readmeファイルをプロジェクトにコピーし、.readmeサフィックスをドロップします。 Liferay DXPが.jsp.readmeファイルに使用するのと同じ相対ファイルパスを使用します。 たとえば、Liferay DXP内のファイルが以下の場合:

    portal-web/docroot/html/taglib/aui/fieldset/start.jsp.readme
    

    以下のファイルパスを使用します。

    [your module]/src/main/resources/META-INF/jsps/html/taglib/aui/fieldset/start.jsp
    
  5. 現在のUIコンテンツとロジックを把握して、適切にオーバーライドできるようにします。たとえば、タグライブラリのタグコンテンツロジックは、util-taglib/src/com/liferay/taglib/[tag library]/の下のそれぞれの*Tag.javaファイルにあります。

  6. 置き換えようとしている現在のインラインロジックを念頭に置いて、新しいロジックを開発します。

  7. JSPをデプロイします。

Liferay DXPは、現在のインラインロジックの代わりにJSPを使用します。オーバーライドの例を確認する場合は、引き続きこのチュートリアルを進めてください。これで、.jsp.readmeファイルを変更してコアのインラインコンテンツをオーバーライドすることができました。

例:フィールドセットTaglibタグのオーバーライド

この例は、liferay:auiタグライブラリのfieldsetタグの変更を示しています。portal-web/docroot/html/taglib/aui/fieldsetでLiferay DXP Webアプリケーションまたはソースコードを参照すると、次のファイルが見つかります。

  • start.jsp.readme
  • end.jsp.readme

これらは、fieldsetタグの開始と終了を作成するロジックをオーバーライドできます。 FieldsetTag.javaクラスのprocessStartprocessEndメソッドは、現在のインラインコンテンツを実装しています。processStartメソッドは以下のとおりです。

@Override
protected int processStartTag() throws Exception {
JspWriter jspWriter = pageContext.getOut();

jspWriter.write("<fieldset class=\"fieldset ");
jspWriter.write(GetterUtil.getString(getCssClass()));
jspWriter.write("\" ");

String id = getId();

if (id != null) {
jspWriter.write("id=\"");
jspWriter.write(id);
jspWriter.write("\" ");
}

jspWriter.write(
InlineUtil.buildDynamicAttributes(getDynamicAttributes()));

jspWriter.write(StringPool.GREATER_THAN);

String lable = getLabel();

if (lable != null) {
jspWriter.write(
"<legend class=\"fieldset-legend\"><span class=\"legend\">");

MessageTag messageTag = new MessageTag();

messageTag.setKey(lable);
messageTag.setLocalizeKey(getLocalizeLabel());

messageTag.doTag(pageContext);

String helpMessage = getHelpMessage();

if (helpMessage != null) {
IconHelpTag iconHelpTag = new IconHelpTag();

iconHelpTag.setMessage(helpMessage);

iconHelpTag.doTag(pageContext);
}

jspWriter.write("</span></legend>");
}

if (getColumn()) {
jspWriter.write("<div class=\"row\">");
}
else {
jspWriter.write("<div class=\"\">");
}

return EVAL_BODY_INCLUDE;
}

上記のコードは以下の動作を実行します:

  1. <fieldset class=\"fieldset開始タグを書き込みます。

  2. CSSクラス名属性を書き込みます。

  3. タグにIDがある場合は、属性としてidを追加します。

  4. タグの動的属性(マップ)を書き込みます。

  5. 開始fieldsetタグを閉じます。

  6. タグのlabel属性を取得します。

  7. 開始legend要素を書き込みます。

  8. getLocalizeLabel()を使用して、ローカライズされたラベルをlegendに追加します。

  9. getHelpMessage()から取得した)ヘルプメッセージがある場合は、icon-help-tagに書き込みます。

  10. 終了legendタグを書き込みます。

  11. 列属性がある場合は、<div class=\"row\">と書き込みます。それ以外の場合は、<div class=\"\">と書き込みます。

カスタムJSPで現在のロジックを複製すると、カスタマイズ用にタグを適切に設定できます。fieldsetinit.jspは、開始タグの作成に必要なすべての変数を初期化します。start.jsp内で変数を使用できます。start.jspのJSPコードに変換された(start.jsp.readmeから名前が変更された)FieldsetTagprocessStartメソッドのロジックは、以下のようになります。

<%@ include file="/html/taglib/aui/fieldset/init.jsp" %>

<fieldset class="fieldset <%= cssClass %>" <%= Validator.isNotNull(id) ?"id=\"" + id + "\"" : StringPool.BLANK %> <%= InlineUtil.buildDynamicAttributes(dynamicAttributes) %>>
<c:if test="<%= Validator.isNotNull(label) %>">
<legend class="fieldset-legend">
<span class="legend">
<liferay-ui:message key="<%= label %>" localizeKey="<%= localizeLabel %>" />

<c:if test="<%= Validator.isNotNull(helpMessage) %>">
<liferay-ui:icon-help message="<%= helpMessage %>" />
</c:if>
</span>
</legend>
</c:if>

<div class="<%= column ?"row" : StringPool.BLANK %>">

ヒント*Tag.javaファイルの履歴により、インライン化された元のJSPコードが明らかになる可能性があります。たとえば、fieldsetタグのstart.jspからのロジックはこのコミットでインライン化されました。

start.jspをデプロイすると、fieldsetタグは以前と同じようにレンダリングされます。FieldsetTagprocessStartメソッドと同じロジックを使用しているため、これは予想どおりです。

図1:Liferay DXPのホームページの検索およびサインインコンポーネントはfieldsetにあります。

fieldset開始ロジックはカスタマイズ可能です。これが機能するかどうかをテストするには、fieldsetタグの開始ロジックの末尾の前にアスタリスクで囲まれた単語testを出力します。この行をstart.jspの最後のdivタグの前に挿入します。

<c:out value="**********test**********"/>

JSPを再度デプロイし、ページを更新して、fieldsetのフィールドの上に出力されたテキストを確認します。

図2:fieldsetのネストされたフィールドの前に、アスタリスクで囲まれたtest が出力されます。

Liferayの.jsp.readmeファイルを使用して、特定のLiferay DXPコアのインラインコンテンツをオーバーライドする方法が分かりました。

関連トピック

Customizing JSPs with Dynamic Includes

JSP Overrides Using Portlet Filters

« カスタムJSPバッグを使用したJSPのオーバーライドLiferayサービスのオーバーライド(サービスラッパー) »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています