【Salesforce】StandardControllerから取得したレコードから値が取得できない
Visualforceのコントローラを標準コントローラを使用してした場合、コンストラクタの標準コントローラからレコードを取得することができます。
そのレコードの項目について、取得されていない項目があったのでメモです。
ページでは標準コントローラを拡張したクラスをコントローラとしています。
会社名とFAXのみ表示していることが分かります。
<apex:page
standardController="Account"
extensions="AccountEditController">
<apex:form >
<apex:outputfield value="{!Account.Name}" />
<apex:outputfield value="{!Account.Fax}" />
</apex:form>
</apex:page>
コントローラでは、コンストラクタで標準コントローラからレコードの取得を行っています。
標準コントローラからレコードを取得し、ログに表示しています。
public with sharing class AccountEditController {
/**
* コンストラクタ
*/
public AccountEditController(ApexPages.StandardController controller){
// 標準コントローラからレコードを取得する
system.debug('【ログ】' + controller.getRecord());
}
}
このページに取引先を設定して表示します。
/apex/AccountEdit?id={取引先.Id}
デバッグログに表示される取引先は、こうなっています。
※実際にはレコードに設定された値が入っています。
【ログ】Account:{Fax={!Account.Fax}, Id={!Account.Id}, Name={!Account.Name}}
Id、会社名、Faxが項目に設定されていました。
察しがつくかと思いますが、画面で使用している項目のみが取得されているのです。
つまり、画面で使用していない項目をコントローラで使用すると、値が入っていません。
画面に表示しない項目をコントローラで判定に使う際には注意が必要ですね。
表示したくない項目をコントローラで使用する場合は、このようにできます。
<apex:page
standardController="Account"
extensions="AccountEditController">
<apex:form >
<apex:outputfield value="{!Account.Name}" />
<apex:outputfield value="{!Account.Fax}" />
<apex:outputfield value="{!Account.Phone}" rendered="false" />
</apex:form>
</apex:page>
renderedにfalseを設定すれば、表示されませんね。
これでもコントローラ側のレコードに項目が設定されていました。
2 Responses to "【Salesforce】StandardControllerから取得したレコードから値が取得できない"
勉強になりました!
ちなみにテストクラスはどのような記述になりますでしょうか?
当方、ただいまApex勉強中でご教授いただけると幸いです。
>STATさん
お役に立てたようで何よりです。
標準コントローラを拡張したコントローラのテストクラスについてです。
標準コントローラはSObjectを引数にしてインスタンス化することが出来ます。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_pages_standardcontroller.htm
インスタンス化した標準コントローラを引数にして、コントローラクラスのコンストラクタを動かすことが出来ます。
@IsTest public class AccountEditControllerTest { /** * コンストラクタのテスト */ private static testMethod void testMethod01(){ AccountEditController controller; ApexPages.StandardController sc; Account acc; // 取引先を作成する acc = new Account(); acc.Name = 'テスト取引先'; insert acc; // 標準コントローラを作成する sc = new ApexPages.StandardController(acc); // テスト開始 Test.startTest(); // コンストラクタのテスト controller = new AccountEditController(sc); // テスト終了 Test.stopTest(); // データの確認等 } }このような回答で大丈夫でしょうか。
お勉強、頑張ってください。