Documentation

Documentation Menu

モデルヒントの追加

Service Builderを使用してモデルエンティティを定義したら、ユーザーがそのデータを入力する方法を改善したい場合があります。 モデルヒントは、エンティティデータの制限とその他のフォーマットを指定します。 たとえば、モデルヒントでは、将来のみ選択可能な日付を含むカレンダーフィールドを定義できます。

モデルヒントは、portlet-model-hints.xmlというファイルで定義します。 portlet-model-hints.xmlファイルは、サービスモジュールのsrc/main/resources/META-INFフォルダに入ります。

モデルヒントは次の2つのことを定義します。

  1. エンティティがユーザーに提示される方法

  2. データベース列のサイズ

Liferayはフォーム項目をレンダリングするときに、構成に基づいてフォームの入力フィールドをカスタマイズします。

注釈

依存性注入としてSpringを選択した場合、Service Builderは、サービスモジュールの src/main/resources/META-INFフォルダに多数のXML構成ファイルを生成します。 Service Builderは、これらのファイルのほとんどを使用して、SpringおよびHibernateの構成を管理します。 SpringまたはHibernateの構成ファイルは変更しないでください。それらへの変更は、Service Builderの実行時に上書きされます。 ただし、portlet-model-hints.xml ファイルは安全に編集できます。

例として、 ブログアプリサービスモジュールの モデルヒントファイルを考えてみましょう。

<?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を指定します。

フィールドに対するヒントの効果を確認するには、 サービスビルダーを再度実行 して、 モジュールを再デプロイ します。display-widthを変更しても、ユーザーがnameフィールドに入力できる文字数は制限されないことに注意してください。入力フォームのフィールドの幅のみが制御されます。

モデルフィールドのデータベース列の最大サイズ(つまり、フィールドに保存できる最大文字数)を構成するには、max-lengthヒントを使用します。 デフォルトのmax-length値は、75文字です。 nameフィールドを最大100文字まで保持する場合は、そのフィールドにmax-lengthヒントを追加します。

<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タグにのみ影響します。

LiferayDXP/Portalには独自のモデルヒントのファイル portal-model-hints.xml があることに注意してください。 これは、portal-impl.jarMETA-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>

ヒントコレクションを定義し、ヒントコレクションの参照を追加したら、サービスを再構築し、プロジェクトを再デプロイして、ヒントコレクションで定義されたヒントが有効になっていることを確認します。

これで、モデルの入力フィールドの表示方法だけでなく、データベーステーブルの列サイズを設定することもできるようになりました。 ヒントを整理したり、個々のヒントをフィールドに直接挿入したり、モデルのすべてのフィールドにデフォルトのヒントのセットを適用したり、これらのスコープのいずれかに適用するヒントのコレクションを定義したりできます。