モデルヒントの追加
Service Builderを使用してモデルエンティティを定義したら、ユーザーがそのデータを入力する方法を改善したい場合があります。 モデルヒントは、エンティティデータの制限とその他のフォーマットを指定します。 たとえば、モデルヒントでは、将来のみ選択可能な日付を含むカレンダーフィールドを定義できます。
モデルヒントは、portlet-model-hints.xmlというファイルで定義します。 portlet-model-hints.xmlファイルは、サービスモジュールのsrc/main/resources/META-INFフォルダに入ります。
モデルヒントは次の2つのことを定義します。
-
エンティティがユーザーに提示される方法
-
データベース列のサイズ
Liferayはフォーム項目をレンダリングするときに、構成に基づいてフォームの入力フィールドをカスタマイズします。
依存性インジェクターとして Spring を選択した場合、Service Builder はサービス モジュールの src/main/resources/META-INF フォルダーにいくつかの XML 構成ファイルを生成します。 Service Builderは、これらのファイルのほとんどを使用して、SpringおよびHibernateの構成を管理します。 SpringまたはHibernateの構成ファイルは変更しないでください。それらへの変更は、Service Builderの実行時に上書きされます。 ただし、 portlet-model-hints.xml ファイルは安全に編集できます。
例として、 Blogs アプリ サービス モジュールの モデル ヒント ファイルを考えてみましょう。
<?xml version="1.0"?>
<model-hints>
<model name="com.liferay.blogs.model.BlogsEntry">
<field name="mvccVersion" type="long" />
<field name="ctCollectionId" type="long" />
<field name="uuid" type="String" />
<field name="externalReferenceCode" type="String" />
<field name="entryId" type="long" />
<field name="groupId" type="long" />
<field name="companyId" type="long" />
<field name="userId" type="long" />
<field name="userName" type="String" />
<field name="createDate" type="Date" />
<field name="modifiedDate" type="Date" />
<field name="title" type="String">
<hint name="max-length">255</hint>
<sanitize content-type="text/plain" modes="ALL" />
<validator name="required" />
</field>
<field name="subtitle" type="String">
<hint-collection name="TEXTAREA" />
</field>
<field name="urlTitle" type="String">
<hint name="max-length">255</hint>
</field>
<field name="description" type="String">
<hint-collection name="TEXTAREA" />
<hint name="display-width">350</hint>
</field>
<field name="content" type="String">
<hint-collection name="CLOB" />
<sanitize content-type="text/html" modes="ALL" />
</field>
<field name="displayDate" type="Date" />
<field name="allowPingbacks" type="boolean" />
<field name="allowTrackbacks" type="boolean" />
<field name="trackbacks" type="String">
<hint-collection name="CLOB" />
</field>
<field name="coverImageCaption" type="String">
<hint-collection name="TEXTAREA" />
<sanitize content-type="text/html" modes="ALL" />
</field>
<field name="coverImageFileEntryId" type="long" />
<field name="coverImageURL" type="String">
<hint-collection name="URL" />
</field>
<field name="smallImage" type="boolean" />
<field name="smallImageFileEntryId" type="long" />
<field name="smallImageId" type="long" />
<field name="smallImageURL" type="String">
<hint-collection name="URL" />
<hint name="display-width">210</hint>
</field>
<field name="lastPublishDate" type="Date" />
<field name="status" type="int" />
<field name="statusByUserId" type="long" />
<field name="statusByUserName" type="String" />
<field name="statusDate" type="Date" />
</model>
</model-hints>
ルートレベルの要素はmodel-hintsです。 モデルエンティティは、model-hints要素のmodelサブ要素によって表されます。 各model要素には、完全修飾クラス名を指定するname属性が必要です。 モデルには、エンティティの列を表す field要素があります。 最後に、field要素には名前とタイプが必要です。 各field要素の名前とタイプは、サービスモジュールのservice.xmlファイルのエンティティの列に指定された名前とタイプにマップされます。 Service Builderは、service.xmlに基づいて、これらすべての要素を生成します。
フィールドにヒントを追加するには、hint子要素を追加します。 たとえば、display-width hintを追加して、フィールドの表示に使用するピクセル幅を指定できます。 デフォルトのピクセル幅は350です。 50ピクセルのStringフィールドを表示するには、display-widthという名前のhint要素をネストして値50を指定します。
フィールドのヒントの効果を確認するには、 Service Builder を再度実行 し、 モジュールを再デプロイします。 display-widthを変更しても、ユーザーがnameフィールドに入力できる文字数は制限されないことに注意してください。入力フォームのフィールドの幅のみが制御されます。
モデルフィールドのデータベース列の最大サイズ(つまり、フィールドに保存できる最大文字数)を構成するには、max-lengthヒントを使用します。 デフォルトのmax-length値は、75文字です。 名前 フィールドを最大 100 文字まで保持したい場合は、そのフィールドに 最大長 ヒントを追加します。
<field name="name" type="String">
<hint name="display-width">50</hint>
<hint name="max-length">100</hint>
</field>
portlet-model-hints.xmlファイルを更新した後にService Builderを実行してプロジェクトを再デプロイすることを忘れないでください。
モデルヒントのタイプ
次の表に、使用可能なポートレットモデルのヒントを示します。
モデルヒントの値と説明
| 名前 | 値のタイプ | 説明 | デフォルト |
|---|---|---|---|
auto-escape | ブール値 | HtmlUtil.escapeを介してテキスト値をエスケープするかどうかを設定します | true |
autoSize | ブール値 | スクロール可能なテキストエリアにフィールドを表示します | false |
day-nullable | ブール値 | 日付フィールドで日をnullにすることができます | false |
default-value | 文字列 | aui taglibを使用してレンダリングされたフォーム項目のデフォルト値を設定します | (空のString) |
display-height | 整数 | aui taglibを使用してレンダリングされたフォーム項目の表示高さを設定します | 15 |
display-width | 整数 | aui taglibを使用してレンダリングされたフォーム項目の表示幅を設定します | 350 |
editor | ブール値 | 入力用のエディターを提供するかどうかを設定します | false |
max-length | 整数 | SQLファイル生成の最大列サイズを設定します | 75 |
month-nullable | ブール値 | 日付フィールドで月をnullにすることができます | false |
secret | ブール値 | ユーザーが入力した文字を非表示にするかどうかを設定します | false |
show-time | ブール値 | 日付とともに時刻を表示するかどうかを設定します | true |
upper-case | ブール値 | すべての文字を大文字に変換します | false |
year-nullable | ブール値 | 日付フィールドの年をnullにすることができます | false |
year-range-delta | 整数 | aui taglibでレンダリングされた日付フィールドに今日の日付から何年後まで表示するかを年数で指定します | 5 |
year-range-future | ブール値 | 将来の日付を含めるかどうかを設定します | true |
year-range-past | ブール値 | 過去の日付を含めるかどうかを設定します | true |
aui taglibは完全にサポートされており、廃止予定のAlloyUI(JavaScriptライブラリ)とは関係ありません。
1つのフォームでClayタグとauiタグを組み合わせて使用できます。 ただし、モデルヒントはauiタグにのみ影響します。
Liferay DXP/Portal には独自のモデルヒントファイル portal-model-hints.xmlがあることに注意してください。 これは、portal-impl.jarのMETA-INFフォルダにあります。 このファイルには多くのヒントの例が含まれているため、portlet-model-hints.xmlファイルを作成するときに参照できます。
デフォルトのヒント
default-hints要素を使用して、モデルのすべてのフィールドに適用するヒントのリストを定義できます。 たとえば、モデル要素内に次の要素を追加すると、各フィールドに300ピクセルのdisplay-widthが適用されます。
<default-hints>
<hint name="display-width">300</hint>
</default-hints>
ヒントコレクション
model-hintsのルートレベル要素内にhint-collection要素を定義して、一緒に適用するヒントのリストを定義できます。 ヒントコレクションには名前が必要です。 たとえば、Liferayのportal-model-hints.xmlは、次のヒントコレクションを定義しています。
<hint-collection name="CLOB">
<hint name="max-length">2000000</hint>
</hint-collection>
<hint-collection name="EDITOR">
<hint name="editor">true</hint>
<hint name="max-length">2000000</hint>
</hint-collection>
<hint-collection name="EMAIL-ADDRESS">
<hint name="max-length">254</hint>
</hint-collection>
<hint-collection name="HOSTNAME">
<hint name="max-length">200</hint>
</hint-collection>
<hint-collection name="SEARCHABLE-DATE">
<hint name="month-nullable">true</hint>
<hint name="day-nullable">true</hint>
<hint name="year-nullable">true</hint>
<hint name="show-time">false</hint>
</hint-collection>
<hint-collection name="TEXTAREA">
<hint name="display-height">105</hint>
<hint name="display-width">500</hint>
<hint name="max-length">4000</hint>
</hint-collection>
<hint-collection name="URL">
<hint name="max-length">4000</hint>
</hint-collection>
ヒントコレクションの名前を参照することにより、モデルフィールドにヒントコレクションを適用できます。 たとえば、 model-hints 要素で上記のような SEARCHABLE-DATE コレクションを定義した場合、コレクションを名前で参照する hint-collection 要素を使用して、それをモデルの日付フィールドに適用できます。
<field name="date" type="Date">
<hint-collection name="SEARCHABLE-DATE" />
</field>
プロジェクトでいくつかのモデルヒントを使用するとします。 まずは、コメントフィールドに入力するためのエディターをユーザーに提供することから始めます。 同じヒントを複数のエンティティに適用するには、それをヒントコレクションとして定義します。 次に、各エンティティのヒントコレクションを参照します。
ヒントコレクションを定義するには、portlet-model-hints.xmlファイルのmodel-hintsルート要素内にhint-collection要素を追加します。 以下に例を示します。
<hint-collection name="COMMENT-TEXTAREA">
<hint name="display-height">105</hint>
<hint name="display-width">500</hint>
<hint name="max-length">4000</hint>
</hint-collection>
特定のフィールドのヒントコレクションを参照するには、フィールドのfield要素内にhint-collection要素を追加します。
<field name="comment" type="String">
<hint-collection name="COMMENT-TEXTAREA" />
</field>
ヒントコレクションを定義し、ヒントコレクションの参照を追加したら、サービスを再構築し、プロジェクトを再デプロイして、ヒントコレクションで定義されたヒントが有効になっていることを確認します。
これで、モデルの入力フィールドの表示方法だけでなく、データベーステーブルの列サイズを設定することもできるようになりました。 ヒントを整理したり、個々のヒントをフィールドに直接挿入したり、モデルのすべてのフィールドにデフォルトのヒントのセットを適用したり、これらのスコープのいずれかに適用するヒントのコレクションを定義したりできます。