2009-07-01 16 views
1

Ich habe eine Komponente erstellt, die eine benutzerdefinierte Klasse verwendet. Ich habe diese Komponente zu einer E-Mail-Vorlage hinzugefügt. Wenn ich die Vorlage versuche und lade, ist dies die Fehlermeldung, die ich erhalte. Die Liste enthält keine Zeilen für die Zuweisung zu SObject. Von dem, was ich sagen kann, übergibt das Attribut, das ich erstellt habe, den Wert nicht an meine Klasse.ID wird nicht an benutzerdefinierten Controller aus E-Mail-Vorlage in SalesForce übergeben

Wenn ich zum ersten Mal die Task-Seite zum Senden einer E-Mail aufrufen, ist die OpportunityID Teil der Querystring mit einem Schlüssel von p3_lkid. Wenn ich jedoch die Vorlage auswähle, wird der Querystring zurückgesetzt.

Ich habe den entsprechenden Code unten beigefügt.

Komponente

<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> 

E-Mail-Vorlage

<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 Klasse

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; 
    } 


} 

Antwort

1

ich denke, es kann haben damit zu tun, dass Sie auf die Variable opportunityID im Konstruktor zugreifen. Der Konstruktor wird zuerst aufgerufen, bevor Variablen gesetzt werden. Vielleicht möchten Sie diese Logik stattdessen in den Setter setzen.