カスタムコントローラの作成
カスタムコントローラは、引数をとらないデフォルトのコンストラクタを外部の最上位クラスに使用する Apex クラスです。パラメータを含むカスタムコントローラコンストラクタを作成することはできません。
カスタムコントローラを作成する手順は、次のとおりです。
- [設定] で、 をクリックします。
- [新規] をクリックします。
- [バージョン設定] をクリックして、このクラスで使用する Apex および API のバージョンを指定します。組織が AppExchange から管理パッケージをインストールした場合、このクラスで使用する各管理パッケージのバージョンも指定できます。すべてのバージョンでデフォルト値を使用します。デフォルト値では、Apex および API についても、各管理パッケージについても、クラスを最新バージョンに関連付けます。最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は、管理パッケージの古いバージョンを指定することもできます。特定の動作を維持するには、Apex および API の古いバージョンを指定できます。
- クラスエディタで、クラスの Apex コードを入力します。1 つのクラスの長さは、最大 1,000,000 文字です。@isTest を使用して定義したコメント、テストメソッド、またはクラスは含みません。
- [保存] をクリックし、変更を保存してクラスの詳細画面に戻るか、[適用] をクリックし、変更を��存してクラスの編集を続行します。作成した Apex クラスは、クラスに保存する前に正しくコンパイルする必要があります。
次のクラスは、カスタムコントローラの単純な例です。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyController {
18
19 private final Account account;
20
21 public MyController() {
22 account = [SELECT Id, Name, Site FROM Account
23 WHERE Id = :ApexPages.currentPage().getParameters().get('id')];
24 }
25
26 public Account getAccount() {
27 return account;
28 }
29
30 public PageReference save() {
31 update account;
32 return null;
33 }
34}次の Visualforce マークアップは、上記のカスタムコントローラをページ内で使用する方法を示します。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="myController" tabStyle="Account">
18 <apex:form>
19 <apex:pageBlock title="Congratulations {!$User.FirstName}">
20 You belong to Account Name: <apex:inputField value="{!account.name}"/>
21 <apex:commandButton action="{!save}" value="save"/>
22 </apex:pageBlock>
23 </apex:form>
24</apex:page>カスタムコントローラは、<apex:page> コンポーネントの controller 属性が使用されているため、ページと関連付けられています。
標準コントローラおよびコントローラ拡張と同様に、カスタムコントローラのメソッドは、関連付けられたページマークアップで {! } 表記を使って参照できます。上記の例では、getAccount メソッドは <apex:inputField> タグの value 属性で参照されており、<apex:commandButton> タグは、action 属性が設定された save メソッドを参照しています。
カスタムコントローラは、新しいレコードを作成する場合にも使用できます。次に例を示します。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class NewAndExistingController {
18
19 public Account account { get; private set; }
20
21 public NewAndExistingController() {
22 Id id = ApexPages.currentPage().getParameters().get('id');
23 account = (id == null) ? new Account() :
24 [SELECT Name, Phone, Industry FROM Account WHERE Id = :id];
25 }
26
27 public PageReference save() {
28 try {
29 upsert(account);
30 } catch(System.DMLException e) {
31 ApexPages.addMessages(e);
32 return null;
33 }
34 // After Save, navigate to the default view page:
35 return (new ApexPages.StandardController(account)).view();
36 }
37}
38次の Visualforce マークアップは、上記のカスタムコントローラをページ内で使用する方法を示します。
1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="NewAndExistingController" tabstyle="Account">
18 <apex:form>
19 <apex:pageBlock mode="edit">
20 <apex:pageMessages/>
21 <apex:pageBlockSection>
22 <apex:inputField value="{!Account.name}"/>
23 <apex:inputField value="{!Account.phone}"/>
24 <apex:inputField value="{!Account.industry}"/>
25 </apex:pageBlockSection>
26 <apex:pageBlockButtons location="bottom">
27 <apex:commandButton value="Save" action="{!save}"/>
28 </apex:pageBlockButtons>
29 </apex:pageBlock>
30 </apex:form>
31</apex:page>