こんにちは、にいるです。
今回は、Apexの「標準リストコントローラの使い方」について、書いてみたいと思います。
標準リストコントローラも標準コントローラと同様、デベロッパー試験にも出題されます。
これから受ける方はしっかり理解しておくことをおすすめします。
1.標準リストコントローラとは
標準リストコントローラとは、レコードセット単位で表示や操作を実行できるVisualforceページを作成できる機能です。
標準コントローラでは、1つのレコードIDしか持てないので、1つのページに1つのレコードしか表示できませんでしたが、標準リストコントローラを使用すれば1つのページに複数のレコードを操作できます。
※標準コントローラは下記からご覧ください。
また、標準コントローラとの違いは、使用できるオブジェクトとアクションに現れます。
標準コントローラでは、カスタムオブジェクト含めて全ての標準オブジェクトに使用できますが、標準リストコントローラの場合は一部の標準オブジェクトには使用できません。
さらにアクションメソッドも標準リストコントローラにはページネーション系が追加されます。
下記の表にそれぞれの違いをまとめてみました。
相違点 | 標準 | 標準リスト |
オブジェクト | 全て | 一部 |
ページネーション | ✖︎ | ○ |
アクション | save quicksave edit delete cancel list |
save quicksave list cancel first last next previous |
2.標準リストコントローラの使い方
では、実際に標準リストコントローラを2段階に分けて見ていきます。
2-1.標準リストコントローラでレコードセットを取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!-- ① 表示したいリストのオブジェクトを定義します。 --> <apex:page standardController="Contact" recordSetVar="contacts"> <apex:pageBlock title="取引先責任者リスト"> <!-- ② 反復コンポーネントで取得したオブジェクトのリストを表示します。--> <apex:pageBlockTable value="{! contacts }" var="ct"> <apex:column value="{! ct.FirstName }"/> <apex:column value="{! ct.LastName }"/> <apex:column value="{! ct.Email }"/> <apex:column value="{! ct.Account.Name }"/> </apex:pageBlockTable> </apex:pageBlock> </apex:page> |
さらに、recordSetVarにstandardControllerに指定したオブジェクトの複数形を記載します。(命名規則です。)
②リストとして取得したレコードデータを反復コンポーネントを使用して全表示しています。
■デバッグ結果
これを実行すると下記ページのように、対象レコードを取得してきれいにテーブル化された一覧リストが表示されます。
VisualforceページにName項目にリンクを貼ればそこから個別のレコードページにも遷移することもできます。
2-2.標準リストコントローラでリストビューを呼び出す
Visualforceタグの「apex:selectOptions」を使用すれば、ユーザがアクセスできる既存のリストビューを呼び出すこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!-- ① 表示したいリストのオブジェクトを定義します。 --> <apex:page standardController="Contact" recordSetVar="contacts"> <apex:form> <!-- ② 反復コンポーネントで取得したオブジェクトのリストを表示します。--> <apex:pageBlock title="取引先責任者リスト" id="contacts_list"> <!-- ③ リストビューのリストを取得します。--> リストビュー: <apex:selectList value="{! filterId }" size="1"> <apex:selectOptions value="{! listViewOptions }"/> <apex:actionSupport event="onchange" reRender="contacts_list"/> </apex:selectList> <apex:pageBlockTable value="{! contacts }" var="ct"> <apex:column value="{! ct.FirstName }"/> <apex:column value="{! ct.LastName }"/> <apex:column value="{! ct.Email }"/> <apex:column value="{! ct.Account.Name }"/> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page> |
■デバッグ
テーブルの左上部でプルダウン形式でリストビューが選べるようになっていますね。
2-3.標準リストコントローラでページネーション
と、ここまでは標準コントローラにちょっと足しただけなので、かなりすっきり理解が進むと思います。
次にページネーションアクションを使用したコードを見ていきます。
レコードが1,000件のように大量にレコードが存在する場合、上記2つのコードでは全く使用できないページになります。
そこで使用する機能がページネーションで、よくある「前へ」、「次へ」のリンクを表示させてリストを分割して表示する機能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<!-- ① 表示したいリストのオブジェクトを定義します。 --> <apex:page standardController="Contact" recordSetVar="contacts"> <apex:form > <!-- ② 反復コンポーネントで取得したオブジェクトのリストを表示します。--> <apex:pageBlock title="取引先責任者リスト" id="contacts_list"> <!-- ③ リストビューのリストを取得します。--> リストビュー: <apex:selectList value="{! filterId }" size="1"> <apex:selectOptions value="{! listViewOptions }"/> <apex:actionSupport event="onchange" reRender="contacts_list"/> </apex:selectList> <apex:pageBlockTable value="{! contacts }" var="ct"> <apex:column value="{! ct.FirstName }"/> <apex:column value="{! ct.LastName }"/> <apex:column value="{! ct.Email }"/> <apex:column value="{! ct.Account.Name }"/> </apex:pageBlockTable> <!-- ④ リストのサイズと開いているリストの中のページによってページネーション機能を制御します。--> <table style="width: 100%"><tr> <td> Page: <apex:outputText value=" {!PageNumber} / {! CEILING(ResultSize / PageSize) }"/> </td> <td align="center"> <apex:commandLink action="{! Previous }" value="« 前へ" rendered="{! HasPrevious }"/> <apex:outputText style="color: #ccc;" value="« 前へ" rendered="{! NOT(HasPrevious) }"/> <apex:commandLink action="{! Next }" value="次へ »" rendered="{! HasNext }"/> <apex:outputText style="color: #ccc;" value="次へ »" rendered="{! NOT(HasNext) }"/> </td> <!-- ⑤ ページに表示する件数を調整しています。 --> <td align="right"> ページに表示する件数: <apex:selectList value="{! PageSize }" size="1"> <apex:selectOption itemValue="5" itemLabel="5"/> <apex:selectOption itemValue="20" itemLabel="20"/> <apex:actionSupport event="onchange" reRender="contacts_list"/> </apex:selectList> </td> </tr> </table> </apex:pageBlock> </apex:form> </apex:page> |
⑤これらで取得した件数やページサイズをカウントして、Visualforceページにレコードのリストを表示しています。
これは標準コントローラでは実現できない機能です。
また、カスタムコントローラを使用して作成するにしてもApexクラスを書かないといけなく、テストクラスも作成しないといけなくなります。
それを踏まえると標準リストコントローラはかなり便利な機能ですね。
ロジックを全てVisualforceコントローラで自動処理するため、開発初心者の方でもうまく書けると思います。
■デバッグ結果
ページ下部にページ数や現在のページ位置を確認できるテキストが表示されていますね。
また、件数表示を5件か20件に選べるようにもなっています。
3.まとめ
いかがでしたでしょうか。
レコード詳細ページをカスタマイズしたいときは標準コントローラを使用し、
レコードをセットでリスト表示したいときは標準リストコントローラを使用する、
と言うふうに覚えておくといいと思います。
このほかにもコントローラ拡張やカスタムコントローラもあるので、それぞれの特徴を把握しておくことが大切だと思います。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント