Package developers can use dynamic Visualforce binding to list only the fields a user can access. This situation might occur when you’re developing a managed package with a Visualforce page that displays fields on an object. Since the package developer doesn’t know which fields a subscriber can access, he or she can define a dynamic page that renders differently for each subscriber. The following example uses a custom object packaged with a page layout using a Visualforce page to demonstrate how different subscribing users view the same page.
public with sharing class bookExtension { private ApexPages.StandardController controller; private Set<String> bookFields = new Set<String>(); public bookExtension (ApexPages.StandardController controller) { this.controller = controller; Map<String, Schema.SobjectField> fields = Schema.SobjectType.Book__c.fields.getMap(); for (String s : fields.keySet()) { // Only include accessible fields if (fields.get(s).getDescribe().isAccessible() && fields.get(s).getDescribe().isCustom()) { bookFields.add(s); } } } public List<String> availableFields { get { controller.reset(); controller.addFields(new List<String>(bookFields)); return new List<String>(bookFields); } } }
<apex:page standardController="Book__c" extensions="bookExtension" > <br/> <apex:pageBlock title="{!Book__c.Name}"> <apex:repeat value="{!availableFields}" var="field"> <h2><apex:outputText value="{!$ObjectType['Book__c'].Fields[field].Label}"/></h2> <br/> <apex:outputText value="{!Book__c[field]}" /><br/><br/> </apex:repeat> </apex:pageBlock> </apex:page>
public with sharing class bookExtension { private ApexPages.StandardController controller; private Set<String> bookFields = new Set<String>(); public bookExtension (ApexPages.StandardController controller) { this.controller = controller; Map<String, Schema.SobjectField> fields = Schema.SobjectType.Book__c.fields.getMap(); for (String s : fields.keySet()) { // Only include accessible fields if (fields.get(s).getDescribe().isAccessible() && fields.get(s).getDescribe().isCustom()) { bookFields.add(s); } } controller.addFields(new List<String>(bookFields)); } public List<String> availableFields { get { controller.reset(); controller.addFields(new List<String>(bookFields)); return new List<String>(bookFields); } } }
When the page is viewed from the subscribing organization, it should include all the packaged Book fields, plus the newly created Rating field. Different users and organizations can continue to add whatever fields they want, and the dynamic Visualforce page will adapt and show as appropriate.