[Salesforce]Visualforceページで静的リソース参照

Visualforceページで静的リソース参照

Visualforce マークアップで静的リソースを参照する方法は、単独ファイルを参照するのか、またはアーカイブ (zip ファイルや .jar ファイルなど) に含まれるファイルを参照するのかによって異なります。

単独ファイルを参照するには、差し込み項目として $Resource.<resource_name> を使用します。このとき、<resource_name> は、リソースをアップロードしたときに指定した名前です。次に例を示します。

<apex:image url="{!$Resource.TestImage}" width="50" height="50"/>

又は

<apex:includeScript value="{!$Resource.MyJavascriptFile}"/>

アーカイブ内のファイルを参照するには、URLFOR 関数を使用します。最初のパラメータには、そのアーカイブをアップロードしたときに指定した静的リソース名を、第 2 パラメータには、アーカイブ内での目的ファイルへのパスを指定します。たとえば、次のとおりです。次に例を示します。

<apex:image url="{!URLFOR($Resource.TestZip,
                  'images/Bluehills.jpg')}" width="50" height="50"/>

又は

<apex:includeScript value="{!URLFOR($Resource.LibraryJS, '/base/subdir/file.js')}"/>

[Salesforce]StandardSetControllerテストクラス

StandardSetControllerテストクラス

Apexクラス

/*
testページコントローラ
*/
public with sharing class testController {

    //testページへ渡す対象Idリスト
    public String testIdList { get;set; }

    //コンストラクタ
    public testController( ApexPages.StandardSetController controller ){

        //初期化
        List<test__c> testList = new List<test__c>();
        Set<Id> testIdSet = new Set<Id>();
        this.testIdList =  '';

        //testページで選択済みIdリスト取得
        for(test__c testObj : (List<test__c>) controller.getSelected()){
            testIdSet.add(testObj.Id);
        }

        //testページで選択済みリスト取得
        testList = gettestList(testIdSet);
        System.debug('testList.size() : ' + testList.size());

        //testページへ渡す対象Idリスト取得
        Integer cnt = 1;
        if(testList.size() > 0){
            for(test__c testObj : testList){
                if(cnt == 1){
                    this.testIdList += String.valueOf(testObj.id);
                }
                else{
                    this.testIdList += ',';
                    this.testIdList += String.valueOf(testObj.id);
                }
                cnt += 1;
            }
        }
        System.debug('this.testIdList : ' + this.testIdList);

    }

    //testページで選択済みリストからtestページへ渡す対象取得
    private List<test__c> gettestList(Set<Id> testIdSet){

        return [SELECT Id
                        , test__c  // test
                FROM
                    test__c
                WHERE
                    Id IN : testIdSet
                AND
                    test__c = 'test'
                ORDER BY Id
                ];

    }
}

Apexテストクラス

/*
testページコントローラテストクラス
*/
@isTest
private class testControllerTest {

    //正常ケース
    //対象レコード数:1件
    @isTest static void UnitTest1() {

        //testレコード作成
        List<test__c> testList = new List<test__c>();
        test__c test = inserttest();
        testList.add(test);

        // VisualForceのページリファレンスを取得
        PageReference prRef = Page.test;

        // カレントページにVisalForceページをセット
        Test.setCurrentPage(prRef);

        // テスト開始
        Test.startTest();

        // StandardSetControllerのコンストラクタ
        ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(testList);
        ssc.setSelected(testList);
        testController bbController = new testController(ssc);

        // テスト終了
        Test.stopTest();

    }

    //正常ケース
    //対象レコード数:2件
    @isTest static void UnitTest2() {

        //testレコード作成
        List<test__c> testList = new List<test__c>();
        test__c test1 = inserttest();
        test__c test2 = inserttest();
        testList.add(test1);
        testList.add(test2);

        // VisualForceのページリファレンスを取得
        PageReference prRef = Page.test;

        // カレントページにVisalForceページをセット
        Test.setCurrentPage(prRef);

        // テスト開始
        Test.startTest();

        // StandardSetControllerのコンストラクタ
        ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(testList);
        ssc.setSelected(testList);
        testController bbController = new testController(ssc);

        // テスト終了
        Test.stopTest();

    }

