標準コントローラの使用
学習の目的
Visualforce 標準コントローラーの概要
MVC 設計パターンでは、表示やスタイルを、基盤となるデータベースとロジックから簡単に分離することができます。MVC では、ビュー (Visualforce ページ) はコントローラーと連動し、コントローラーによってページに機能が提供されます。たとえば、コントローラーにはボタンをクリックしたときに実行されるロジックが実装されています。また、多くの場合、コントローラーはビューに表示するデータを利用可能にしたり、変更内容をデータベースに戻したりするモデル (データベース) とのやり取りも行います。
大部分の標準オブジェクトとすべてのカスタムオブジェクトには、オブジェクトに関連付けられたデータを操作するための標準コントローラーが用意されており、コントローラーのコードを自分で記述しなくても済むようになっています。必要に応じて、標準コントローラーを拡張して新しい機能を追加したり、カスタムコントローラーをゼロから作成したりすることも可能です。ここでは、標準コントローラーについて学習します。
レコード 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 の追加によって、そのレコードが読み込まれてページで使用可能になるため、標準コントローラーを利用できるようになっています。
pageName
をページ名に置き換えることを忘れないでください。$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName"}).fire();
$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/>
完全なコードは次のようになります。<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>
これで、1 つの取引先の概要が表示されます。
- ページが読み込まれて
<apex:page>
コンポーネントが有効になったときに、取引先オブジェクトの標準コントローラーが有効化されます。 - 標準コントローラーによって URL 内の ID パラメーターが表示され、該当する取引先レコードを検索して取得します。
- 標準コントローラーは、取得したレコードを変数に代入してページで使用可能にします。変数には、標準コントローラーの sObject (Account) と同じ名前が付きます。これはオブジェクト変数で、Account sObject で使用可能なすべての項目が含まれます。
- 4 つの Visualforce 式すべてが Account 変数を参照します。ドット表記を使用して、Account 変数内の個々の項目にアクセスします。したがって
{! Account.Name }
は取引先の名前を取得し、以降も同様に処理されます。
ただし、収益の数値の書式は不適切です。科学的記数法で表示されています。代わりに通貨で表示するにはどうすればよいでしょうか。
数値が科学的記数法の「未加工」値で表示されている理由は、式によって数値が直接出力されているためです。ページには未加工値がそのまま表示されています。値の書式設定をコントロールするには、コンポーネントを使用し、コンポーネントに値を渡して処理する必要があります。コンポーネントが未加工値を取得して適切な書式に変更し、結果をページに出力します。この方法については、別の場所で説明します。ここでは、レコードデータへのアクセスのみが学習対象です。
もうひとこと...
ここで説明されている簡単なデータアクセスに加えて、標準コントローラーでは、ボタンやリンクなどの標準ユーザーインターフェース要素を使用してページに追加できる、作成、編集、保存、削除などの一連の標準アクションも使用できます。Visualforce 入力フォームや、データベースへの変更の保存について学習するときに、これらの標準アクションの詳細を確認できます。
オブジェクトのページレイアウト内に埋め込む Visualforce ページは、オブジェクト固有のカスタムアクションとして使用するか、関連オブジェクトの標準コントロールの使用が必要な Salesforce アプリケーションのモバイルカードとして使用します。
取引先オブジェクトなどの標準オブジェクトではなく、独自に作成したカスタムオブジェクトの項目を参照する場合は、上記とは異なる手順を実行する必要があります。[設定] から [クイック検索] ボックスに「オブジェクトマネージャー」と入力し、[オブジェクトマネージャー] | <カスタムオブジェクト> | [項目とリレーション] を選択します。項目を見つけて選択します。カスタムオブジェクトの場合、Visualforce ページでの設定で使用する項目の名前は、[API 参照名] 項目に表示されます。たとえば、Foo という項目の API 参照名が Foo__c である場合、コード内で {! myobject__c.foo__c}
のように指定を行えば、項目を参照できます。
標準コントローラーは強力ですが、別のコントローラーが必要になる場合もあります。Visualforce はその場合にも問題なく対応できます。標準コントローラーはいつでも置き換えや補強が可能で、Apex コードを使用して、独自のコントローラーや組み込みコントローラーの拡張機能を作成できます。