標準コントローラーの使用
学習の目的
この単元を完了すると、次のことができるようになります。
- Visualforce 標準コントローラーの概要とその主な属性について説明する。
- 標準コントローラーを Visualforce ページに追加する。
- ページの標準コントローラーで取得されたレコードのデータを表示する。
- ドット表記を使用して関連レコードの項目にアクセスする式を記述する。
Visualforce 標準コントローラーの概要
Visualforce は従来の MVC (Model–View–Controller: モデル–ビュー–コントローラー) を使用します。標準アクションとデータアクセスを処理する高度な組み込みコントローラーが含まれ、Lightning Platform データベースとの簡単かつ緊密なインテグレーションを提供します。これらの組み込みコントローラーは、一般的に標準コントローラーと呼ばれ、究極の標準コントローラーとみなされることもあります。
MVC 設計パターンでは、表示やスタイルを、基盤となるデータベースとロジックから簡単に分離することができます。MVC では、ビュー (Visualforce ページ) はコントローラーと連動し、コントローラーによってページに機能が提供されます。たとえば、コントローラーにはボタンをクリックしたときに実行されるロジックが実装されています。また、多くの場合、コントローラーはビューに表示するデータを利用可能にしたり、変更内容をデータベースに戻したりするモデル (データベース) とのやり取りも行います。
大部分の標準オブジェクトとすべてのカスタムオブジェクトには、オブジェクトに関連付けられたデータを操作するための標準コントローラーが用意されており、コントローラーのコードを自分で記述しなくても済むようになっています。必要に応じて、標準コントローラーを拡張して新しい機能を追加したり、カスタムコントローラーをゼロから作成したりすることも可能です。ここでは、標準コントローラーについて学習します。
レコード ID を検索して要求 URL に追加する
レコードのレコード ID を要求 URL のパラメーターとして追加することで、標準コントローラーに渡します。
標準コントローラーを使用して特定のレコードを参照する場合、コントローラーが対象レコードのレコード識別子または ID を認識する必要があります。コントローラーは ID を使用してデータを取得し、レコードのデータが変更されたときにデータベースに戻して保存します。
Visualforce ページを組織の他のページに連携させる場合、レコードの ID が自動的に渡されるようにすることで、Visualforce ページで ID を使用してそのレコードのデータを検索し、表示できます。ただし、開発中のページは単体で実行されているため、データベースのレコードのデータをページに表示するには、レコード ID を手動で渡す必要があります。要求 URL の GET パラメーターで ID を追加すると、この処理を最も簡単に行うことができます。
- 新しい Visualforce ページを作成するには、開発者コンソールを開き、[File (ファイル)] | [New (新規)] | [Visualforce Page (Visualforce ページ)] をクリックします。ページ名に
AccountSummary
と入力します。
- エディターで、任意のマークアップを次のように置き換えます。このマークアップは、いくつかの便利な情報を追加できるボックスを作成します。
<apex:page> <apex:pageBlock title="Account Summary"> <apex:pageBlockSection> </apex:pageBlockSection> </apex:pageBlock> </apex:page>
-
[Preview (プレビュー)] をクリックして、変更処理中に確認できるページのプレビューを開きます。プレビューウィンドウに URL 項目が表示されることを確認してください。数ステップ後にこのウィンドウに戻ります。
- 別のブラウザーウィンドウで組織のホームページに移動し、[取引先] タブを選択します。[取引先] タブが表示されない場合は、右上隅のアプリケーションメニューから [セールス] を選択して、セールスアプリケーションに切り替えます。
- ビューメニューに [すべての取引先] が表示されていることを確認します。
- [すべての取引先] ページで、取引先名をクリックします。
- 取引先詳細ページの読み込みが完了したら、ページの URL を確認します。URL は、
https://MyDomainName.lightning.force.com/lightning/r/Account/001D000000JRBes/view
のようになります。レコードを識別するための ID は、一連の文字と数字から構成されます。この例では、001D000000JRBes
です (これは組織によって異なります)。この ID は、組織内のすべてのオブジェクト種別のすべてのレコードで一意です。
- レコード ID を選択してクリップボードにコピーします。取引先詳細ページから移動する前に、ページ全体と表示されている情報を確認します。[代替テキスト: 取引先詳細ページ] これはレコード ID を取得するためだけの迂回ではありません。ここでの処理の完了時には、自分自身で Visualforce コードを使用して、同じ情報を表示するページを作成する方法を把握できるようになります。
- 開発者コンソールから開いたプレビューページに切り替えます。ブラウザーウィンドウの URL 項目をクリックし、URL の末尾に
&id=
と入力してから、直前にコピーしたレコード ID を貼り付けます。URL は、https://MyDomainName.lightning.force.com/apex/AccountSummary?core.apexpages.request.devconsole=1&id=001D000000JRBes
のようになります。 - Enter キーを押して、新しい URL でページを読み込みます。
このレコード ID で読み込まれたプレビューページは変わっていないように見えますが、ID の追加によって、そのレコードが読み込まれてページで使用可能になるため、標準コントローラーを利用できるようになっています。
Lightning Experience のコンテキストでページを表示するには、取引先詳細ページが表示されるメインのブラウザーウィンドウに戻ります。取引先の詳細ページから、ブラウザーの JavaScript コンソールを開いて次のコードを入力します。pageName
をページ名に置き換えることを忘れないでください。
$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName"}).fire();
同様に、JavaScript で URL の末尾にレコード ID パラメーターを追加して、レコード ID でページをプレビューすることもできます。
$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName?id=00141000004jkU0AAI"}).fire();
単一レコードのデータを表示する
取引先の標準コントローラーをページに追加し、取引先項目を参照してレコードのデータを表示します。
前のセクションで読み込んだページ URL から次の手順に従って、取引先の概要を表示するページを作成します。
- ページマークアップの先頭で、
<apex:page>
タグ内に次の属性を追加します。standardController="Account"
ここでページを保存すると、以前と同様のプレビューページが再読み込みされますが、ここでは取引先の標準コントローラーが有効になっています。ページの読み込み時に、標準コントローラーは URL のパラメーターを解析して id パラメーターを検索し、その値でレコードを取得してページで使用可能にします。ここではまだ表示されていませんが、すでに装備されています。
- ページのボディで、次のマークアップを追加します。
Name: {! Account.name }
これでレコードが取得されました。URL に追加したレコード ID の取引先の名前が表示されます。
- 取引先名が含まれるこの 1 行を、次のマークアップで置き換えます。完全なコードは次のようになります。
Name: {! Account.Name } <br/> Phone: {! Account.Phone } <br/> Industry: {! Account.Industry } <br/> Revenue: {! Account.AnnualRevenue } <br/>
これで、1 つの取引先の概要が表示されます。<apex:page standardController="Account"> <apex:pageBlock title="Account Summary"> <apex:pageBlockSection> Name: {! Account.Name } <br/> Phone: {! Account.Phone } <br/> Industry: {! Account.Industry } <br/> Revenue: {! Account.AnnualRevenue } <br/> </apex:pageBlockSection> </apex:pageBlock> </apex:page>
ここでは、標準コントローラーによって多くの処理が行われています。
- ページが読み込まれて
<apex:page>
コンポーネントが有効になったときに、取引先オブジェクトの標準コントローラーが有効化されます。
- 標準コントローラーによって URL 内の ID パラメーターが表示され、該当する取引先レコードを検索して取得します。
- 標準コントローラーは、取得したレコードを変数に代入してページで使用可能にします。変数には、標準コントローラーの sObject (Account) と同じ名前が付きます。これはオブジェクト変数で、Account sObject で使用可能なすべての項目が含まれます。
- 4 つの Visualforce 式すべてが Account 変数を参照します。ドット表記を使用して、Account 変数内の個々の項目にアクセスします。したがって、
{!Account.Name }
は取引先の名前を取得し、以降も同様に処理されます。
ただし、収益の数値の書式は不適切です。科学的記数法で表示されています。代わりに通貨で表示するにはどうすればよいでしょうか。
数値が科学的記数法の「未加工」値で表示されている理由は、式によって数値が直接出力されているためです。ページには未加工値がそのまま表示されています。値の書式設定をコントロールするには、コンポーネントを使用し、コンポーネントに値を渡して処理する必要があります。コンポーネントが未加工値を取得して適切な書式に変更し、結果をページに出力します。この方法については、別の場所で説明します。ここでは、レコードデータへのアクセスのみが学習対象です。
リレーションが設定されたレコードの項目を表示する
ドット表記を使用して、関連レコードのデータを表示します。
取引先レコードの詳細ページに [取引先 所有者] という項目があります。取引先オブジェクトの項目のリストを確認すると、この項目のデータ型は [参照関係 (ユーザー)] となっています。これは、この項目がユーザーレコードとリレーションを持つことを示しています。続いて、[取引先 所有者] 項目の表示ラベルのリンクをクリックして [項目名] が [所有者] であることを確認します。
Owner はユーザーとリレーションを持っています。[Setup (設定)] から [Object Manager (オブジェクトマネージャー)] | [User (ユーザー)] | [Fields & Relationships (項目とリレーション)] に移動すると、そのユーザーに [Name (名前)] 項目が表示されます。この情報を使用して表示してみましょう。
ページのボディで、取引先名の前に次の行を追加します。
Account owner: {! Account.Owner.Name } <br/>
Account.Owner.Name
のドット (.) 表記は、各レコードが参照関係にあることを示しています。Account.Owner
は、取引先レコードの [取引先 所有者] 項目を示します。「Owner」の後に「Name」が続いているのは、Owner 項目が単純に文字列を格納する項目ではなく、別のレコードを参照して値を取得する項目であるためです (これは、先ほど確認したデータ型 [参照関係 (ユーザー)] に対応します)。accountDisplay ページが [取引先 所有者] 項目の値を表示するには、その項目の参照先となるユーザーレコードの [名前] 項目の値を参照することが必要です。
もうひとこと...
標準コントローラーは非常に強力です。ここで学習した内容はほんの一部にすぎません。別の場所でその他多くを学びことになりますが、いくつかの注目点を次に示します。
ここで説明されている簡単なデータアクセスに加えて、標準コントローラーでは、ボタンやリンクなどの標準ユーザーインターフェース要素を使用してページに追加できる、作成、編集、保存、削除などの一連の標準アクションも使用できます。Visualforce 入力フォームや、データベースへの変更の保存について学習するときに、これらの標準アクションの詳細を確認できます。
オブジェクトのページレイアウト内に埋め込む Visualforce ページは、オブジェクト固有のカスタムアクションとして使用するか、関連オブジェクトの標準コントロールの使用が必要な Salesforce アプリケーションのモバイルカードとして使用します。
取引先オブジェクトなどの標準オブジェクトではなく、独自に作成したカスタムオブジェクトの項目を参照する場合は、上記とは異なる手順を実行する必要があります。[Setup (設定)] から [Quick Find (クイック検索)] ボックスに「Object Manager」(オブジェクトマネージャー) と入力し、[Object Manager (オブジェクトマネージャー)] | <各自のカスタムオブジェクト> | [Fields & Relationships (項目とリレーション)] を選択します。項目を見つけて選択します。カスタムオブジェクトの場合、Visualforce ページでの設定で使用する項目の名前は、[API 参照名] 項目に表示されます。たとえば、Foo という項目の API 参照名が Foo__c である場合、コード内で {!myobject__c.foo__c}
のように指定を行えば、項目を参照できます。
標準コントローラーは強力ですが、別のコントローラーが必要になる場合もあります。Visualforce はその場合にも問題なく対応できます。標準コントローラーはいつでも置き換えや補強が可能で、Apex コードを使用して、独自のコントローラーや組み込みコントローラーの拡張機能を作成できます。
リソース
- Visualforce 開発者ガイド: Standard Controllers (標準コントローラー)
- Visualforce 開発者ガイド: Standard List Controllers (標準リストコントローラー)
- Salesforce 開発者ブログ: Twitter Bootstrap and Visualforce in Minutes (Twitter Bootstrap を使用して Visualforce ページを数分で作成)