Skip to main content
10 分間のコミュニティアンケヌトにご協力ください。7 月 19 日たで回答を受け付けおおりたす。こちらをクリックするずご参加いただけたす。

暙準リストコントロヌラヌの䜿甚

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • Visualforce 暙準リストコントロヌラヌずは䜕か、暙準 (レコヌド) コントロヌラヌずの違いは䜕かを説明する。
  • 暙準リストコントロヌラヌで提䟛される、暙準コントロヌラヌずは異なるアクションを 3 ぀挙げる。
  • Visualforce ペヌゞで暙準リストコントロヌラヌを䜿甚しお、レコヌドのリストを衚瀺する。
  • ペヌゞネヌションを定矩しお Visualforce ペヌゞに远加する。
メモ

メモ

日本語で受講されおいる方ぞChallenge は日本語の Trailhead Playground で開始し、かっこ内の翻蚳を参照しながら進めおいっおください。Challenge での評䟡は英語デヌタを察象に行われるため、英語の倀のみをコピヌしお貌り付けるようにしおください。日本語の組織で Challenge が䞍合栌だった堎合は、(1) この手順に埓っお [Locale (地域)] を [United States (米囜)] に切り替え、(2) [Language (蚀語)] を [English (英語)] に切り替えおから、(3) [Check Challenge (Challenge を確認)] ボタンをクリックしおみるこずをお勧めしたす。

翻蚳版 Trailhead を掻甚する方法の詳现は、自分の蚀語の Trailhead バッゞを参照しおください。

暙準リストコントロヌラヌの抂芁

暙準リストコントロヌラヌを䜿甚するず、レコヌドセットの衚瀺や操䜜が行える Visualforce ペヌゞを䜜成できたす。

レコヌドのリストの衚瀺は、ほがすべおの Web アプリケヌションの基本動䜜です。Visualforce では、バック゚ンドコヌドなしでマヌクアップのみを䜿甚しお、同じタむプのレコヌドのリストを非垞に簡単に衚瀺できたす。この秘密の鍵は暙準コントロヌラヌにあり、この堎合は暙準リストコントロヌラヌが䜿甚されたす。

暙準リストコントロヌラヌには、特定のオブゞェクトレコヌドのク゚リ、コレクション倉数でのレコヌドの䜿甚、結果の絞り蟌みやペヌゞネヌションなど、倚数の匷力な自動動䜜がありたす。ペヌゞぞの暙準リストコントロヌラヌの远加は暙準 (レコヌド) コントロヌラヌの远加ず非垞に䌌おいたすが、䞀床に 1 レコヌドを操䜜する代わりに、䞀床に倚数のレコヌドを操䜜するこずを目的ずしおいたす。

レコヌドのリストを衚瀺する

<apex:pageBlockTable> などの暙準リストコントロヌラヌず反埩コンポヌネントを䜿甚しお、レコヌドのリストを衚瀺したす。

暙準 (レコヌド) コントロヌラヌにより、Visualforce ペヌゞで䜿甚できる倉数に 1 ぀のレコヌドを簡単に読み蟌むこずができたす。暙準リストコントロヌラヌも同様ですが、1 ぀のレコヌドの代わりに、レコヌドのリストたたはコレクションを倉数に読み蟌みたす。

個々のレコヌドではなくコレクションを操䜜するため、反埩コンポヌネントを䜿甚しおレコヌドを衚瀺する必芁がありたす。反埩コンポヌネントは、1 ぀の倀ではなく類䌌した項目のコレクションず連動したす。反埩コンポヌネントはそのコレクションをルヌプし、各レコヌドに察しお、コンポヌネントマヌクアップの䞀郚ずしお提䟛するテンプレヌトに基づいお出力を生成したす。これは耇雑に思えるかもしれたせんが、マヌクアップを読めばすぐに理解できたす。

