$ObjectType を使用したスキーマ詳細への動的参照
$ObjectType グローバル変数を使用すると、組織のオブジェクトに関するさまざまなスキーマ情報にアクセスできます。たとえば、オブジェクトの項目の名前、表示ラベル、データ型の参照に使用します。
$ObjectType は、「深い」グローバル変数であり、次のような「二重に動的」な参照に使用することができます。
次の例では、動的グローバル変数を使用して一般的なオブジェクトビューアを提供します。最初に、DynamicObjectHandler という名前で新しいコントローラ (拡張ではない) を作成します。
このコントローラでは、次の点に留意してください。
- Visualforce コンポーネントはコントローラ拡張を使用できません。代わりに、このクラスはコントローラとして記述されます。コンストラクタは定義されないため、このクラスではデフォルトのコンストラクタが使用されます。
- オブジェクトのメタデータを収集するには、コントローラでオブジェクトを把握している必要があります。Visualforce コンストラクタは引数を取れないため、インスタンス化時に目的のオブジェクトを知る方法がありません。代わりに、公開プロパティ obj を設定することで、メタデータ検出がトリガされます。
- このクラスでは複数のメソッドが、前の例より若干異なる方法でシステムスキーマ検出メソッドを使用しています。
次の例は、オブジェクトに関するスキーマ情報と、照会されるレコードの特定の値を表示する Visualforce コンポーネントです。次のコードを使用し、DynamicObjectViewer という名前で新規 Visualforce コンポーネントを作成します。
次の点を確認してください。
- このコンポーネントを使用するページでは、レコードを検索する必要があります。これを行うには、そのオブジェクトに標準コントローラを使用し、URL でレコードの Id を指定します。たとえば、https://<Salesforce_instance>/apex/DynamicContactPage?id=003D000000Q5GHE です。
- 選択したレコードはすぐにコンポーネントの obj 属性に渡されます。このパラメータは、すべてのオブジェクトメタデータ検出に使用されます。
- この 3 つの二重に動的な参照が、$ObjectType[objectType].fields[f] で開始し、各項目のメタデータを表示するのに対し、通常の動的参照は項目の実際の値を表示します。
- データ値の場合、値は、より自然な {!rec[f]} (コンポーネントへのパラメータ) ではなく {!obj[f]} で、コントローラ内で getter メソッドが使用されます。その理由は単純で、obj 属性はすべての項目のデータを読み込むように更新されていますが、rec は標準コントローラで読み込まれたときと同じ状態のままであり、読み込まれるのが Id 項目のみであるためです。
最後に、新しいコンポーネントを使用して、任意の数の単純な Visualforce ページを作成できます。このページは、コンポーネントを使用して、次の 2 つのページのようなレコード詳細およびスキーマ情報ページを表示します。