【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
インスタンス化した標準コントローラを引数にして、コントローラクラスのコンストラクタを動かすことが出来ます。
このような回答で大丈夫でしょうか。
お勉強、頑張ってください。