6

My workflow looks something like this:

  1. I have a button in the related list to create a NEW custom object record with a custom visualforce page (VFNew.page)
  2. Open the saved record with an Edit button which is overridden with a custom visualforce page (VFEdit.page)

Here where it gets a bit complicated: both the visualforce pages have the same visualforce component embedded into them.

VFNew.page (used in a button from the related list) ->

<apex:page id="page" docType="html-5.0" standardController="Custom__c" recordSetVar="cItems" ..>
   <c:customComponent />
</apex:page>

VFEdit.page (used in an Edit button override)->

<apex:page id="page" docType="html-5.0" standardController="Custom__c" ..>
   <c:customComponent />
</apex:page>

CustomComponent.component ->

<apex:component extensions="CustomController" allowDML="true">
</apex:component>

Controller class ->

public with sharing class CustomController{

   public CustomController(){
      System.debug('1');
      init();
   }

   public CustomController(ApexPages.StandardSetController controller){
      System.debug('2');
      init();
   }

   public CustomController(ApexPages.StandardController controller){
       System.debug('3');
       initEdit();
   }
}

What I had hoped for is that when the VF is called from the related list button then the constructor 2 will be called because of the StandardSetController parameter and when the VF is called from the overridden Edit button then the constructor 3 will be called because if the StandardController parameter --- but in all the cases the constructor 1 is called - always.

Is there another way to find out in constructor 1 which Controller parameter is available so that I can get the Id if it comes from the Edit page?

3

You can pass variables from a visualforce page to a component. The problem is that this attribute will be assigned after the call of the controller constructor. But there is a workaround by calling the method you need in the variable setter. For example:

CustomComponent.component

<apex:component extensions="CustomController" allowDML="true">
    <apex:attribute name="IsFromRelatedList" type="Boolean" required="true" assignTo="{!IsFromRelatedList}" description="From where this component is called" />
</apex:component>

VFEdit.page (used in an Edit button override)

<apex:page id="page" docType="html-5.0" standardController="Custom__c" ..>
   <c:customComponent IsFromRelatedList="false" />
</apex:page>

VFNew.page (used in a button from the related list)

<apex:page id="page" docType="html-5.0" standardController="Custom__c" recordSetVar="cItems" ..>
   <c:customComponent IsFromRelatedList="true" />
</apex:page>

Controller class

public with sharing class CustomController{
   public Boolean IsFromRelatedList {get;set{
        this.IsFromRelatedList = value;
        if(value == true){
            //do what you want if the call is from the related list
        }else{
            //do what you want if this is not from the related list
        }
    }}

   public CustomController(){
      System.debug('1');
      init();
   }
}
  • I actually found another way to accomplish this before you answer came in -> using the page Id parameter in the constructor 1 to find out where the button click comes from and then calling the corresponding init function. But i tried your solution as well and was kinda successful with it ... just when calling any init functions from the variable setter it gave me some errors - which i did not want to spend too much time on it. But ill mark your answer thanx for the quick response – owsata Mar 28 '17 at 13:58
  • Thanks but you know that you can answer your own question and mark it as the right answer ! It can be helpful in the future to other people with the same problem. – Martin Lezer Mar 28 '17 at 14:00
0

I actually found another way to accomplish this before the other answer came in -> using the page Id parameter in the constructor 1 to find out where the button click comes from and then calling the corresponding init function.

  • Could you please post your code? – Martin Lezer Mar 28 '17 at 14:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.