こんにちは、にいるです。
今回は、Apexの「コントローラ拡張の使い方」について、書いてみたいと思います。
1.コントローラ拡張とは
言いにくいですが、正式名称はコントローラ拡張みたいですね。
拡張コントローラの方が他のコントローラの名前とも整合性が取れていいと思うんです笑
コントローラ拡張について、カスタムアクションを作成する機能の為、Apexクラスを書かないといけません。
標準コントローラと標準リストはVisualforceページだけでした。
なので、テストクラスも作成する必要が出てきます。
各コントローラの相違点をまとめてみました。
相違点 | 標準 | 標準リスト | 拡張 | カスタム |
Apexクラスの作成 | 不要 | 不要 | 必須 | 必須 |
テストクラス | 不要 | 不要 | 必須 | 必須 |
新しいアクションの追加 | できない | できない | できる | できる |
アクションの上書き | できない | できない | できる | できる |
デフォルトの実行モード | ユーザ | ユーザ | システム | システム |
実行モードについては、項目レベルセキュリティを考慮する場合、with sharingを使用する必要があります。
アクションの上書きや作成もできるので、カスタムアクションを作成するにはとても便利なコントローラだと思います。
2.コントローラ拡張の使い方
実際に、コントローラ拡張を書いていきます。
今回は標準コントローラを拡張する内容にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class myControllerExtension { private final Account acct; // ① 引数に標準コントローラを指定して、メソッドを使用してレコードIDを取得します。 public myControllerExtension(ApexPages.StandardController stdController) { this.acct = (Account)stdController.getRecord(); } // ② カスタムアクションメソッドを定義します。 public String getGreeting() { return 'Hello ' + acct.name + ' (' + acct.id + ')'; } } |
1 2 3 4 5 6 7 8 9 |
<!-- ③ extensionsの属性にコントローラ拡張のApexクラスを指定します。 --> <apex:page standardController="Account" extensions="myControllerExtension"> {!greeting} <p/> <apex:form> <apex:inputField value="{!account.name}"/> <p/> <!-- ④ 標準コントローラのSaveメソッドを呼び出します。 --> <apex:commandButton value="Save" action="{!save}"/> </apex:form> </apex:page> |
②カスタムアクションを作成しています。
③標準コントローラを拡張するためにextensions属性で「myControllerExtension」を使用すると宣言しています。
④コントローラ拡張にはSaveメソッドを定義していないので、ここで呼び出されるSaveメソッドは標準コントローラを使用します。
■デバッグ結果
画面はこんな感じです。
動きとしてはページを読み込んだときに、Apexクラス「myControllerExtension」も実行されています。
そして、クラス内のメソッド「getGreeting()」によって、{!greeting}にも値がバインドされていて、画面に取得したデータが返ってきています。
このSaveボタンは標準機能です。
ApexではSaveメソッドを作成していないため、上書けるものがありません。
そのため、これをクリックすると標準のレコード保存処理が実行されます。
何を保存するかについては、画面に表示されているinputFieldのvalue属性で判断できます。
ここでは取引先名を指定しているので、ここに入力された値が取引先名に変更されます。
3.コントローラ拡張の複数使用
1つのページにコントローラ拡張を複数指定する場合は、最初に記載されたコントローラを優先して呼び出します。
例えば、下記のようにPage属性を宣言します。
1 |
<apex:page standardController="Account" extensions="ex1,ex2"> |
そして、各コントローラには下記のようにメソッドが用意されているとします。
アクション | 標準 | ex1 | ex2 |
保存 | ある | ある | ある |
編集 | ある | ない | ある |
削除 | ある | ない | ない |
・保存 → ex1
・編集 → ex2
・削除 → 標準
になります。
ex1を優先してそこにメソッドが定義されていれば使用する、なければ次のコントローラ拡張の中身を確認する、それでもなければ標準機能を使用するといったロジックになっています。
4.まとめ
いかがでしたでしょうか。
コントローラ拡張は標準コントローラ、標準リストコントローラとは全然違う機能です。
シンプルにアクションを拡張する機能として覚えておくといいと思います。
カスタムコントローラまでではないけど、ちょっとしたカスタムアクションを定義したいときに、使用したい機能ですね。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント