標準オブジェクトでの動的参照の使用
アクセスする項目の既知のセットを使用して単純で再利用可能なページを構築するには、動的 Visualforce バインドを使用します。このアプローチには、どの項目がユーザの処理対象となるのかを容易にカスタマイズできるという利点があります。
次の 2 つの例は、説明のために意図的に簡略化されています。動的 Visualforce を十分に活用した高度な例は、「ユーザがカスタマイズ可能なページでの動的参照の使用」を参照してください。
単純な動的フォーム
次の例は、動的参照を使用する Visualforce ページを構築する最も簡単な方法を示します。
- DynamicAccountFieldsLister コントローラ拡張は、editableFields という文字列のリストを作成します。各文字列は、Account オブジェクト内の項目名に対応付けられます。
- editableFields リストはハードコードされていますが、項目はクエリや計算から特定したり、カスタム設定から読み取ったりすることが可能です。ハードコードされていない場合は、より動的な操作が提供されます。動的参照の利点は、このようなことが可能であることです。
- DynamicAccountEditor マークアップは、<apex:repeat> タグを使用して editableFields から返された文字列をループ処理します。
- <apex:inputField> タグは、Account の項目名を表す f 反復要素を参照して、editableFields 内の各項目を表示します。動的参照 {!Account[f]} が、実際に値をページに表示します。
標準コントローラによる動的参照の項目の読み込み
Visualforce は、ページの StandardController (または StandardSetController) で実行される SOQL クエリを自動的に最適化し、ページで実際に使用される項目のみを読み込みます。オブジェクトと項目への静的参照を含む Visualforce ページを作成する場合、項目とオブジェクトは前もって知っておく必要があります。ページを保存するときに、Visualforce はどのオブジェクトと項目を SOQL クエリに追加する必要があるかを判別して保存できます。この SOQL クエリを、後でページが要求されたときに StandardController が実行します。
動的参照は実行時に、StandardController が SOQL クエリを実行した後に評価されます。動的参照でのみ使用される項目は、自動的には読み込まれません。動的参照が後で評価されたとき、その項目は存在しないデータとして解決され、結果的に SOQL エラーになります。読み込み対象の項目と関連オブジェクトがわかるように、コントローラに追加情報を指定する必要があります。
これは、コントローラ拡張のインスタンス化時に読み込むすべての項目のリストがわかるページに適しています。項目のリストが、要求処理における後の時点まで判別できない場合は、コントローラで reset() をコールし、項目を追加できます。これにより、コントローラは修正されたクエリを送信することになります。この技法の例は、「ユーザがカスタマイズ可能なページでの動的参照の使用」を参照してください。
関連オブジェクトへの動的参照
この例では、ケースレコードの Visualforce ページを作成し、特定の項目を編集可能にします。表示される項目の一部は関連オブジェクトのもので、動的参照を使用してリレーションをトラバースする方法を示します。
- コントローラ拡張では、オブジェクトを表示できるようにコンストラクタが独自の SOQL クエリを実行します。これは、ページの StandardController がデフォルトでは関連項目を読み込まないためですが、カスタマイズした SOQL クエリが必要になる使用事例は数多くあります。クエリの結果は、プロパティ caseFieldList によってページで使用できるようになります。コンストラクタでクエリを実行するための要件はありません。プロパティの get メソッドに簡単に追加できます。
- SOQL クエリは読み込む項目を指定するため、単純な動的フォームでは必要だった addFields() を使用する必要はありません。
- SOQL クエリは実行時に作成されます。ユーティリティメソッドが項目名のリストを SOQL SELECT ステートメントでの使用に適した文字列に変換します。
- マークアップでは、フォーム項目は、<apex:repeat> を使用する項目名を反復処理し、項目名変数 cf を動的参照で使用して項目値を取得することで表示されます。各項目は、<apex:outputText> と <apex:inputText> の 2 つのコンポーネントで記述される可能性があります。これらのタグ上の表示属性が、2 つのどちらを実際に表示するかを制御します。項目名が文字列「Contact」を含む場合、情報は <apex:inputText> タグに表示され、含まない場合は <apex:outputText> に表示されます。
ユーザがカスタマイズ可能なページでの動的参照の使用
Visualforce 動的バインドの最大の利点は、オブジェクトでどの項目が使用可能かを知らなくてもページを作成できることです。次の例はこの機能を示しています。すべてのオブジェクトで必須の Name 項目を除き、Account オブジェクトの項目を一切 知らずにカスタマイズできる取引先のリストが表示されます。これは、Schema.SobjectType.Account.fields.getMap() を使用してオブジェクトに存在する項目のリストを取得し、Visualforce 動的参照を使用することで可能になります。
- 標準コントローラメソッドの addFields() および reset() が show() メソッドで使用されます。このメソッドにより、リストビューに戻ります。これらが必要なのは、表示する項目のリストが変更された可能性があり、表示用のデータを読み込むクエリを再実行する必要があるためです。
- 2 つの action メソッド customize() と show() がリストビューからカスタマイズフォームに移動し、再び戻ります。
- navigation action メソッド後に行われることはすべて、カスタマイズフォーム関連の処理です。これらのメソッドは、コメントに注記されているように、大きく 2 つのグループに分けられます。最初のグループは、カスタマイズフォームで使用される List<SelectOption> リストを提供し、2 つ目のグループは項目をリスト間で移動する 2 つのボタンを処理します。
2 つ目の <apex:pageBlock> には、<apex:repeat> で追加された列が含まれる <apex:pageBlockTable> が保持されます。繰り返しコンポーネントのすべての列は、取引先項目 {!acct[f]} への動的参照を使用して、ユーザがカスタム選択した項目を表示します。
- このページは、取引先が表示されていなくても、リストビューと同じ標準コントローラを使用します。これは、表示する項目のリストが含まれるビューステートを維持するために必要です。このフォームでユーザの設定がカスタム設定のような永続的なものに保存された場合、この操作は不要になります。
- 最初のリストは、getUnSelectedOptions() メソッドをコールすることで入力されます。フォームが (2 つの <apex:commandButton> コンポーネントのいずれかを経由して) 送信されると、フォーム送信時に選択されたリストの値が selected プロパティに保存されます。対応するコードが、もう一方のリストを処理します。
- これらの移動する項目の「デルタ」リストは、クリックされたボタンに応じて doAdd() または doRemove() メソッドで処理されます。
- デフォルト状態のカスタマイズ可能なリストに取引先名項目のみが表示されます。
[リストをカスタマイズ] をクリックします。 - 表示設定画面が表示されます。
一部の項目を右側のリストに移動し、[これらの項目を表示] をクリックします。 - カスタマイズされたリストビューが表示されます。