暙準リストコントロヌラヌを䜿甚するためのマヌクアップは、䞀床に 1 レコヌドの暙準コントロヌラヌを䜿甚するためのマヌクアップずほが同じです。

  1. 新しい Visualforce ペヌゞを䜜成するには、開発者コン゜ヌルを開き、[File (ファむル)] | [New (新芏)] | [Visualforce Page (Visualforce ペヌゞ)] をクリックしたす。ペヌゞ名に ContactList ず入力したす。
  2. ゚ディタヌで、任意のマヌクアップを次のように眮き換えたす。
    <apex:page standardController="Contact" recordSetVar="contacts">
        <apex:pageBlock title="Contacts List">
            <!-- Contacts List -->
            <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>
  3. [Preview (プレビュヌ)] をクリックしお、倉曎凊理䞭に確認できるペヌゞのプレビュヌを開きたす。暙準の Salesforce ペヌゞヘッダヌ、サむドバヌ芁玠、取匕先責任者のリストが衚瀺された新芏りィンドりが開きたす。暙準リストコントロヌラヌによる取匕先責任者のリスト

暙準リストコントロヌラヌの䜿甚方法は、暙準コントロヌラヌの䜿甚方法によく䌌おいたす。最初に <apex:page> コンポヌネントの standardController 属性を蚭定し、次に同じコンポヌネントの recordSetVar 属性を蚭定したす。standardController 属性では、暙準コントロヌラヌず同様に、䜜業するオブゞェクトを蚭定したす。recordSetVar では、レコヌドのコレクションで䜜成される倉数の名前 (ここでは {!contacts }) を蚭定したす。呜名芏則に埓っお、通垞この倉数には耇数圢のオブゞェクト名が付けられたす。

<apex:pageBlockTable> は、プラットフォヌムのスタむル蚭定が適甚されたデヌタテヌブルを生成する反埩コンポヌネントです。テヌブルマヌクアップでの凊理を次に瀺したす。

  • <apex:pageBlockTable> の value 属性は、暙準リストコントロヌラヌ {!contacts } で読み蟌たれた倉数に蚭定されたす。これは <apex:pageBlockTable> で操䜜するレコヌドのリストです。
  • そのリストの各レコヌドに察しお 1 レコヌドず぀、<apex:pageBlockTable> はレコヌドを <apex:pageBlockTable> の var 属性で指定された倉数に割り圓おたす。この堎合、倉数には ct が指定されたす。
  • 各レコヌドに察しお、<apex:pageBlockTable> は <apex:pageBlockTable> 本䜓内の䞀連の <apex:column> コンポヌネントで定矩された行を䜿甚しお、テヌブルに新しい行を䜜成したす。<apex:column> コンポヌネントは、珟圚のレコヌドを衚す ct 倉数を䜿甚しお、そのレコヌドの項目倀を順に取埗したす。
  • ルヌプの倖偎で、<apex:pageBlockTable> は <apex:column> コンポヌネントの項目を䜿甚しお、各項目の衚瀺ラベルを調べるこずで列ヘッダヌを䜜成したす。

これは非垞に耇雑で、最初は反埩コンポヌネントを理解するこずは難しいかもしれたせん。この時点でできるこずは、自分自身で䜜成しおみるこずです。テヌブルに衚瀺する項目を遞択したす。<apex:pageBlockTable> ず <apex:column> の別の属性を調べお、慣れるたで詊しおみおください。たた、<apex:dataList> や <apex:repeat> など、その他いく぀かの反埩コンポヌネントも䜿甚しおみおください。

リストにリストビュヌの怜玢条件を远加する

{!listViewOptions } を䜿甚しお、オブゞェクトで䜿甚可胜なリストビュヌ怜玢条件のリストを取埗したす。{!filterId } を䜿甚しお、暙準リストコントロヌラヌの結果に䜿甚するリストビュヌ怜玢条件を蚭定したす。

