You need to sign in to do that
Don't have an account?
Custom Controller in Email Template not passing values to Class
I have created a component that is using a custom class. I added this component to an email template. When I try and load the template this is the error message I receive. List has no rows for assignment to SObject. From what I can tell the attribute I have created is not passing the value to my class.
Also, when I first pull up the task page to send an email, the OpportunityID is part of the querystring with a key of p3_lkid. However, when I select the template the querystring is reset. I have enclosed the relevant code below.
Component
<apex:component access="global" controller="ProbeQuoteEmail">
<apex:attribute name="opportunityID"
description="This is the ID of the opportunity."
type="ID" assignTo="{!opportunityID}" />
<apex:repeat value="{!ProbeProducts}" var="p">
<p>{!p.ProductFamily__c}</p>
<table border='1'>
<apex:repeat value="{!p.OpportunityLineItems}" var="line">
<tr>
<td ><apex:outputText value="{!line.Quantity}"/></td>
<td ><apex:outputText value="{!line.PricebookEntry.Name}"/></td>
<td align="right"><apex:outputField value="{!line.UnitPrice}"/></td>
<td align="right"><apex:outputField value="{!line.TotalPrice}"/></td>
</tr>
</apex:repeat>
</table>
</apex:repeat>
</apex:component>
Email Template
<messaging:emailTemplate subject="Your requested quote n° {!relatedTo.Id}" recipientType="Contact" relatedToType="Opportunity">
<messaging:plainTextEmailBody >
Dear {!recipient.name},
Thank you for your continued interest in our offering. Please see the attached quote per your request.
Feel free to contact me if you have any questions.
Regards,
{!$User.FirstName} {!$User.LastName}
</messaging:plainTextEmailBody>
<messaging:attachment renderAs="pdf" filename="{!relatedTo.name}">
<c:ProbeQuoteProducts opportunityID="{!relatedTo.Id}"/>
</messaging:attachment>
</messaging:emailTemplate>
Apex Class
public class ProbeQuoteEmail {
Schema.DescribeFieldResult F = Product2.Family.getDescribe();
List<Schema.PicklistEntry> P = F.getPicklistValues();
public Opportunity Probe { get; set; }
public Id opportunityID { get; set; }
public List<Opportunity> ProbeProducts = new List<Opportunity>();
Integer Counter = 1;
public ProbeQuoteEmail() {
for (Schema.PicklistEntry fam:P){
Integer i = 0;
String FamilyLabel = fam.GetLabel();
Probe = [SELECT o.Id, o.Name, o.Amount, o.ProductFamily__c, (SELECT op.Quantity, op.UnitPrice, op.TotalPrice,
op.PricebookEntry.Name, op.OpportunityId, op.PricebookEntry.ProductCode,
op.PricebookEntry.Product2.Family, op.LineCount__c
FROM OpportunityLineItems op WHERE op.PricebookEntry.Product2.Family = :FamilyLabel)
FROM Opportunity o where Id = :opportunityID];
Probe.Amount = 0;
Probe.ProductFamily__c = FamilyLabel;
for(i=0;i<Probe.opportunityLineItems.size();i++) {
Probe.Amount += Probe.opportunityLineItems[i].TotalPrice;
Probe.opportunityLineItems[i].LineCount__c = Counter;
Counter++;
}
ProbeProducts.add(Probe);
}
}
public List<Opportunity> getProbeProducts() {
return ProbeProducts;
}
}
Hi Scott,
I ran into the same issue today, debug stopped after calling the page with the mailform.
Searching the community I discovered your post and compared the Code.
There is just one little problem. There is no Id in the component.
You have to pass the Id inside your class, that's because there is no PageId used. You wrote that it's in the p3_lkid but the class doesn't know this:
if (opportunityId == NULL) {
opportunityId = ApexPages.CurrentPage().getParameters().get('p3_lkid');
}
In the component I also changed assignTo into opportunity.Id and now it works fine in my org.
<apex:component access="global" controller="ProbeQuoteEmail">
<apex:attribute name="opportunityID" description="This is the ID of the opportunity." type="ID" assignTo="{!opportunity.ID}" />
<apex:repeat value="{!ProbeProducts}" var="p">
(...)
</apex:repeat>
</apex:component>
with these changes, I get my mailform and the attached pdf with the repeat over the lineitems.
I hope this also works for you.
Good luck,
Tobias Forstmeier
All Answers
Hey
From what I can see you may be setting the value to the correct value and then to null. The assignTo attribute set's the public property, you don't have to perform the
opportunityID = ApexPages.CurrentPage().getParameters().get('id');
It should be set by this point. Remove this line and let me know how it goes. You may want to include some System.debug messages in your apex code too, this will makes things quite a bit simpler. You can then view these messages from the in-browser debug logs.
Cheers,
Wes
Hmm.. a difficult one to troubleshoot. Have you tried system.debug() messages to narrow down the cause? Sorry it's a n00b suggestion but it's fundamental.
Cheers,
Wes
Hi Scott,
I ran into the same issue today, debug stopped after calling the page with the mailform.
Searching the community I discovered your post and compared the Code.
There is just one little problem. There is no Id in the component.
You have to pass the Id inside your class, that's because there is no PageId used. You wrote that it's in the p3_lkid but the class doesn't know this:
if (opportunityId == NULL) {
opportunityId = ApexPages.CurrentPage().getParameters().get('p3_lkid');
}
In the component I also changed assignTo into opportunity.Id and now it works fine in my org.
<apex:component access="global" controller="ProbeQuoteEmail">
<apex:attribute name="opportunityID" description="This is the ID of the opportunity." type="ID" assignTo="{!opportunity.ID}" />
<apex:repeat value="{!ProbeProducts}" var="p">
(...)
</apex:repeat>
</apex:component>
with these changes, I get my mailform and the attached pdf with the repeat over the lineitems.
I hope this also works for you.
Good luck,
Tobias Forstmeier