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

カスタムコントローラの作成

カスタムコントローラは、引数をとらないデフォルトのコンストラクタを外部の最上位クラスに使用する Apex クラスです。パラメータを含むカスタムコントローラコンストラクタを作成することはできません。

カスタムコントローラを作成する手順は、次のとおりです。
  1. [設定] で、[開発] | [Apex クラス] をクリックします。
  2. [新規] をクリックします。
  3. [バージョン設定] をクリックして、このクラスで使用する Apex および API のバージョンを指定します。組織が AppExchange から管理パッケージをインストールした場合、このクラスで使用する各管理パッケージのバージョンも指定できます。すべてのバージョンでデフォルト値を使用します。デフォルト値では、Apex および API についても、各管理パッケージについても、クラスを最新バージョンに関連付けます。最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は、管理パッケージの古いバージョンを指定することもできます。特定の動作を維持するには、Apex および API の古いバージョンを指定できます。
  4. クラスエディタで、クラスの Apex コードを入力します。1 つのクラスの長さは、最大 1,000,000 文字です。@isTest を使用して定義したコメント、テストメソッド、またはクラスは含みません。
  5. [保存] をクリックし、変更を保存してクラスの詳細画面に戻るか、[適用] をクリックし、変更を��存してクラスの編集を続行します。作成した Apex クラスは、クラスに保存する前に正しくコンパイルする必要があります。

次のクラスは、カスタムコントローラの単純な例です。

1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyController {
18
19    private final Account account;
20
21    public MyController() {
22        account = [SELECT Id, Name, Site FROM Account 
23                   WHERE Id = :ApexPages.currentPage().getParameters().get('id')];
24    }
25
26    public Account getAccount() {
27        return account;
28    }
29
30    public PageReference save() {
31        update account;
32        return null;
33    }
34}

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

1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="myController" tabStyle="Account">
18    <apex:form>
19        <apex:pageBlock title="Congratulations {!$User.FirstName}">
20            You belong to Account Name: <apex:inputField value="{!account.name}"/>
21            <apex:commandButton action="{!save}" value="save"/>
22        </apex:pageBlock>
23    </apex:form>
24</apex:page>

カスタムコントローラは、<apex:page> コンポーネントの controller 属性が使用されているため、ページと関連付けられています。

標準コントローラおよびコントローラ拡張と同様に、カスタムコントローラのメソッドは、関連付けられたページマークアップで {! } 表記を使って参照できます。上記の例では、getAccount メソッドは <apex:inputField> タグの value 属性で参照されており、<apex:commandButton> タグは、action 属性が設定された save メソッドを参照しています。

他の Apex クラスと同様に、すべてのカスタムコントローラはシステムモードで実行されます。したがって、現在のユーザの資格情報はコントローラのロジックの実行に使用されていないため、ユーザの権限と項目レベルのセキュリティは適用されません。

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

メモ

カスタムコントローラは、新しいレコードを作成する場合にも使用できます。次に例を示します。

1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class NewAndExistingController {
18
19    public Account account { get; private set; }
20
21    public NewAndExistingController() {
22        Id id = ApexPages.currentPage().getParameters().get('id');
23        account = (id == null) ? new Account() : 
24            [SELECT Name, Phone, Industry FROM Account WHERE Id = :id];
25    }
26
27    public PageReference save() {
28        try {
29            upsert(account);
30        } catch(System.DMLException e) {
31            ApexPages.addMessages(e);
32            return null;
33        }
34        //  After Save, navigate to the default view page:
35        return (new ApexPages.StandardController(account)).view();
36    }
37}
38

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

1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="NewAndExistingController" tabstyle="Account">
18    <apex:form>
19        <apex:pageBlock mode="edit">
20            <apex:pageMessages/>
21            <apex:pageBlockSection>
22                <apex:inputField value="{!Account.name}"/>
23                <apex:inputField value="{!Account.phone}"/>
24                <apex:inputField value="{!Account.industry}"/>
25            </apex:pageBlockSection>
26            <apex:pageBlockButtons location="bottom">
27                <apex:commandButton value="Save" action="{!save}"/>
28            </apex:pageBlockButtons>
29        </apex:pageBlock>
30    </apex:form>
31</apex:page>