カスタムオブジェクトおよびパッケージでの動的参照の使用
パッケージ開発者は動的 Visualforce バインドを使用して、ユーザがアクセスできる項目のみをリストできます。これが必要になるのは、オブジェクトの項目を表示する Visualforce ページを含む管理パッケージを開発する場合などです。パッケージ開発者は登録者がアクセスできる項目がわからないため、動的ページを定義して登録者ごとに表示を変えることができます。次の例は、Visualforce ページを使用するページレイアウトと一緒にパッケージされたカスタムオブジェクトを使用して、異なる登録ユーザに同じページを表示する方法を示します。
- Book という名前で次の項目とデータ型を持つカスタムオブジェクトを作成します。
- Title: Text(255)
- Author: Text(255)
- ISBN: Text(13)
- Price: Currency(4, 2)
- Publisher: Text(255)
- レイアウトを変更し、上記のカスタム項目が表示されて、作成者、最終更新者、所有者、名前などの標準項目が削除されるようにします。
- 新規カスタムオブジェクトタブを作成します。オブジェクトを Book に、タブスタイルを Books に設定します。
- [Book] タブに切り替えて、Book オブジェクトをいくつか作成します。このチュートリアルでは、項目内のデータは実際には関係ありません。
- 次のコードで bookExtension という名前のコントローラ拡張を作成します。
1swfobject.registerObject("clippy.codeblock-0", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public with sharing class bookExtension { 18 private ApexPages.StandardController controller; 19 20 private Set<String> bookFields = new Set<String>(); 21 22 public bookExtension (ApexPages.StandardController controller) { 23 this.controller = controller; 24 Map<String, Schema.SobjectField> fields = 25 Schema.SobjectType.Book__c.fields.getMap(); 26 27 for (String s : fields.keySet()) { 28 // Only include accessible fields 29 if (fields.get(s).getDescribe().isAccessible() && 30 fields.get(s).getDescribe().isCustom()) { 31 bookFields.add(s); 32 } 33 } 34 } 35 36 public List<String> availableFields { 37 get { 38 controller.reset(); 39 controller.addFields(new List<String>(bookFields)); 40 return new List<String>(bookFields); 41 } 42 } 43} - このコントローラ拡張を使用して Book オブジェクトの値を表示する、booksView という名前の 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 standardController="Book__c" extensions="bookExtension" > 18 19 <br/> 20 <apex:pageBlock title="{!Book__c.Name}"> 21 <apex:repeat value="{!availableFields}" var="field"> 22 23 <h2><apex:outputText 24 value="{!$ObjectType['Book__c'].Fields[field].Label}"/></h2> 25 <br/> 26 <apex:outputText value="{!Book__c[field]}" /><br/><br/> 27 28 </apex:repeat> 29 </apex:pageBlock> 30 31</apex:page> 32 - コントローラ拡張はパッケージ化されるため、Apex クラスのテストを作成する必要があります。手始めに次の基本的なコードで bookExtensionTest という名前の Apex クラスを作成します。
1swfobject.registerObject("clippy.codeblock-2", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public with sharing class bookExtension { 18 19 private ApexPages.StandardController controller; 20 private Set<String> bookFields = new Set<String>(); 21 22 public bookExtension (ApexPages.StandardController controller) { 23 this.controller = controller; 24 Map<String, Schema.SobjectField> fields = 25 Schema.SobjectType.Book__c.fields.getMap(); 26 27 for (String s : fields.keySet()) { 28 // Only include accessible fields 29 if (fields.get(s).getDescribe().isAccessible() && 30 fields.get(s).getDescribe().isCustom()) { 31 bookFields.add(s); 32 } 33 } 34 controller.addFields(new List<String>(bookFields)); 35 } 36 37 public List<String> availableFields { 38 get { 39 controller.reset(); 40 controller.addFields(new List<String>(bookFields)); 41 return new List<String>(bookFields); 42 } 43 } 44} - bookBundle という名前のパッケージを作成し、カスタムオブジェクト、Visualforce ページ、bookExtensionTest Apex クラスを追加します。その他の参照される要素は自動的に含められます。
- bookBundle パッケージを登録者組織にインストールします。
- パッケージをインストールしたら、[設定] で をクリックし、[本] をクリックします。Rating という新しい項目を追加します。
- 新規 Book オブジェクトを作成します。ここでも、レコードの値は実際には関係ありません。
- URL にパッケージ名前空間とブック ID を追加したものを使用して、booksView ページに移動します。たとえば、GBOOK が名前空間で、a00D0000008e7t4 がブック ID の場合、最終的な URL は https://Salesforce_instance/apex/GBOOK__booksView?id=001D000000CDt53 になります。
登録者組織からページが表示されると、ページにはパッケージ化された Book 項目のすべてと、新しく作成された Rating 項目が含まれます。異なるユーザおよび組織は引き続き必要な項目を追加でき、動的 Visualforce ページは、適宜調整されて表示されます。