• Uzair Ahmadani 4
  • NEWBIE
  • 0 Points
  • Member since 2015

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 1
    Questions
  • 3
    Replies
Hi,

I Have got a customer object by the name ExecuteContext. It has fields:
  1. ID - AutoNumber 
  2. Object Name - Text(250)
  3. Field Name - Text(250)
  4. Field Value - longtext
I would override the new and edit button to show my VF page ExecuteContext in it i would
  1. Dispaly list of all editable objects in a picklist that exists in my org.
  2. On selection of an object  display related fields in the picklist
  3. On selection of Field display the respective input field which is displayed based on the type of field (checkbox, picklist, multipicklist, lookup, date, datetime etc)
  4. After selecting/entering value in input field click save.
  5. On Save pick entered value in input field.
  6. Save the ExecuteContext Record
I have done steps 1 - 4 having issue in step 5.i.e. 
string sFieldinputVal = (String)inputObj.get(sFieldsVal);
i have set the input field as: 
<apex:inputField value="{!inputObj[sFieldsVal]}"/>
where
InputObj is Sobject and is set when getting the fields
sFieldsVal is selected field api name.

I am providing the complete code below as well:

VF PAGE
<apex:page standardController="ExecuteContext__c" extensions="ExecuteContextController">
  <apex:outputpanel >
    <apex:actionstatus id="actStatusId">
      <apex:facet name="start">
        <div class="waitingSearchDiv" id="el_loading" style="background-color: #DCD6D6;
                       height: 100%;opacity:0.65;width:100%;"> 
          <div class="waitingHolder" style="top: 74.2px; width: 91px;">
            <img class="waitingImage" src="/img/loading.gif" title="Please Wait..." />
            <span class="waitingDescription">Loading...</span>
          </div>
        </div>
      </apex:facet>
    </apex:actionstatus>
  </apex:outputpanel>
 <apex:form id="frmExecuteContextController">
  <apex:pageBlock>  
   <apex:pageBlockButtons >
    <apex:commandButton value="Save" action="{!save}"/>
    <apex:commandButton value="Cancel" action="{!cancel}"/>
   </apex:pageBlockButtons>  
   <apex:pageBlockSection title="Select details" columns="2">
    <apex:pageBlockSectionItem >
     <apex:SelectList value="{!sObjectsVal}" size="1">
      <apex:selectOptions value="{!ObjectNames}"></apex:selectOptions>
      <apex:actionSupport rerender="Fields,frmExecuteContextController" event="onchange" status="actStatusId"/>
     </apex:SelectList> 
    </apex:pageBlockSectionItem>  
    <apex:pageBlockSectionItem >
     <apex:outputPanel id="Fields">
      <!--<apex:outputLabel value="Selected Object" for="ObjectVal"/>-->
      <apex:outputText id="ObjectVal" value="{!sObjectsVal}"/>
      <apex:SelectList value="{!sFieldsVal}" size="1">
       <apex:selectOptions value="{!FieldNames}"></apex:selectOptions>
       <apex:actionSupport rerender="frmExecuteContextController" event="onchange" status="actStatusId"/>
      </apex:SelectList>
     </apex:outputPanel>
    </apex:pageBlockSectionItem>    
    <apex:pageBlockSectionItem id="pbsItemVis">
     <apex:outputPanel id="FieldInputdisplay" rendered="{!bFieldrerendered}">
      <!--<apex:outputText value="visible"></apex:outputText>-->
      <!--<apex:dynamicComponent componentValue="{!SelectedField}"/>-->
      <apex:inputField value="{!inputObj[sFieldsVal]}"/>
     </apex:outputPanel>
    </apex:pageBlockSectionItem>  
   </apex:pageBlockSection>
  </apex:pageBlock>
 </apex:form>
</apex:page>

Controller
public class ExecuteContextController {
    public ExecuteContextController(ApexPages.StandardController controller) {
        //mfields = new Map<string,Schema.DescribeFieldResult>();
    }
    public SObject inputObj {get; set;}
    public String sObjectsVal {get;set;}
    public String sFieldsVal {get;set;}
    public Boolean test {get;set;}
    Schema.DescribeSObjectResult r;
    //public Map<string,Schema.DescribeFieldResult> mfields;
    