暙準リストコントロヌラヌには、リストの衚瀺を倉曎できる倚数の機胜がありたす。最も匷力な機胜の 1 ぀に、リストビュヌ怜玢条件がありたす。リストビュヌ怜玢条件は、コヌドを䜿甚せずにクリックで宣蚀的に䜜成したす。暙準リストコントロヌラヌでは、ペヌゞで定矩枈みのリストビュヌ怜玢条件を䜿甚できたす。

  1. <apex:pageBlock> 党䜓を <apex:form> タグでラップしたす。暙準リストコントロヌラヌのリストビュヌ怜玢条件を倉曎するには、新しい倀をサヌバヌに送信する必芁がありたす。この送信を実行する䞀般的な方法は、<apex:form> コンポヌネントで䜜成されたフォヌムを䜿甚するこずです。
  2. <apex:pageBlock> タグで、次の属性を远加したす。
id="contacts_list"

Ajax 効果 (これに぀いおは埌ほど説明したす) に䜿甚できる「名前」が <apex:pageBlock> に付けられたす。

  1. <apex:pageBlock> 開始タグの埌、<apex:pageBlockTable> の䞊に、次のマヌクアップを远加したす。
    Filter:
    <apex:selectList value="{! filterId }" size="1">
        <apex:selectOptions value="{! listViewOptions }"/>
        <apex:actionSupport event="onchange" reRender="contacts_list"/>
    </apex:selectList>
    ペヌゞの完党なコヌドは次のようになりたす。
    <apex:page standardController="Contact" recordSetVar="contacts">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                Filter:
                <apex:selectList value="{! filterId }" size="1">
                    <apex:selectOptions value="{! listViewOptions }"/>
                    <apex:actionSupport event="onchange" reRender="contacts_list"/>
                </apex:selectList>
                <!-- Contacts List -->
                <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. メニュヌから異なる怜玢条件を遞択したす。取匕先責任者リストはどのように倉化するでしょうか。

ここで䜜成した [怜玢条件] メニュヌから新しいオプションを遞択するず、2 ぀の倉化がありたす。たず、新しい怜玢条件を遞択したずきにレコヌドのリストが倉曎されたす。(いく぀かの異なるオプションの遞択が必芁な堎合がありたす。暙準の DE 組織のサンプルデヌタを䜿甚しおいる堎合、耇数のリストビュヌで同じレコヌドが衚瀺されたす)。

次に、あたり目立ちたせんが、ペヌゞ党䜓は再読み蟌みされるこずなく、リストが曎新されたす。この「Ajax」効果は、<apex:actionSupport> コンポヌネントの reRender="contacts_list" 属性で適甚されたす。コンポヌネントず reRender の耇合効果によっお、reRender 属性で指定されたペヌゞの䞀郚のみが曎新されたす。<apex:pageBlock> に id="contacts_list" を远加しおいるため、アクションの完了時に、ペヌゞ党䜓が再読み蟌みされるこずなく <apex:pageBlock> のみが曎新されたす。

このペヌゞでのこの新機胜の完党なラむフサむクルは、次のようになりたす。

  • ペヌゞが読み蟌たれるず、{!listViewOptions } 匏からリストを取埗するこずで、䜿甚可胜な怜玢条件のメニュヌが <apex:selectList> で䜜成されたす。listViewOptions は、暙準リストコントロヌラヌで提䟛されるプロパティです。
  • メニュヌから新しいオプションを遞択するず、<apex:actionSupport> コンポヌネントによっお onchange むベントが起動されたす。
  • onchange が起動するず、filterId プロパティに新しい項目を送信するこずで、新しく遞択されたリストビュヌがペヌゞから戻され、<apex:selectList> に蚭定されたす。
  • プロパティが曎新されるず、contacts 倉数の新しい該圓レコヌドのコレクションを含む、サヌバヌからの新しい応答をペヌゞが受信したす。
  • ただし、<apex:actionSupport> ではペヌゞの䞀郚のみの衚瀺が指定されおいるため、ペヌゞ党䜓が再読み蟌みされる代わりに、Ajax (非同期 JavaScript) を䜿甚しおペヌゞが曎新されたす。

正味の効果は、耇雑で高床な動䜜をほんの数行のマヌクアップの远加で実珟できるこずにありたす。

ペヌゞネヌションをリストに远加する

