こんにちは、アンダーソンです。
コントローラを使ってみようシリーズです。
今回はカスタムコントローラを使った実装を紹介していきます。
おさらい
VFで使えるコントローラの種類は4種類です。
- 標準コントローラ
- 標準リストコントローラ
- カスタムコントローラ
- コントローラ拡張
今回は3.4番目のカスタムコントローラとコントローラ拡張について説明していきたいと思います。
カスタムコントローラ
カスタムコントローラは、標準コントローラを使用せずにページのすべてのロジックを実装する Apex クラスです。Visualforce ページを完全にシステムモードで実行する場合に、カスタムコントローラを使用します。システムモードでは現在のユーザの権限と項目レベルのセキュリティが適用されません。
カスタムコントローラおよびコントローラ拡張とは?
標準コントローラとは違いApexをコントローラとして読み込むことで、
getterやsetter、カスタムされたメソッドなどを呼び出すことができます。
今回はVFをCustomControllerSample、ApexをCustomControllerという名前で作ってみました。
<apex:page controller="CustomController">
</apex:page>
VF側の宣言は上記のようになります。
これでCustomControllerという名前のApexクラスを呼び出すことができます。
試しにカスタムオブジェクトTest1__cを検索する画面を作ってみました。


検索を押すことで画面が切り替わり、検索条件に合致したリストが表示されます。
public Test1__c conditions {get; set;}
public List<Test1__c> resultsList{get; set;}
public Boolean doSearch{get; set;}
今回コントローラ側では上記3つの変数を用意して画面を切り替える動作、
検索条件、検索結果を制御しました。
そして検索ボタンの動きも作成して、標準にはない動きを作成することができました。
このコードはGitHubにUPしています。
コントーラ拡張をしてみよう
このように痒いところに手が届くのがカスタムコントローラですが、
標準コントローラでできることもわざわざ変数を宣言して。。。
など煩わしいことももちろんあります。
そんな時に便利なのが拡張です。
先ほどのクラスとページを拡張してみます。
<apex:page standardController="Test1__c" extensions="CustomController">
VF側ではextensionsでカスタムコントローラを指定してあげます。
これで標準コントローラで使えたsaveメソッドやdeleteなどはそのまま使え、
カスタムコントローラのメソッドも使うことができます。
拡張をする場合はカスタムコントローラ側のコンストラクタが少し違うので注意しましょう。
public CustomController(ApexPages.StandardController controller) {
this.conditions = new Test1__c();
this.resultsList = new List<Test1__c>();
this.doSearch = false;
}
ApexPages.StandardController controllerが引数として渡されますので注意です。
また、標準リストコントローラを拡張する際は
ApexPages.StandardSetController controller
となりますのでこれも注意です。
ちなみに拡張コントローラは複数指定することができます。
<apex:page standardController="Test1__c" extensions="CustomController1,CustomController2,CustomController3">
このようにカンマ区切りで指定が可能です。ただし各コントローラ内で同じ変数やメソッド名を使ってしまわないように気をつけましょう。
もし使ってしまうとエラーにはなりませんが、一番左側のコントローラ(最初に指定しているもの)が優先順位1位になりますので思った動作をしない可能性がありますので
覚えておきましょう。
まとめ
いかがでしたでしょうか。
カスタムコントローラと拡張をうまく使うことが効率のいいコードを書く
第一歩と言えると思います。
しっかりこの辺りの違いや役割などを理解しながらぜひコーディングしてみてください。
コメント