動的コンポーネントの作成と表示
ページ上の 2 つの部分に動的 Visualforce コンポーネントを埋め込むことができます。
- ページの任意の場所に <apex:dynamicComponent> タグを追加する。このタグは、動的コンポーネントのプレースホルダとして機能します。
- コントローラまたはコントローラ拡張内の動的 Visualforce コンポーネントを開発する。
<apex:dynamicComponent> タグには、componentValue という必須属性が 1 つあります。この属性は、動的コンポーネントを返す Apex メソッドの名前を受け入れます。たとえば、送信フォームの期限が過ぎたら、異なるセクションヘッダーのタイトルを動的に生成したい場合、次のマークアップとコントローラコードを使用します。
1 ページに複数の <apex:dynamicComponent> コンポーネントを含めることができます。
各動的コンポーネントには、一連の共通メソッドおよびプロパティへのアクセス権があります。この一覧を確認するには、『Apex 開発者ガイド』の「コンポーネントクラス」の章を参照してください。
動的カスタムコンポーネント
カスタムコンポーネントを動的に使用すると、標準 Visualforce コンポーネントとまったく同じ動作をします。名前空間がカスタムコンポーネントの名前空間に変わるだけです。カスタムコンポーネントは、c 名前空間にあるため、次のように動的に作成することができます。
独自のコンポーネントの利便性のために、次のように名前空間を除外できます。
サードパーティがパッケージで提供するコンポーネントを使用する場合は、パッケージプロバイダの名前空間を使用します。
コンストラクタを使用して属性を渡す
プロパティを使用してコンポーネントの属性を設定する代わりに、コンストラクタを使用して 1 つ以上の属性のリストを渡すことができます。
属性がコンストラクタに定義されていない場合、コンポーネントのデフォルト値がその属性に使用されます。
プロパティを介してではなく、コンストラクタに属性を定義する必要があるコンポーネントが 2 つあります。
- レコードの Chatter 情報とコントロールを表示する場合、Component.Apex.Detail で、showChatter=true がそのコンストラクタに渡されている必要があります。それ以外の場合、この属性は常に false になります。
- ユーザが一度に複数のオプションを選択できるようにする場合は、Component.Apex.SelectList で、multiSelect=true がそのコンストラクタに渡されている必要があります���それ以外の場合、この値は常に false になります。
式および任意の HTML の定義
式の言語ステートメントを expressions プロパティを使用して追加できます。式のステートメントを渡すには、プロパティ名の前に expressions を付加します。静的マークアップと同様に、式は {! } 構文でラップする必要があります。次に例を示します。
有効な式には、標準オブジェクトやカスタムオブジェクトの項目を参照する式などがあります。次の例のようにグローバル変数と関数も使用できます。
式で値を渡すのは、それをサポートする属性でのみ有効です。expressions プロパティ以外で {! } を使用すると、式ではなく文字として解釈されます。
プレーン HTML を含めるには、Component.Apex.OutputText の escape プロパティを false に設定します。
ファセットの定義
式を定義する方法と同様に、ファセットは動的コンポーネントが使用できる特殊なプロパティとして機能します。次に例を示します。
ファセットについての詳細は、「コンポーネントファセットの使用のためのベストプラクティス」を参照してください。
子ノードの定義
childComponents プロパティを使用して、子ノードを動的 Visualforce コンポーネントに追加できます。childComponents プロパティは Component.Apex オブジェクトのリストへの参照として機能します。
次の例では、childComponents を使用して子入力ノードで <apex:form> を構築する方法を示します。
マークアップが次のように定義されている場合:
このマークアップは次の静的マークアップに相当します。
同等の静的マークアップでの要素の順序は、動的コンポーネントが getDynamicForm メソッドの Apex コードで宣言された順序ではなく、childComponents に追加された順序です。