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

コントローラーメソッド

Visualforce マークアップは、次の種別のコントローラー拡張とカスタムコントローラーメソッドを使用できます。
  • action
  • getter
  • setter

action メソッド

action メソッドは、ユーザーがボタンをクリックしたり、ページ内のある領域にマウスポインターを移動したりするなどのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメーターに {! } 表記を使用することによって、ページマークアップから action メソッドをコールできます。
  • <apex:commandButton> はアクションをコールするボタンを作成する
  • <apex:commandLink> はアクションをコールするリンクを作成する
  • <apex:actionPoller> は定期的にアクションをコールする
  • <apex:actionSupport> は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) を作成し、アクションをコールする
  • <apex:actionFunction> は、アクションをコールする新しい JavaScript 関数を定義する
  • <apex:page> はページが読み込まれると、アクションをコールする

たとえば、「カスタムコントローラーの作成」のサンプルページでは、<apex:commandButton> タグの action パラメーターによって、コントローラーの save メソッドがコールされます。その他の action メソッドの例は、「action メソッドの定義」を参照してください。

getter メソッド

getter メソッドはコントローラーの値を返します。コントローラーによって計算され、ページに表示される各値には、boolean 変数など、対応する getter メソッドが含まれる必要があります。たとえば、「カスタムコントローラーの作成」のサンプルページでは、コントローラーに getAccount メソッドが含まれます。このメソッドによって、ページのマークアップは、{! } 表記のあるコントローラークラスの account メンバー変数を参照することができます。<apex:inputField> タグの value パラメーターは、この表記を使用して取引先にアクセスし、ドット表記を使用して取引先の名前を表示します。getter メソッドの名前は、getVariable にする必要があります。

getter メソッドを羃等にする、つまり副次的影響がないようにすることがベストプラクティスです。たとえば、変数の増分、ログメッセージの書き込み、データベースへの新規レコードの追加を行わないようにします。Visualforce では、要求の処理の過程でコールされる可能性のある getter メソッドのコール順序および回数を定義しません。1 つのページ要求での getter メソッドのコール回数に関係なく、同じ結果を生成するように getter メソッドをデザインしてください。

重要

setter メソッド

setter メソッドは、ユーザー指定の値をページマークアップからコントローラーに渡します。コントローラーの setter メソッドは、どの action メソッドよりも先に自動的に実行されます。

たとえば、次のマークアップは、リードの基本的な検索機能を実装するページを表示します。関連付けられているコントローラーには、検索ボックスの入力に使用する getter メソッドと setter メソッドが含まれており、ユーザーが [Go!] をクリックすると、検索テキストを使用して、SOSL クエリを発行します。マークアップは、検索テキストの setter メソッドを明示的にはコールしませんが、ユーザーがコマンドボタンをクリックすると、doSearch action メソッドの前に setter メソッドが実行されます。

1<apex:page controller="theController">
2   <apex:form>
3      <apex:pageBlock mode="edit" id="block">
4         <apex:pageBlockSection>
5            <apex:pageBlockSectionItem>
6               <apex:outputLabel for="searchText">Search Text</apex:outputLabel>
7               <apex:panelGroup>
8                  <apex:inputText id="searchText" value="{!searchText}"/>
9                  <apex:commandButton value="Go!" action="{!doSearch}" 
10                                      rerender="block" status="status"/>
11               </apex:panelGroup>
12            </apex:pageBlockSectionItem>
13        </apex:pageBlockSection>
14        <apex:actionStatus id="status" startText="requesting..."/>
15        <apex:pageBlockSection title="Results" id="results" columns="1">
16           <apex:pageBlockTable value="{!results}" var="l" 
17                               rendered="{!NOT(ISNULL(results))}">
18              <apex:column value="{!l.name}"/>
19              <apex:column value="{!l.email}"/>
20              <apex:column value="{!l.phone}"/>
21           </apex:pageBlockTable>
22        </apex:pageBlockSection>
23      </apex:pageBlock>
24   </apex:form>
25</apex:page>

次のクラスは、上記のページマークアップに使用するコントローラーです。

1public class theController {
2
3    String searchText;
4    List<Lead> results;
5
6    public String getSearchText() {
7        return searchText;
8    }
9
10    public void setSearchText(String s) {
11        searchText = s;
12    }
13
14    public List<Lead> getResults() {
15        return results;
16    }
17
18    public PageReference doSearch() {
19        results = (List<Lead>)[FIND :searchText RETURNING Lead(Name, Email, Phone)][0];
20        return null;
21    }
22}

getter メソッドは、コントローラーから値にアクセスする場合に必ず必要なメソッドですが、値をコントローラーに渡す場合、必ずしも setter メソッドを含める必要はありません。Visualforce コンポーネントが、コントローラーに保存されている sObject にバインドされている場合、sObject が対応する action メソッドによって保存または更新されるかぎり、sObject 項目はユーザーによって変更されると自動的に設定されます。この動作の例は、「カスタムコントローラーの作成」のサンプルページにあります。

setter メソッドの名前は、setVariable にする必要があります。

setter メソッドを羃等にする、つまり副次的影響がないようにすることがベストプラクティスです。たとえば、変数の増分、ログメッセージの書き込み、データベースへの新規レコードの追加を行わないようにします。Visualforce では、要求の処理の過程でコールされる可能性のある setter メソッドのコール順序および回数を定義しません。1 つのページリクエストでの setter メソッドのコール回数に関係なく、同じ結果を生成するように setter メソッドをデザインしてください。

重要

カスタム拡張またはコントローラーを使用したデータの取得と設定

Apex メソッドと変数がコントローラー拡張またはカスタムコントローラーによって処理される順序は保証されません。このため、コントローラーと拡張クラスは、実行している別のメソッドに依存するのではなく、直接そのメソッドをコールする必要があります。これは、変数の設定とデータベースのデータへのアクセスに特に当てはまります。

たとえば、次のカスタムコントローラーの最初のメソッド getContactMethod1 は、contact 変数 c がすでに存在することを前提としていないため、正しい値を常に返します。一方、2 つ目のメソッド getContactMethod2 は、正しい値を返すこともありますが、c がまだ設定されていない場合は正しい値を返すとは限りません。

1public class conVsBad {
2    Contact c;
3
4    public Contact getContactMethod1() {
5        if (c == null) c = [SELECT Id, Name FROM Contact LIMIT 1];
6        return c;
7    }
8
9    public Contact getContactMethod2() {
10        return c;
11    }
12}

次のカスタムコントローラーにはまったく同じメソッドがあります。ただし、getContactMethod2contactMethod1 をコールするため、変数 c は常に設定され、返されるときには正しい値が常に含まれます。

1public class conVsGood {
2    Contact c;
3
4    public Contact getContactMethod1() {
5        if(c == null) c = [SELECT Id, Name FROM Contact LIMIT 1];
6        return c;
7    }
8
9    public Contact getContactMethod2() {
10        return getContactMethod1();
11    }
12}

次のマークアップでは、これらのコントローラーをコールする 2 つのページを示します。Visualforce マークアップは同じものであり、コントローラーの名前のみが変更されています。

1<apex:page controller="conVsGood">
2    getContactMethod2(): {!contactMethod2.name}<br/>
3    getContactMethod1(): {!contactMethod1.name}
4</apex:page>
1<apex:page controller="conVsBad">
2    getContactMethod2(): {!contactMethod2.name}<br/>
3    getContactMethod1(): {!contactMethod1.name}
4</apex:page>