action メソッドの定義
action メソッドは、ユーザがボタンをクリックしたり、ページ内のある領域にマウスポインタを移動したりするなどのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメータに {! } 表記を使用することによって、ページマークアップから action メソッドをコールできます。
- <apex:commandButton> はアクションをコールするボタンを作成する
- <apex:commandLink> はアクションをコールするリンクを作成する
- <apex:actionPoller> は定期的にアクションをコールする
- <apex:actionSupport> は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) を作成し、アクションをコールする
- <apex:actionFunction> は、アクションをコールする新しい JavaScript 関数を定義する
- <apex:page> はページが読み込まれると、アクションをコールする
たとえば、「ページでの入力コンポーネントの使用」で説明されているサンプルページでは、コマンドボタンは、標準取引先コントローラの save メソッドにバインドされています。MyController カスタムコントローラを使用するように、前の例を適応させることができます。
1swfobject.registerObject("clippy.codeblock-0", "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="Hello {!$User.FirstName}!">
20 You are viewing the {!account.name} account. <p/>
21 Change Account Name: <p/>
22 <apex:inputField value="{!account.name}"/> <p/>
23 <apex:commandButton action="{!save}" value="Save New Account Name"/>
24 </apex:pageBlock>
25 </apex:form>
26</apex:page>上記のページを保存すると、Visualforce エディタで「クイック修正」オプションを使用して、MyController クラスに save メソッドを追加できます。クイック修正リンクをクリックすると、MyController は次のようになります。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyController {
18
19 public PageReference save() {
20 return null;
21 }
22
23 public String getName() {
24 return 'MyController';
25 }
26
27 public Account getAccount() {
28 return [select id, name from Account
29 where id = :ApexPages.currentPage().getParameters().get('id')];
30 }
31}クイック修正によって生成される save メソッドは、action メソッドに使用する標準署名を使用します。これは public であり、PageReferemce を返し、引数を含みません。
最終的に、save メソッドの定義は、新しい取引先値を使用してデータベースを更新する必要がありますが、まずその前にメンバー変数を定義して、データベースから取得される取引先情報を保存する必要があります。取引先のメンバー変数がない場合、データベースから取得されるレコードは、その値がページを表示するために使用された後で保持されないため、ユーザによるレコード更新は保存できません。このメンバー変数を導入するには、コントローラコードの 2 つの部分を変更する必要があります。
- メンバー変数をクラスに追加する
- getAccount が最初のクエリを実行するときにメンバー変数を設定する
1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyController {
18
19 Account account;
20
21 public PageReference save() {
22 return null;
23 }
24
25 public String getName() {
26 return 'MyController';
27 }
28
29 public Account getAccount() {
30 if(account == null)
31 account = [select id, name, site from Account
32 where id = :ApexPages.currentPage().getParameters().get('id')];
33 return account;
34 }
35}メンバー変数が適切に配置されたため、save メソッドで行う必要があることはデータベースの更新だけです。
1swfobject.registerObject("clippy.codeblock-4", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyController {
18
19 Account account;
20
21 public PageReference save() {
22 update account;
23 return null;
24 }
25
26 public String getName() {
27 return 'MyController';
28 }
29
30 public Account getAccount() {
31 if(account == null)
32 account = [select id, name, site from Account
33 where id = :ApexPages.currentPage().getParameters().get('id')];
34 return account;
35 }
36}save に対するより堅牢なソリューションとしては、さまざまな例外の検出や重複の検索などを行うことが考えられます。ここでは単純な例を示すことを目的としているため、そのような詳細は省略しています。
このページをテストするために、[取引先名を変更] 項目の値を変更して、[新規取引先名を保存] をクリックします。標準取引先コントローラの例と同様に、ページは単に新しい取引先名で更新されます。次の例では、save アクションを拡張して、現在のページを更新する代わりにユーザを別の確認ページに移動します。