この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

コントローラー拡張の作成

コントローラー拡張は、ApexPages.StandardController または CustomControllerName 型の単一の引数を取るコンストラクターが含まれる Apex クラスです。CustomControllerName は、拡張するカスタムコントローラーの名前です。

次のクラスは、コントローラー拡張の単純な例です。

1public class myControllerExtension {
2
3    private final Account acct;
4    
5    // The extension constructor initializes the private member
6    // variable acct by using the getRecord method from the standard
7    // controller.
8    public myControllerExtension(ApexPages.StandardController stdController) {
9        this.acct = (Account)stdController.getRecord();
10    }
11
12    public String getGreeting() {
13        return 'Hello ' + acct.name + ' (' + acct.id + ')';
14    }
15}

次の Visualforce マークアップは、上記のコントローラー拡張をページ内で使用する方法を示します。

1<apex:page standardController="Account" extensions="myControllerExtension">
2    {!greeting} <p/>
3    <apex:form>
4        <apex:inputField value="{!account.name}"/> <p/>
5        <apex:commandButton value="Save" action="{!save}"/>
6    </apex:form>
7</apex:page>

拡張は、<apex:page> コンポーネントの extensions 属性を使用してページに関連付けられます。

すべてのコントローラーメソッドと同様に、ページマークアップで {! } 表記を使用して、コントローラー拡張メソッドを参照できます。上記の例では、ページ上部の {!greeting} 式は、コントローラー拡張の getGreeting メソッドを参照しています。

この拡張は、Account 標準コントローラーと共に機能するため、標準コントローラーメソッドも利用できます。たとえば、<apex:inputField> タグの value 属性は、標準コントローラー機能を使用して���引先の名前を取得します。同様に、<apex:commandButton> タグは、action 属性のある標準 Account の save メソッドを参照します。

カンマ区切りのリストを使って、単一のページに対し複数のコントローラー拡張を定義できます。これにより、同じ名前のメソッドを上書きできます。たとえば、次のようなページがあったとします。
1<apex:page standardController="Account" 
2    extensions="ExtOne,ExtTwo" showHeader="false">
3    <apex:outputText value="{!foo}" />
4</apex:page>
さらに、次の拡張があったとします。
1public class ExtOne {
2    public ExtOne(ApexPages.StandardController acon) { }
3
4    public String getFoo() {
5        return 'foo-One';
6    }
7}
1public class ExtTwo {
2    public ExtTwo(ApexPages.StandardController acon) { }
3
4    public String getFoo() {
5        return 'foo-Two';
6    }
7}
<apex:outputText> コンポーネントの値は、foo-One として表示されます。上書きは、一番左の拡張、つまりカンマ区切りリストの最初の拡張で定義されているメソッドによって定義されます。したがって、ExtOnegetFoo メソッドは、ExtTwo のメソッドを上書きします。

他の Apex クラスと同様に、コントローラー拡張はシステムモードで実行します。したがって、現在のユーザーの資格情報はコントローラーのロジックの実行に使用されていないため、ユーザーの権限と項目レベルのセキュリティは適用されません。ただし、コントローラー拡張が標準コントローラーを拡張する場合、標準コントローラーのロジックはシステムモードで実行されません。代わりに、ユーザーモードで実行されます。このモードでは現在のユーザーの権限、項目レベルのセキュリティ、共有ルールが適用されます。

クラスの定義で with sharing キーワードを使用することによって、コントローラー拡張でユーザーの組織の共有設定、ロール階層、および共有ルールを適用するかを選択できます。詳細は、『Apex 開発者ガイド』の「with sharingwithout sharinginherited sharing キーワードの使用」を参照してください。

メモ