コントローラメソッド
- action
- getter
- setter
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 にする必要があります。
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 にする必要があります。
カスタム拡張またはコントローラを使用したデータの取得と設定
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}次のカスタムコントローラにはまったく同じメソッドがあります。ただし、getContactMethod2 は contactMethod1 をコールするため、変数 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>