タグライブラリタグなどの一部の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を使用してインラインコンテンツをオーバーライドする方法は次のとおりです。
-
JSPをデプロイするためのカスタムJSPバッグを作成します。JSPを保存しているモジュールフォルダをメモします。デフォルトのフォルダは
[your module]/src/main/resources/META-INF/jsps/
です。注:JSPはどこでも展開できますが、カスタムJSPバッグモジュールを使用すると、簡単にビルドおよびデプロイできます。
-
Liferay DXPのソースコードをダウンロードするか、GitHub (Liferay Portal CE)でソースコードを参照します。
-
カスタマイズしているタグをオーバーライドする
.jsp.readme
ファイルのソースコードを検索します。注:
-ext.jsp.readme
で終わるファイルを使用すると、既存のコンテンツの先頭に新しいコンテンツを追加できます。 たとえば、Liferay DXPアプリケーションのportal-web/docroot/html/common/themes
フォルダ内のbottom-test.jsp.readme
、bottom-ext.jsp.readme
、body_top-ext.jsp.readme
、およびbody_bottom-ext.jsp.readme
ファイルがあります。 -
.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
-
現在のUIコンテンツとロジックを把握して、適切にオーバーライドできるようにします。たとえば、タグライブラリのタグコンテンツロジックは、
util-taglib/src/com/liferay/taglib/[tag library]/
の下のそれぞれの*Tag.java
ファイルにあります。 -
置き換えようとしている現在のインラインロジックを念頭に置いて、新しいロジックを開発します。
-
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
クラスのprocessStart
とprocessEnd
メソッドは、現在のインラインコンテンツを実装しています。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;
}
上記のコードは以下の動作を実行します:
-
<fieldset class=\"fieldset
開始タグを書き込みます。 -
CSSクラス名属性を書き込みます。
-
タグにIDがある場合は、属性として
id
を追加します。 -
タグの動的属性(マップ)を書き込みます。
-
開始
fieldset
タグを閉じます。 -
タグの
label
属性を取得します。 -
開始
legend
要素を書き込みます。 -
getLocalizeLabel()
を使用して、ローカライズされたラベルをlegend
に追加します。 -
(
getHelpMessage()
から取得した)ヘルプメッセージがある場合は、icon-help-tag
に書き込みます。 -
終了
legend
タグを書き込みます。 -
列属性がある場合は、
<div class=\"row\">
と書き込みます。それ以外の場合は、<div class=\"\">
と書き込みます。
カスタムJSPで現在のロジックを複製すると、カスタマイズ用にタグを適切に設定できます。fieldset
のinit.jsp
は、開始タグの作成に必要なすべての変数を初期化します。start.jsp
内で変数を使用できます。start.jsp
のJSPコードに変換された(start.jsp.readme
から名前が変更された)FieldsetTag
のprocessStart
メソッドのロジックは、以下のようになります。
<%@ 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
タグは以前と同じようにレンダリングされます。FieldsetTag
のprocessStart
メソッドと同じロジックを使用しているため、これは予想どおりです。
fieldset
開始ロジックはカスタマイズ可能です。これが機能するかどうかをテストするには、fieldset
タグの開始ロジックの末尾の前にアスタリスクで囲まれた単語testを出力します。この行をstart.jsp
の最後のdiv
タグの前に挿入します。
<c:out value="**********test**********"/>
JSPを再度デプロイし、ページを更新して、fieldset
のフィールドの上に出力されたテキストを確認します。
Liferayの.jsp.readme
ファイルを使用して、特定のLiferay DXPコアのインラインコンテンツをオーバーライドする方法が分かりました。