この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Apex 対応付けとリストの参照

動的バインドを使用する Visualforce ページは、マークアップ内の Apex Map および List データ型を参照できます。

たとえば、Apex List が次のように定義されているとします。
1public List<String> people {
2    get { 
3        return new List<String>{'Winston', 'Julia', 'Brien'};
4    }
5    set;
6}
7
8public List<Integer> iter {
9    get { 
10        return new List<Integer>{0, 1, 2};
11    }
12    set;
13}
Visualforce ページでは次のようにアクセスできます。
1<apex:repeat value="{!iter}" var="pos">
2    <apex:outputText value="{!people[pos]}" /><br/>
3</apex:repeat>
同様に、次の Apex Map があるとします。
1public Map<String,String> directors {
2    get {
3        return new Map<String, String> {
4            'Kieslowski' => 'Poland', 
5            'del Toro' => 'Mexico', 
6            'Gondry' => 'France'
7        };
8    }
9    set;
10}
Visualforce ページは、次のように値を表示できます。
1<apex:repeat value="{!directors}" var="dirKey">
2        <apex:outputText value="{!dirKey}" /> -- 
3        <apex:outputText value="{!directors[dirKey]}" /><br/>
4</apex:repeat>

組織のカスタムオブジェクトに含まれていないデータを使用してフォームを作成するには、<apex:inputText> タグのリストと対応付けの動的参照を使用します。Apex コントローラーに一連のインスタンス変数を作成したり、そのフォームデータのためだけにカスタムオブジェクトを作成したりするより、単一の対応付けを使用するほうが、かなり作業を簡略化できる場合があります。

カスタムコントローラーで処理するフォームデータを格納する対応付けを使用する Visualforce ページを次に示します。
1<apex:page controller="ListsMapsController">
2    <apex:outputPanel id="box" layout="block">
3        <apex:pageMessages/>
4        <apex:form >
5
6            <apex:repeat value="{!inputFields}" var="fieldKey">
7                <apex:outputText value="{!fieldKey}"/>: 
8                <apex:inputText value="{!inputFields[fieldKey]}"/><br/>
9            </apex:repeat>
10
11            <apex:commandButton action="{!submitFieldData}" 
12                value="Submit" id="button" rerender="box"/>
13
14        </apex:form>
15    </apex:outputPanel>
16</apex:page>
フォームで使用する単純なコントローラーを次に示します。
1public class ListsMapsController {
2
3    public Map<String, String> inputFields { get; set; }
4
5    public ListsMapsController() {
6        inputFields = new Map<String, String> { 
7            'firstName' => 'Jonny', 'lastName' => 'Appleseed', 'age' => '42' };
8    }
9
10    public PageReference submitFieldData() {
11        doSomethingInterestingWithInput();
12        return null;
13    }
14    
15    public void doSomethingInterestingWithInput() {
16        inputFields.put('age', (Integer.valueOf(inputFields.get('age')) + 10).format());
17    }
18}
Map には、sObject または sObject 項目の参照を含めることができます。これらの項目を更新するには、入力項目の項目名を参照します。
1public with sharing class MapAccCont {
2
3    Map<Integer, Account> mapToAccount = new Map<Integer, Account>();
4
5    public MapAccCont() {
6        Integer i = 0;
7        for (Account a : [SELECT Id, Name FROM Account LIMIT 10]) {
8            mapToAccount.put(i, a);
9            i++;
10        }
11    }
12
13    public Map<Integer, Account> getMapToAccount() {
14        return mapToAccount;
15    }
16}
1<apex:page controller="MapAccCont">
2    <apex:form>
3        <apex:repeat value="{!mapToAccount}" var="accNum">
4            <apex:inputField value="{!mapToAccount[accNum].Name}" />
5        </apex:repeat>
6    </apex:form>
7</apex:page>

未解決の動的参照

動的参照が解決しない場合、実行時に次の問題が発生する可能性があります。
  • 特定のキーに対応付けられた値がない場合、Visualforce ページはエラーメッセージを返します。たとえば、次のコントローラーがあるとします。
    1public class ToolController {
    2    public Map<String, String> toolMap { get; set; }
    3    public String myKey  { get; set; }
    4
    5    public ToolController() {
    6        Map<String, String> toolsMap = new Map<String, String>();
    7        toolsMap.put('Stapler', 'Keeps things organized');
    8    }
    9}
    このページでは実行時にエラーが発生します。
    1<apex:page controller="ToolController">
    2    <!-- This renders an error on the page -->
    3    <apex:outputText value="{!toolMap['Paperclip']}" />
    4</apex:page>
  • キーが null の場合、Visualforce ページは空の文字列を表示します。たとえば、上記と同じコントローラーを使用すると、このページは空白を表示します。
    1<apex:page controller="ToolController">
    2    <!-- This renders a blank space -->
    3    <apex:outputText value="{!toolMap[null]}" />
    4</apex:page>