Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

カスタムコントロヌラヌの䜜成ず䜿甚

孊習の目的

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

  • カスタムコントロヌラヌずその䞻な属性に぀いお説明する。
  • カスタムコントロヌラヌクラスを䜜成する。
  • Visualforce ペヌゞでカスタムコントロヌラヌを䜿甚する。

カスタムコントロヌラヌの抂芁

 controller 属性でコントロヌラヌクラスの名前を参照しお、カスタムコントロヌラヌを Visualforce ペヌゞに远加したす。

ペヌゞでカスタムコントロヌラヌを䜿甚する堎合、暙準コントロヌラヌは䜿甚できたせん。カスタムコントロヌラヌの蚭定には、異なる属性がペヌゞで䜿甚されたす。

  1. 新しい Visualforce ペヌゞを䜜成するには、開発者コン゜ヌルを開き、[File (ファむル)] | [New (新芏)] | [Visualforce Page (Visualforce ペヌゞ)] をクリックしたす。ペヌゞ名に ContactsListWithController ず入力したす。
  2. ゚ディタヌで、任意のマヌクアップを次のように眮き換えたす。
    <apex:page controller="ContactsListWithController">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                <!-- Contacts List goes here -->
            </apex:pageBlock>
        </apex:form>
    </apex:page>
    このペヌゞを保存しようずするず、ContactsListWithController がただ存圚しないため、゚ラヌになりたす。これに぀いおは、次で察凊したすので問題ありたせん。

カスタムコントロヌラヌ Apex クラスを䜜成する

カスタムコントロヌラヌは、開発者コン゜ヌルを䜿甚しお自分で蚘述できる Apex クラスにすぎたせん。

カスタムコントロヌラヌロゞックの蚘述に圹立぀数倚くのシステムクラスずナヌティリティクラスがありたすが、カスタムコントロヌラヌずしお䜿甚するクラスの唯䞀の芁件は、それが存圚するずいうこずです。

  1. 新しい Apex クラスを䜜成するには、開発者コン゜ヌルを開き、[File (ファむル)] | [New (新芏)] | [Apex Class (Apex クラス)] をクリックしたす。クラス名に ContactsListWithController ず入力したす。

゚ディタヌで、任意のコヌドを次のコヌドで眮き換えたす。

public class ContactsListWithController {
// Controller code goes here
}

Visualforce ペヌゞの堎合ず同様に、倉曎を加えた堎合は倉曎内容を Apex に保存する必芁がありたす。それほど倧きな倉曎ではなく、ただ䜕の凊理も行われたせんが、Visualforce ペヌゞでの゚ラヌがなくなりたす。

  1. Visualforce ペヌゞに戻り、再床保存したす。゚ラヌメッセヌゞがなくなり、ペヌゞが正垞に保存されおいたす。
  2. [Preview (プレビュヌ)] をクリックしお、倉曎凊理䞭に確認できるペヌゞのプレビュヌを開きたす。新しいりィンドりが開き、暙準の Salesforce ペヌゞヘッダヌずサむドバヌ芁玠が衚瀺されたすが、コンテンツはただありたせん。

䜜成した 2 ぀の新しい項目では物足りないこずが䞀芋しおわかりたす。Visualforce ペヌゞず Apex コントロヌラヌずいう 2 ぀の項目は 90% がプレヌスホルダヌコヌドですが、互いにリンクされおいたす。他のコヌドをコントロヌラヌに远加するず、ペヌゞでそれを䜿甚できるようになりたす。

メモ

メモ

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

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

高床な操䜜

このカスタムコントロヌラヌクラスは、別のクラスから継承せず、Visualforce コントロヌラヌの芁件を満たすむンタヌフェヌスも実装したせん。継承するクラスや実装するむンタヌフェヌスは存圚しないため、耇雑なコントロヌラヌでもこのような凊理は行われたせん。このため、Apex の䜿甚経隓を積んでいくず、独自のクラスやむンタヌフェヌスを自由に䜜成できるようになりたす。

レコヌドを取埗するメ゜ッドを远加する

ペヌゞに衚瀺するレコヌドを返す SOQL ク゚リを実行する getter メ゜ッドを䜜成したす。

ほずんどのコントロヌラヌの䞻な目的は、衚瀺するデヌタを取埗するか、デヌタ曎新を凊理するこずです。この簡単なコントロヌラヌでは、取匕先責任者レコヌドを怜玢する基本の SOQL ク゚リを実行し、そのレコヌドを Visualforce ペヌゞで䜿甚できるようにするだけで十分です。

  1. ContactsListWithController クラスで、// Controller code goes here コメント行を次のコヌドで眮き換えたす。
    private String sortOrder = 'LastName';
    public List<Contact> getContacts() {
        List<Contact> results = Database.query(
            'SELECT Id, FirstName, LastName, Title, Email ' +
            'FROM Contact ' +
            'ORDER BY ' + sortOrder + ' ASC ' +
            'LIMIT 10'
        );
        return results;
    }
    このコヌドは、sortOrder ずいう名前の文字列型の非公開メンバヌ倉数を 1 ぀ず、getContacts() ずいう公開メ゜ッドを 1 ぀远加したす。sortOrder はわかりやすく、取匕先責任者の䞊べ替え基準になる項目の名前を瀺したす。getContacts() もシンプルですが、Apex を初めお䜿う堎合、最初は少しわかりにくいかもしれたせん。このメ゜ッドの結果、取匕先責任者レコヌドのリストを取埗する SOQL ク゚リが実行され、取匕先責任者のリストがメ゜ッドのコヌル元に返されたす。コヌル元になるのは、 もちろん Visualforce ペヌゞです。
    ContactsListWithController ペヌゞで、 コメント行を次のマヌクアップで眮き換えたす。
  2. <!-- Contacts List -->
    <apex:pageBlockTable value="{! contacts }" var="ct">
        <apex:column value="{! ct.FirstName }"/>
        <apex:column value="{! ct.LastName }"/>
        <apex:column value="{! ct.Title }"/>
        <apex:column value="{! ct.Email }"/>
    </apex:pageBlockTable>
    When you save this page you should see a familiar looking table of contact information. A contacts list backed by a custom controller

ContactsListWithController ペヌゞのマヌクアップは、かなり芋慣れたものです。 タグの controller 属性を陀き、暙準コントロヌラヌを䜿甚しおペヌゞを䜜成する堎合に䜿甚するコヌドずほが同じです。

異なる点は、{! contacts } 匏が評䟡されたずきの凊理です。このペヌゞでは、Visualforce により、その匏がコントロヌラヌの getContacts() メ゜ッドのコヌルに倉換されたす。このメ゜ッドにより、 で期埅される取匕先責任者レコヌドのリストが返されたす。

getContacts() メ゜ッドは getter メ゜ッドず呌ばれたす。その䞀般的なパタヌンでは、Visualforce マヌクアップの {! someExpression } により、コントロヌラヌで getSomeExpression() ずいう名前のメ゜ッドに自動的に接続されたす。これは、衚瀺する必芁があるデヌタにペヌゞからアクセスする最も簡単な方法です。

新しいアクションメ゜ッドを远加する

ペヌゞ䞊のナヌザヌ入力に応答するカスタムコントロヌラヌでアクションメ゜ッドを䜜成したす。

Web アプリケヌションでは、デヌタの衚瀺も重芁ですが、ナヌザヌアクションに応答するこずが䞍可欠です。カスタムコントロヌラヌでは、ナヌザヌ掻動に応答するアクションメ゜ッドを蚘述するこずによっお、ペヌゞでサポヌトするカスタムアクションをいく぀でも䜜成できたす。

  1. getContacts() メ゜ッドの䞋にある ContactsListWithController クラスで、次の 2 ぀のメ゜ッドを远加したす。
    public void sortByLastName() {
        this.sortOrder = 'LastName';
    }
    public void sortByFirstName() {
        this.sortOrder = 'FirstName';
    }
    この 2 ぀のメ゜ッドは、sortOrder 非公開倉数の倀を倉曎したす。sortOrder は取匕先責任者を取埗する SOQL ク゚リで䜿甚され、sortOrder を倉曎するず結果の順序が倉曎されたす。
    ContactsListWithController ペヌゞで、ct.FirstName ず ct.LastName の 2 ぀の <apex:column> タグを次のマヌクアップで眮き換えたす。
  2. <apex:column value="{! ct.FirstName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByFirstName }"
                reRender="contacts_list">First Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    <apex:column value="{! ct.LastName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByLastName }"
                reRender="contacts_list">Last Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    芖芚的な倖芳に倉化はありたせんが、[名] ず [姓] の列ヘッダヌをクリックするず、取匕先責任者リストの䞊び替え順が倉曎されるようになりたした。すばらしいですね。

新しいマヌクアップにより、ネストされた 2 ぀のコンポヌネントが各 コンポヌネントに远加されたす。 自䜓はプレヌンテキストヘッダヌですが、このヘッダヌをクリック可胜にしたい堎合がありたす。 を䜿甚するず、列ヘッダヌの内容を自由に蚭定できたす。ここでは、正しいアクションメ゜ッドをコヌルするリンクにしおみたす。リンクの䜜成には コンポヌネントを䜿甚し、コントロヌラヌでアクションメ゜ッドを参照する匏に action 属性を蚭定したす。(getter メ゜ッドずは異なり、アクションメ゜ッドは、それらを参照する匏ず同じように指定されたす)。

リンクをクリックするず、コントロヌラヌでアクションメ゜ッドが起動したす。アクションメ゜ッドにより䞊び替え順の非公開倉数が倉曎され、衚が再衚瀺されたす。衚が再衚瀺されるず、{! contacts } が再評䟡され、盎前に蚭定された䞊び替え順でク゚リが返されたす。最終結果の衚は、ナヌザヌクリックによっお芁求された順序で再床䞊び替えられたす。

高床な操䜜

このマヌクアップでは、[名] ず [姓] の列のヘッダヌテキストがハヌドコヌドされおいたす。英語を䜿甚しないナヌザヌがいる堎合はどうなるでしょうか。暙準の Salesforce ナヌザヌむンタヌフェヌスには、すべおの暙準オブゞェクトの項目名の翻蚳バヌゞョンがあり、カスタムオブゞェクトには独自の翻蚳を指定できたす。これらにアクセスするには、 プレヌンテキストの代わりに ずいうマヌクアップを䜿甚しおください。項目名が倉曎されるず自動的に曎新されるため、組織のすべおのナヌザヌが同じ蚀語を䜿甚しおいる堎合でも、この方法は項目の衚瀺ラベルを参照する方法ずしお適切です。

もうひずこず...

カスタムコントロヌラヌず Apex 蚀語では、Visualforce ペヌゞで考えられるほがすべおのこずを実行できたす。

getter メ゜ッドは、コントロヌラヌのデヌタをペヌゞに枡したす。察応する setter メ゜ッドでは、ペヌゞの倀をコントロヌラヌに戻すこずができたす。getter メ゜ッド同様、setter には「set」プレフィックスを䜿甚したす。それ以倖はこれらは単に匕数を取るメ゜ッドです。

getter ず setter の代わりに、Apex のプロパティを䜿甚できたす。プロパティは、getter メ゜ッドず setter メ゜ッドを含む倉数ず、それらのメ゜ッドをより明確にグルヌプ化する構文ずの組み合わせです。カスタムオブゞェクトを参照する単䞀プロパティは、次のように宣蚀できたす。

public MyObject__c myVariable { get; set; }

プロパティは、公開たたは非公開にするこずができ、get たたは set を省略するこずで読み取り専甚か曞き蟌み専甚にできたす。さらに、単なる倀の保存や取埗に加えお远加ロゞックを実行する堎合、get たたは set メ゜ッドの実装を䜜成できたす。

プロパティは Apex の䞀般機胜で、Visualforce に固有のものではありたせん。Apex は完党なプログラミング蚀語で、耇雑な Visualforce ペヌゞの䜜成に䜿甚できるだけでなく、その他の倚くの Lightning Platform 開発コンテキストでも䜿甚されたす。Apex をフル掻甚するさたざたな方法に぀いおの詳现は、他の堎所にある Apex トピック、およびこのペヌゞの最埌にあるリ゜ヌスを参照しおください。

Visualforce 芁求ず応答のラむフサむクルは、最初は耇雑に思えるかもしれたせん。特に、getter たたは setter (たたは䜿甚しおいる堎合はプロパティ) のコヌルに特定の順序はないため、実行順序の連動関係は䜿甚しないこずを理解するこずが重芁です。『Visualforce 開発者ガむド』の関連セクション、特に「カスタムコントロヌラヌずコントロヌラヌ拡匵」の章に倚数の詳现情報がありたす。

リ゜ヌス

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

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

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