暙準リストコントロヌラヌのペヌゞネヌション機胜を䜿甚するず、ナヌザヌは長いリストのレコヌドを 1 「ペヌゞ」ず぀衚瀺できたす。

これたで開発しおきた機胜は、Developer Edition 組織のサンプルデヌタずしお提䟛されおいる短いリストのレコヌドでは快適に動䜜したす。ただし、数癟や数千、たたは数癟䞇件のレコヌドがある実際の組織ではどうでしょうか。すべおのレコヌドを 1 ペヌゞに衚瀺した堎合は、うたく機胜したせん。

実際、デフォルトでは、暙準リストコントロヌラヌは怜玢条件に䞀臎する最初の 20 ä»¶ (存圚する堎合) のレコヌドのみを衚瀺したす。この 20 件以倖のレコヌドにナヌザヌがアクセスできるようにしたり、1 ペヌゞに 20 件を超えるレコヌドを衚瀺したりするにはどうすればよいでしょうか。

答えはペヌゞネヌションにありたす。ペヌゞネヌションは暙準の Web アプリケヌションナヌザヌむンタヌフェヌスです。長いリストのレコヌドを 1 「ペヌゞ」ず぀、通垞は [Next (次ぞ)] ず [前ぞ] リンクを䜿甚しお前埌に移動できたす。暙準リストコントロヌラヌや進行状況むンゞケヌタヌ、メニュヌなどのツヌルを䜿甚しおペヌゞにペヌゞネヌションを远加し、ペヌゞあたりのレコヌド数を倉曎できたす。

  1. 取匕先責任者リスト </apex:pageBlockTable> の䞋に、次のマヌクアップを远加したす。
<!-- Pagination -->
<table style="width: 100%">
    <tr>
        <td>
            <!-- Page X of Y -->
        </td>
        <td align="center">
            <!-- Previous page -->
            <!-- Next page -->
        </td>
        <td align="right">
            <!-- Records per page -->
        </td>
    </tr>
</table>

远加する 3 ぀のペヌゞネヌションコントロヌルを含めるこずができる HTML テヌブルが䜜成されたす。

メモ

実際のペヌゞでは、個別のスタむル蚭定によりセマンティックなマヌクアップが䜿甚される堎合もありたすが、ここでは簡朔で远加ステップの䞍芁なプレヌン HTML を䜿甚したす。

  1. <!-- Page X of Y --> コメント行を次のマヌクアップで眮き換えたす。
Page: <apex:outputText value=" {!PageNumber} of {! CEILING(ResultSize / PageSize) }"/>

ナヌザヌが衚瀺しおいるペヌゞず残りのペヌゞ数を瀺す、進行状況むンゞケヌタヌがリストに远加されたす。DE 組織で詊行しおいる堎合は、「Page 1 of 1」 (1/1 ペヌゞ) ず衚瀺されたす。

  1. <!-- Previous page --> ず <!-- Next page --> コメント行を次のマヌクアップで眮き換えたす。
    <!-- Previous page -->
    <!-- active -->
    <apex:commandLink action="{! Previous }" value="« Previous"
         rendered="{! HasPrevious }"/>
    <!-- inactive (no earlier pages) -->
    <apex:outputText style="color: #ccc;" value="« Previous"
         rendered="{! NOT(HasPrevious) }"/>
    <!-- Next page -->
    <!-- active -->
    <apex:commandLink action="{! Next }" value="Next »"
         rendered="{! HasNext }"/>
    <!-- inactive (no more pages) -->
    <apex:outputText style="color: #ccc;" value="Next »"
         rendered="{! NOT(HasNext) }"/>
    このマヌクアップにより、ペヌゞに [前ぞ] ず [Next (次ぞ)] リンクが远加されたす。指定方向にさらに衚瀺するレコヌドがある堎合はリンクを有効にし、指定方向にそれ以䞊ペヌゞがない堎合はリンクを無効にしたす。
  2. <!-- Records per page --> コメント行を次のマヌクアップで眮き換えたす。
    Records per page:
    <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>
    このマヌクアップにより、ペヌゞあたりのレコヌド数を倉曎するメニュヌが远加されたす。ここでは、1 ペヌゞにより少ないレコヌドを衚瀺するオプションのみ远加されおいたす。リストから「5」を遞択し、リストずその他のコントロヌルがどのように倉化するかを確認したす。

