項目セットの使用
動的バインドを使用して Visualforce ページに項目セットを表示することができます。項目セットとは、項目をグループ化したものです。たとえば、ユーザの名、ミドルネーム、姓、肩書を示す項目を 1 つの項目セットにして持つことができます。そのページを管理パッケージに追加すると、システム管理者は項目セット内の項目の追加、削除、並び替えを行って、コードを変更せずに Visualforce ページ上に表示する項目を変更できます。項目セットは、API バージョン 21.0 以降の Visualforce ページに使用できます。1 ページで最大 50 個の項目セットを参照できます。
Visualforce での項目セットの使用
項目セットを Visualforce で直接参照するには、$ObjectType グローバル変数をキーワード FieldSets と組み合わせます。たとえば、Contact オブジェクトに 3 つの項目を表示する properNames という項目セットがある場合、Visualforce ページは次の反復によって項目データを参照できます。
1<apex:page standardController="Contact">
2 <apex:repeat value="{!$ObjectType.Contact.FieldSets.properNames}" var="f">
3 <apex:outputText value="{!Contact[f]}" /><br/>
4 </apex:repeat>
5</apex:page>次の項目セット内の項目の特殊なプロパティを使用して、項目の表示ラベルやデータ型など、追加情報を表示するように選択することもできます。
たとえば、properNames の項目の表示ラベルとデータ型には次のようにアクセスできます。
| プロパティ名 | 説明 |
|---|---|
| DBRequired | オブジェクトでその項目が必須かどうか |
| FieldPath | 項目の範囲情報のリスト |
| Label | 項目の UI 表示ラベル |
| Required | 項目セットでその項目が必須かどうか |
| Type | 項目のデータ型 |
1<apex:page standardController="Contact">
2 <apex:pageBlock title="Fields in Proper Names">
3 <apex:pageBlockTable value="{!$ObjectType.Contact.FieldSets.properNames}" var="f">
4 <apex:column value="{!f}">
5 <apex:facet name="header">Name</apex:facet>
6 </apex:column>
7 <apex:column value="{!f.Label}">
8 <apex:facet name="header">Label</apex:facet>
9 </apex:column>
10 <apex:column value="{!f.Type}" >
11 <apex:facet name="header">Data Type</apex:facet>
12 </apex:column>
13 </apex:pageBlockTable>
14 </apex:pageBlock>
15</apex:page>この Visualforce ページが管理パッケージに追加され、配布された場合、登録者は properNames 項目セットを編集できます。Visualforce ページを生成するロジックは変わりませんが、表示は各登録者の実装に応じて異なります。管理パッケージの項目セットを参照するには、項目セットの先頭に組織の名前空間を追加する必要があります。上記のマークアップを使用すると、properNames が Spectre という組織のものである場合、項目セットは次のように参照されます。
1{!$ObjectType.Contact.FieldSets.Spectre__properNames}Apex での項目セットの使用
Visualforce ページで標準コントローラを使用するときには、項目セットの項目は自動的に読み込まれます。カスタムコントローラを使用する場合、ページの SOQL クエリに必須項目を追加する必要があります。Apex は、項目セットとそれが含む項目を検出できる、Schema.FieldSet と Schema.FieldSetMember の 2 つの Schema オブジェクトを提供します。これら 2 つのシステムクラスについての詳細は、『Force.com Apex コード開発者ガイド』の「FieldSet クラス」を参照してください。
サンプル: Visualforce ページへの項目セットの表示
このサンプルでは、Schema.FieldSet および Schema.FieldSetMember メソッドを使用して、Merchandise カスタムオブジェクトの Dimensions 項目セットに含まれるすべての項目を動的に取得します。取得した項目のリストを使用して、これらの項目を表示に使用できるようにする SOQL クエリを作成します。Visualforce ページは、MerchandiseDetails クラスをコントローラとして使用します。
1public class MerchandiseDetails {
2
3 public Merchandise__c merch { get; set; }
4
5 public MerchandiseDetails() {
6 this.merch = getMerchandise();
7 }
8
9 public List<Schema.FieldSetMember> getFields() {
10 return SObjectType.Merchandise__c.FieldSets.Dimensions.getFields();
11 }
12
13 private Merchandise__c getMerchandise() {
14 String query = 'SELECT ';
15 for(Schema.FieldSetMember f : this.getFields()) {
16 query += f.getFieldPath() + ', ';
17 }
18 query += 'Id, Name FROM Merchandise__c LIMIT 1';
19 return Database.query(query);
20 }
21}上記のコントローラを使用する Visualforce ページは単純です。
上記のマークアップは、フォーム上の項目を必須項目として示す必要があるかどうかを判定するために使用する数式です。項目セット内の項目は、項目セット定義または項目自体の定義によって必須にすることができます。この数式では両方を処理します。
1<apex:page controller="MerchandiseDetails">
2 <apex:form >
3
4 <apex:pageBlock title="Product Details">
5 <apex:pageBlockSection title="Product">
6 <apex:inputField value="{!merch.Name}"/>
7 </apex:pageBlockSection>
8
9 <apex:pageBlockSection title="Dimensions">
10 <apex:repeat value="{!fields}" var="f">
11 <apex:inputField value="{!merch[f.fieldPath]}"
12 required="{!OR(f.required, f.dbrequired)}"/>
13 </apex:repeat>
14 </apex:pageBlockSection>
15
16 </apex:pageBlock>
17
18 </apex:form>
19</apex:page>項目セットの考慮事項
項目セットに追加された項目は、次の 2 つのカテゴリのいずれかに入れることができます。
- 項目が [項目セットで使用可能] とマークされている場合、項目は項目セット内に存在しますが、開発者はパッケージ化された Visualforce ページ上でそれを表示していません。システム管理者は、その項目を [利用可] 列から [項目セットで] 列に移動することによって、その項目セットをリリースした後、表示できます。
- 項目が [項目セットで] とマークされている場合、開発者はデフォルトで、パッケージ化された Visualforce ページ上でその項目を表示しています。システム管理者は、項目を [項目セットで] 列から削除して項目セットをリリースした後、ページから項目を削除できます。
開発者が、表示される項目をリストする順序によって、Visualforce ページ上での表示���序が決まります。