    public List<SelectOption> getObjectNames()
    {
        sFieldsVal = null;
        inputObj = null;
      List<Schema.SObjectType> gd = Schema.getGlobalDescribe().Values();     
      List<SelectOption> options = new List<SelectOption>();
      
      for(Schema.SObjectType f : gd)
      {   
        if(f.getDescribe().isCreateable())
        {
           //Schema.SObjectType sobjType = Schema.getGlobalDescribe().get(sObjectsVal);  
           //if(sobjType != null){
            options.add(new SelectOption(f.getDescribe().getName(),f.getDescribe().getLabel()));
           //} 
        }  
        
      }
      return options;
    }

    public List<SelectOption> getFieldNames()   
    {  
        sFieldsVal = null;
        r = null;
        List<SelectOption> fields = new List<SelectOption>(); 

        //code to set the input field dynamically seting the Sobject
        Schema.SObjectType targetType = Schema.GetGlobalDescribe().Get(sObjectsVal);

        if(targetType != null)
        {
           inputObj = targetType.NewSObject();
        }
        //End of Code
        Schema.SObjectType sobjType = Schema.getGlobalDescribe().get(sObjectsVal);  
        if (sobjType != null) {
            r = sobjType.getDescribe();
            //mfields.putAll(ExecuteContextHelper.getFieldMetaData(r,r.fields.getMap().keyset()));
            Map<String,Schema.SObjectField> M = r.fields.getMap();  
            for(String fieldName : M.keyset())  
            {  
                Schema.SObjectField field = M.get(fieldName);
                Schema.DescribeFieldResult fieldDesc = field.getDescribe();  
                if(fieldDesc.isUpdateable())
                {
                    //mfields.put(fieldName, fieldDesc);
                    //inputObj.put(fieldName, null);
                    fields.add(new SelectOption(fieldDesc.getName(),fieldDesc.getLabel())); 
                }
            }  
        }
        return fields;  
    }
    public Boolean getbFieldrerendered()
    {
        if(sObjectsVal == null || sFieldsVal == null)
        {
            test = false;
            return false;
        }
        else
        {
            test = true;
            return true;
        }
    }
    public  PageReference Save()
    {
        try
        {
            system.debug(inputObj);
            
            string sFieldinputVal = (String)inputObj.get(sFieldsVal);
            ExecuteContext__c oExecuteContext = new ExecuteContext__c(Object_Name__c=sObjectsVal,Field_Name__c=sFieldsVal,Field_Value__c=sFieldinputVal);
            insert oExecuteContext;
            PageReference opfNewPage = new ApexPages.StandardController(oExecuteContext).view();
            opfNewPage.setRedirect(true);
            return opfNewPage;

        }
        catch(Exception e)
        {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getMessage()));
            PageReference pageRef = new PageReference(ApexPages.currentPage().getUrl());
            //pageRef.setRedirect(true);
            return pageRef;
        }
    }
}

 
Hi,

I Have got a customer object by the name ExecuteContext. It has fields:
  1. ID - AutoNumber 
  2. Object Name - Text(250)
  3. Field Name - Text(250)
  4. Field Value - longtext
I would override the new and edit button to show my VF page ExecuteContext in it i would
  1. Dispaly list of all editable objects in a picklist that exists in my org.
  2. On selection of an object  display related fields in the picklist
  3. On selection of Field display the respective input field which is displayed based on the type of field (checkbox, picklist, multipicklist, lookup, date, datetime etc)
  4. After selecting/entering value in input field click save.
  5. On Save pick entered value in input field.
  6. Save the ExecuteContext Record
I have done steps 1 - 4 having issue in step 5.i.e. 
string sFieldinputVal = (String)inputObj.get(sFieldsVal);
i have set the input field as: 
<apex:inputField value="{!inputObj[sFieldsVal]}"/>
where
InputObj is Sobject and is set when getting the fields
sFieldsVal is selected field api name.

I am providing the complete code below as well:

VF PAGE
<apex:page standardController="ExecuteContext__c" extensions="ExecuteContextController">
  <apex:outputpanel >
    <apex:actionstatus id="actStatusId">
      <apex:facet name="start">
        <div class="waitingSearchDiv" id="el_loading" style="background-color: #DCD6D6;
                       height: 100%;opacity:0.65;width:100%;"> 
          <div class="waitingHolder" style="top: 74.2px; width: 91px;">
            <img class="waitingImage" src="/img/loading.gif" title="Please Wait..." />
            <span class="waitingDescription">Loading...</span>
          </div>
        </div>
      </apex:facet>
    </apex:actionstatus>
  </apex:outputpanel>
 <apex:form id="frmExecuteContextController">
  <apex:pageBlock>  
   <apex:pageBlockButtons >
    <apex:commandButton value="Save" action="{!save}"/>
    <apex:commandButton value="Cancel" action="{!cancel}"/>
   </apex:pageBlockButtons>  
   <apex:pageBlockSection title="Select details" columns="2">
    <apex:pageBlockSectionItem >
     <apex:SelectList value="{!sObjectsVal}" size="1">
      <apex:selectOptions value="{!ObjectNames}"></apex:selectOptions>
      <apex:actionSupport rerender="Fields,frmExecuteContextController" event="onchange" status="actStatusId"/>
     </apex:SelectList> 
    </apex:pageBlockSectionItem>  
    <apex:pageBlockSectionItem >
     <apex:outputPanel id="Fields">
      <!--<apex:outputLabel value="Selected Object" for="ObjectVal"/>-->
      <apex:outputText id="ObjectVal" value="{!sObjectsVal}"/>
      <apex:SelectList value="{!sFieldsVal}" size="1">
       <apex:selectOptions value="{!FieldNames}"></apex:selectOptions>
       <apex:actionSupport rerender="frmExecuteContextController" event="onchange" status="actStatusId"/>
      </apex:SelectList>
     </apex:outputPanel>
    </apex:pageBlockSectionItem>    
    <apex:pageBlockSectionItem id="pbsItemVis">
     <apex:outputPanel id="FieldInputdisplay" rendered="{!bFieldrerendered}">
      <!--<apex:outputText value="visible"></apex:outputText>-->
      <!--<apex:dynamicComponent componentValue="{!SelectedField}"/>-->
      <apex:inputField value="{!inputObj[sFieldsVal]}"/>
     </apex:outputPanel>
    </apex:pageBlockSectionItem>  
   </apex:pageBlockSection>
  </apex:pageBlock>
 </apex:form>
</apex:page>

Controller
public class ExecuteContextController {
    public ExecuteContextController(ApexPages.StandardController controller) {
        //mfields = new Map<string,Schema.DescribeFieldResult>();
    }
    public SObject inputObj {get; set;}
    public String sObjectsVal {get;set;}
    public String sFieldsVal {get;set;}
    public Boolean test {get;set;}
    Schema.DescribeSObjectResult r;
    //public Map<string,Schema.DescribeFieldResult> mfields;
    
    public List<SelectOption> getObjectNames()
    {
        sFieldsVal = null;
        inputObj = null;
      List<Schema.SObjectType> gd = Schema.getGlobalDescribe().Values();     
      List<SelectOption> options = new List<SelectOption>();
      
      for(Schema.SObjectType f : gd)
      {   
        if(f.getDescribe().isCreateable())
        {
           //Schema.SObjectType sobjType = Schema.getGlobalDescribe().get(sObjectsVal);  
           //if(sobjType != null){
            options.add(new SelectOption(f.getDescribe().getName(),f.getDescribe().getLabel()));
           //} 
        }  
        
      }
      return options;
    }