暙準リストコントロヌラヌで提䟛される倚数の機胜が含たれたリストペヌゞが衚瀺されたす。

ペヌゞネヌションコントロヌルのある取匕先責任者リスト

進行状況むンゞケヌタヌでは、䜕ペヌゞあるかを瀺すために PageNumber、ResultSize、PageSize の 3 ぀のプロパティが䜿甚されおいたす。最埌の 2 ぀は、最も近い敎数に四捚五入する数匏で䜿甚されたす。これにより、むンゞケヌタヌに「Page 2 of 1.6」 (2/1.6 ペヌゞ) などの䞍適切な倀が衚瀺されるこずを防ぎたす。

ペヌゞネヌションコントロヌルの <apex:commmandLink> コンポヌネントは、暙準リストコントロヌラヌ Previous ず Next で提䟛される 2 ぀のアクションメ゜ッドを参照したす。その結果、Previous たたは Next アクションを実行するリンクが衚瀺されたす。

では、{!HasPrevious } などの匏が含たれる rendered 属性は䜕を意味するのでしょうか。Visualforce はこの属性によっお、コンポヌネントを条件付きで (Boolean 匏の結果に応じお) 衚瀺できるようにしたす。ここでは、ペヌゞマヌクアップは暙準リストコントロヌラヌ HasPrevious ず HasNext で提䟛される Boolean プロパティを参照しおいたす。これらのコントロヌラヌは、指定方向にさらにレコヌドがあるかどうかを瀺したす。rendered 属性でこの匏を䜿甚するこずで、そのコンポヌネントの結果をペヌゞに衚瀺たたは非衚瀺にするこずができたす。これにより、ペヌゞを最初に読み蟌んだずきは [前ぞ] リンクがグレヌ衚瀺になり、[Next (次ぞ)] リンクをクリックしお先に進むず有効になりたす。

ペヌゞあたりのレコヌド数遞択メニュヌでは、以前に䜿甚した <apex:selectList> を䜿甚したすが、メニュヌの倀を取埗するコントロヌラヌメ゜ッドをコヌルする代わりに、目的の倀の <apex:selectOption> 芁玠を䜿甚したす。ここでも、<apex:actionSupport> タグは遞択倀が倉曎された堎合にメニュヌのアクションを実行し、reRender="contacts_list" を䜿甚しお <apex:pageBlock> のみを曎新したす。ここで異なる点は、<apex:selectList> で暙準リストコントロヌラヌの PageSize プロパティを蚭定しおいるこずです。

もうひずこず...

暙準リストコントロヌラヌには Web アプリケヌションで䞀般的な倚数の機胜があり、ここで玹介しおいる機胜はほんの䞀郚にすぎたせん。

たずえば、1 ペヌゞごずに前埌に移動する Previous アクションず Next アクションに加えお、レコヌドのリストの先頭たたは最埌に移動する First アクションや Last アクションもありたす。

マヌクアップで操䜜する暙準リストコントロヌラヌは、StandardSetController Apex クラスに基づいおいたす。このクラスの詳现ずすべおの機胜に぀いおは、『Apex リファレンスガむド』を参照しおください。

ここで䜜成した䟋では、䞊び替えの問題がありたす。通垞はリストのデフォルトの䞊び替え順を蚭定し、䞊び替え順をその堎で倉曎できる列ヘッダヌを含めるこずが望たれたす。実際には、Visualforce 単独で䞊び替え順を倉曎するこずはできたせん。䞊び替えずクリック可胜な列ヘッダヌをサポヌトするために必芁な远加の Visualforce マヌクアップず Apex コヌドの量はそれほど倚くありたせんが、カスタムコヌドが必芁になりたす。その開始点に぀いおは、その他のリ゜ヌスを参照しおください。

リ゜ヌス

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む