    //異常ケース
    //対象レコード数:0件
    @isTest static void UnitTest3() {

        //testレコード作成
        List<test__c> testList = new List<test__c>();
        test__c test = inserttest2();
        testList.add(test);

        // VisualForceのページリファレンスを取得
        PageReference prRef = Page.test;

        // カレントページにVisalForceページをセット
        Test.setCurrentPage(prRef);

        // テスト開始
        Test.startTest();

        // StandardSetControllerのコンストラクタ
        ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(testList);
        ssc.setSelected(testList);
        testController bbController = new testController(ssc);

        // テスト終了
        Test.stopTest();

    }

    //testレコード作成
    //test:test
    private static test__c inserttest(){

        test__c  test = new test__c();
        test.Name = 'test';
        test.test__c = 'test';
        insert test;

        return test;

    }

    //testレコード作成
    //test:test以外
    private static test__c inserttest2(){

        test__c  test = new test__c();
        test.Name = 'test';
        insert test;

        return test;

    }
}

[Salesforce]Apexテストクラス作成

テストメソッドは isTest アノテーションを使用して定義し、次の構文を使用します。

@isTest static void testName() {
    // code_block
}

テストメソッドは、テストクラス (isTest アノテーションが付加されているクラス) で定義されている必要があります。次のサンプルクラスは、テストメソッドが 1 つあるテストクラスの定義を示しています。

@isTest
private class MyTestClass {
    @isTest static void myTest() {
        // code_block
    }
}

[Salesforce]JSENCODE

JSENCODE

バックスラッシュ (\) などのエスケープ文字をアポストロフィー (‘) などの安全でない JavaScript 文字の前に挿入して、JavaScript で使用するテキスト文字列や差し込み項目値をエンコードします。

ページの読み込み時に JavaScript が実行され、アラートが表示されます。

<script>var ret = "foo";alert('xss');//";</script>

この場合、JavaScript が実行されないように、JSENCODE 関数を使用します。例

<script>var ret = "{!JSENCODE($CurrentPage.parameters.retURL)}";</script>

[Salesforce]AggregateResultリストから項目値取得

AggregateResultリストから項目値取得

        List<String> testQueueUserIdList = new List<String>();

        for(AggregateResult gmObj : [SELECT UserOrGroupId, COUNT( Id ) 
                                FROM GroupMember 
                                WHERE GroupId IN ( SELECT Id FROM Group WHERE Type = 'Queue' And DeveloperName = 'testQueue') 
                                GROUP BY UserOrGroupId]){
            testQueueUserIdList.add(String.valueOf(gmObj.get('UserOrGroupId')));
        }
        System.debug('testQueueUserIdList : ' + testQueueUserIdList);

[Salesforce]inherited sharing

inherited sharing

クラスで inherited sharing キーワードを使用して、そのコール元のクラスの共有モードでクラスを実行します。

この例では、inherited sharing のある Apex クラスとその Apex コードの Visualforce 呼び出しを宣言します。inherited sharing 宣言により、実行ユーザが共有アクセス権を持つ取引先責任者のみが表示されます。この宣言が省略されている場合、安全でないデフォルトの動作により、ユーザが参照権限を持たない取引先責任者も表示されます。

public inherited sharing class InheritedSharingClass {
    public List<Contact> getAllTheSecrets() {
        return [SELECT Name FROM Contact];
    }
}

[Salesforce]Apex コントローラでの内部クラスの使用

Apex コントローラでの内部クラスの使用

public with sharing class SampleController {

    //Sample用
    public SampleSetting Sample {get;set;}

    // コンストラクタ
    public SampleController(){
        //初期処理
        init();
    }

    //初期処理
    private void init(){
        //Sample
        SampleSet();
    }


    //Sample
    private void SampleSet(){

        // カスタム[SampleSetting]から情報取得
        SampleSetting__c mc = SampleSetting__c.getOrgDefaults();
        mc = SampleSetting__c.getOrgDefaults();

        this.Sample =  new SampleSetting();
        this.Sample.Sample_Key = mc.Sample_Key__c;
    }

    //Sampleクラス
    public class SampleSetting {

        public String Sample_Key {get;set;}

        public SampleSetting(){
            this.Sample_Key = '';
        }
            
    }

}