【Salesforce】StandardControllerから取得したレコードから値が取得できない

【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();
              
              // データの確認等
          }
      }
      

      このような回答で大丈夫でしょうか。

      お勉強、頑張ってください。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です