You need to sign in to do that
Don't have an account?
collecting user info from visual force page using controller extension
I need a little help getting this to work. I thought there were only two pieces of code to add (one to visual force page and one to the controller for the visual force page) to accept user input through a visual force page.
I can initialize approvalComment in the visual force page's controller and I can enter text in the approvalComment field on the visual force page, but I only get my initialized value back... NOT what the user types in the inputTextarea.
I am trying to understand what I am missing and why.
visualforce page code:
<apex:form id="mainForm">
....
<apex:actionRegion >
<apex:pageBlock id="approvalCommentBlock" title="Approval Comments" rendered="{!(currentApprovalStateName == 'Required')}" >
<table width="600">
<tr>
<td width="40%"><apex:outputLabel value="Enter Approval Comments." for="approvalComment" /></td>
<td width="60%"><apex:inputTextarea cols="50" id="approvalComment" value="{!approvalComment}"/></td>
</tr>
</table>
</apex:pageBlock>
</apex:actionRegion>
....
</apex:form>
visual force page's controller code:
private String approvalComment;
public String getApprovalComment() {
return approvalComment;
}
public void setApprovalComment(String s) {
approvalComment = s;
}
private void initializeState() {
approvalComment = 'Approval Comments go here.';
System Log:
14:36:32.924|USER_DEBUG|[300]|DEBUG|approvalComment: Approval Comments go here.
The problem might be with the action region tag. You have the button in onc action region and the input field in another action region. May be that could be the error.
All Answers
No. Not at all. Is that what I am missing? I have been scouring the boards for an example to use.
I thought the field was bound to a controller extension. I was hoping to not bind it to a sObject and pass this field to an approval process that is already built out. Its puzzling because I can initalize the property, see the initialized property on my visual force page, type in user input which should wipe out the initialized value, but in the system log in the approval process I see the ONLY the initialized value.
Ok that could be the reason for you not fetching the right value. Add a command button and action in the controller which will pass the value from the page to the controller and see.
I have a "submit for approval" button, but do not know how to code the part in the action to get the user input. My page is named PricingToolPage and the form id is "mainForm".
I thought the getters and setters would do that for me.
Make the following changes in your code:(Marked in red)
visualforce page code:
<apex:form id="mainForm">
....
<apex:actionRegion >
<apex:pageBlock id="approvalCommentBlock" title="Approval Comments" rendered="{!(currentApprovalStateName == 'Required')}" >
<table width="600">
<tr>
<td width="40%"><apex:outputLabel value="Enter Approval Comments." for="approvalComment" /></td>
<td width="60%"><apex:inputTextarea cols="50" id="approvalComment" value="{!approvalComment}"/></td>
</tr>
</table>
<apex:commandButton value="Submit for Approval" action="{!submit}" id="submitButton"/>
</apex:pageBlock>
</apex:actionRegion>
....
</apex:form>
visual force page's controller code:
private String approvalComment;
public String getApprovalComment() {
return approvalComment;
}
public void setApprovalComment(String s) {
approvalComment = s;
}
Instead of getter and setter methods you can also use
public String approvalComment{get;set;}
public PageReference submit(){
//You can now use the updated approvalComment value in this method and proceed accordingly
//Include the code you want to execute after the user submits the approval comment
return null;//If you do not want to move to a new page
return Page.<Pagename>;//if you want to move to a new page
}
private void initializeState() {
approvalComment = 'Approval Comments go here.';
Let me know if you face any difficulty.........
Thank you for your suggestions. I already have multiple command buttons which fire as intended according to the system logs. The command button fires and processes approvalComment showing the initialized value of approvalComments, but not what the user has typed over the initialized value, ie. the value typed in the inputTextarea. I have also checked to make sure the initializeState function does not wipe out the user input.
I have added a little bit more of the code to show the command button and controller action.
visualforce page code:
<apex:outputPanel id="buttonOutputPanel">
<apex:actionRegion >
<apex:commandButton id="requestApprovalButton" value="Request Approval"
rerender="buttonOutputPanel, quoteLinesOutputPanel, scriptOutputPanel,huntGroupsOutputPanel"
action="{!requestApproval}"
oncomplete="initQuoteLines();"
disabled="{! currentApprovalStateName != 'Required'}" />
….
</apex:actionRegion>
</apex:outputPanel>
…
<apex:actionRegion >
<apex:pageBlock id="approvalCommentBlock" title="Approval Comments"
rendered="{!(currentApprovalStateName == 'Required')}" >
<table width="600">
<tr>
<td width="40%"><apex:outputLabel value="Enter Approval Comments (if needed) before clicking the Request Approval button." for="approvalComment" /></td>
<td width="60%"><apex:inputTextarea cols="50" id="approvalComment" value="{!approvalComment}"/></td>
</tr>
</table>
</apex:pageBlock>
</apex:actionRegion>
visual force page's controller code:
public String approvalComment { get; set; }
….
public PageReference requestApproval() {
System.debug('discountApprovalProcessRequired(): ' + discountApprovalProcessRequired());
System.debug('approvalComment: ' + approvalComment);
System.SavePoint sp = Database.setSavepoint();
try {
saveHeader();
Approval.ProcessSubmitRequest req = new Approval.ProcessSubmitRequest();
String sComment = 'Submitting quote for approval.';
if (approvalComment != null) {
sComment = sComment + '/n' + approvalComment;
}
req.setComments(sComment);
req.setObjectId(quote.Id);
Approval.ProcessResult result = Approval.process(req);
}
catch (Exception e) {
Database.rollback(sp);
}
updateApprovalState();
return null;
}
….
private void initializeState() {
approvalComment = 'Approval Comments go here.';
IsClosed = opportunity.StageName == 'Closed Won';
The problem might be with the action region tag. You have the button in onc action region and the input field in another action region. May be that could be the error.
Thats it! Thank you very much. I put the approvalComment inputTextarea in the same actionRegion and it works.