    public List<SelectOption> getFieldNames()   
    {  
        sFieldsVal = null;
        r = null;
        List<SelectOption> fields = new List<SelectOption>(); 

        //code to set the input field dynamically seting the Sobject
        Schema.SObjectType targetType = Schema.GetGlobalDescribe().Get(sObjectsVal);

        if(targetType != null)
        {
           inputObj = targetType.NewSObject();
        }
        //End of Code
        Schema.SObjectType sobjType = Schema.getGlobalDescribe().get(sObjectsVal);  
        if (sobjType != null) {
            r = sobjType.getDescribe();
            //mfields.putAll(ExecuteContextHelper.getFieldMetaData(r,r.fields.getMap().keyset()));
            Map<String,Schema.SObjectField> M = r.fields.getMap();  
            for(String fieldName : M.keyset())  
            {  
                Schema.SObjectField field = M.get(fieldName);
                Schema.DescribeFieldResult fieldDesc = field.getDescribe();  
                if(fieldDesc.isUpdateable())
                {
                    //mfields.put(fieldName, fieldDesc);
                    //inputObj.put(fieldName, null);
                    fields.add(new SelectOption(fieldDesc.getName(),fieldDesc.getLabel())); 
                }
            }  
        }
        return fields;  
    }
    public Boolean getbFieldrerendered()
    {
        if(sObjectsVal == null || sFieldsVal == null)
        {
            test = false;
            return false;
        }
        else
        {
            test = true;
            return true;
        }
    }
    public  PageReference Save()
    {
        try
        {
            system.debug(inputObj);
            
            string sFieldinputVal = (String)inputObj.get(sFieldsVal);
            ExecuteContext__c oExecuteContext = new ExecuteContext__c(Object_Name__c=sObjectsVal,Field_Name__c=sFieldsVal,Field_Value__c=sFieldinputVal);
            insert oExecuteContext;
            PageReference opfNewPage = new ApexPages.StandardController(oExecuteContext).view();
            opfNewPage.setRedirect(true);
            return opfNewPage;

        }
        catch(Exception e)
        {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getMessage()));
            PageReference pageRef = new PageReference(ApexPages.currentPage().getUrl());
            //pageRef.setRedirect(true);
            return pageRef;
        }
    }
}

 

Background: I have three apex:selectLists that are dependent on one another. When a value is choosen in the first picklist, options in the other picklists become available. 

 

The problem: These picklists were working fine when nested inside an apex:pageBlockSection, however when I moved the code to a jQuery controlled div the values from the select lists are no longer passed to the controller. Any ideas?

 

VF:

 

<apex:selectlist value="{!projectID}" multiselect="false" size="1" style="margin-right: 5px;">
              <apex:selectOption itemvalue="" itemLabel="--Open Projects--" />
              <apex:selectoptions value="{!openProjects}"/>
              <apex:actionsupport event="onchange" rerender="milestoneList"/>
          </apex:selectlist>
          <apex:selectlist value="{!milestoneID}" multiselect="false" size="1" id="milestoneList" style="margin-right: 5px;">
              <apex:selectOption itemvalue="" itemLabel="--Milestones--" />
              <apex:selectoptions value="{!RelatedMilestones}"/>
              <apex:actionsupport event="onchange" rerender="deliverableList"/>
          </apex:selectlist>
          <apex:selectlist value="{!deliverableID}" multiselect="false" size="1" id="deliverableList">
              <apex:selectOption itemvalue="" itemLabel="--Deliverables--" />
              <apex:selectoptions value="{!RelatedDeliverabiles}"/>
          </apex:selectlist>

 Controller:

 

public String projectID {get; set;}
public String milestoneID {get; set;}
public String deliverableID {get; set;}

//Populate the "Related To" Project Picklist
    public List<SelectOption> getOpenProjects() {
        List<SelectOption> options = new List<SelectOption>();
        List<Project2__c> projects = [SELECT Name, ID FROM Project2__c 
                                      WHERE Status__c != 'Completed' 
                                      ORDER BY Name];
        
        for(Project2__c p : projects){
            options.add(new SelectOption(p.ID, p.Name));
        }
        
        return options;
    }
    
    //Populate the "Related To" Milestones Picklist
    public List<SelectOption> getRelatedMilestones() {
        List<SelectOption> options = new List<SelectOption>();
        List<Milestone_NEW__c> milestones = [SELECT Name, ID FROM Milestone_NEW__c 
                                             WHERE Project__c = :projectID 
                                             ORDER BY Name];
        
        for(Milestone_NEW__c m : milestones){
            options.add(new SelectOption(m.ID, m.Name));
        }
        
        return options;
    }
    
    //Populate the "Related To" Deliverablies Picklist
    public List<SelectOption> getRelatedDeliverabiles() {
        List<SelectOption> options = new List<SelectOption>();
        List<Deliverable__c> deliverables = [SELECT Name, ID FROM Deliverable__c 
                                             WHERE Milestone_NEW__c = :milestoneID 
                                             ORDER BY Name];
        
        for(Deliverable__c d : deliverables){
            options.add(new SelectOption(d.ID, d.Name));
        }
        
        return options;
    }