合并字段不会显示在 visualforce 页面上
Merge fields won't show on visualforce page
我最近才开始学习 Apex,目前还有很多主题让我难以驾驭。我到处寻找有效的解决方案,但我仍然无法弄清楚。
我在我的 Salesforce 组织上创建了一个按钮,用于从 visualforce 页面呈现 PDF,并将其作为文件附加到记录。这将在稍后与 Docusign 一起使用以捕获合同签名。问题是,当在 VF 页面中使用合并字段时,它们要么根本不显示,要么我得到这个异常:“sObject 行是通过 SOQL 检索的,没有查询请求的字段”。
现在,异常明确指出我需要查询字段,这就是我发现我需要做的才能完成这项工作,但我一直无法弄清楚如何正确地做到这一点.我在我的控制器扩展中的几个地方尝试了 运行 查询但无济于事(我使用的是 SF 为我的自定义对象创建的标准控制器)。
这是我的分机代码:
public class attachPDFToQuote {
public final i360__Quote__c q {get; set;} //Quote object
//constructor
public attachPDFToQuote (ApexPages.StandardController stdController) {
q = (i360__Quote__c)stdController.getRecord();
/* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
System.debug(i360__Quote__c.Correspondence_Name__c);
}*/
}
public PageReference attachPDF() {
/* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
System.debug(i360__Quote__c.Correspondence_Name__c);
}*/
//generate and attach the PDF document
PageReference pdfPage = Page.ProjectAgreement;
Blob pdfBlob; //create a blob for the PDF content
if (!Test.isRunningTest()) { //if we are not in testing context
pdfBlob = pdfPage.getContent(); //generate the pdf blob
} else { //otherwise, we are in testing context. Create the blob manually.
pdfBlob = Blob.valueOf('PDF');
}
ContentVersion cvAttach = new ContentVersion(ContentLocation= 'S');
cvAttach.PathOnClient= 'Project Agreement.pdf';
cvAttach.Title= 'Project Agreement';
cvAttach.VersionData= pdfBlob;
insert cvAttach;
Id conDoc = [SELECT ContentDocumentID FROM ContentVersion WHERE Id=: cvAttach.Id].ContentDocumentId;
ContentDocumentLink ConDocLink = new COntentDocumentLink();
conDocLink.LinkedEntityId= q.Id;
conDocLink.ContentDocumentId= conDoc;
conDocLink.ShareType= 'V';
insert conDocLink;
//redirect the user
PageReference pageWhereWeWantToGo = new ApexPages.StandardController(q).view(); //redirect the User back to the Quote detail page
pageWhereWeWantToGo.setRedirect(true); //indicate that the redirect should be performed on the client side
return pageWhereWeWantToGo; //send the User on their way
}
}
我在尝试查询对象字段的地方保留了注释代码,以便它们在 VF 中显示。我也尝试了几种不同的方法,但似乎没有任何效果。如果我需要添加任何其他内容,请告诉我。
谢谢!
您没有 post Visualforce 页面的代码。
即使是同一页面(如果您的顶点 class 在 ProjectAgreement VF 中用作 <apex:page standardController="i360__Quote__c" extensions="attachPDFToQuote"
- 抓取页面的 PDF 版本的行为算作标注,单独的 http 流量到页面的新实例可以这么说。
所以我怀疑你需要像
这样的东西
PageReference pdfPage = Page.ProjectAgreement;
pdfPage.getParameters().put('id', q.Id);
Blob = pdfPage.getContent();
如果可行...下一步将查看您的 VF 代码。
如果页面有 {!i360__Quote__c.Name}, {!i360__Quote__c.Correspondence_Name__c}
这样的合并字段,那么奇迹就会发生。 Salesforce 应该通过查看您的 VF 页面来确定需要哪些字段,并默默地为您查询。因此,您甚至不需要在构造函数中进行查询,只需将 stdController.getId()
保存到 class 变量,然后在 pdfPage.getParameters().set(...)
中使用该 id
但是,如果您的 VF 页面引用了 {!quote.Correspondence_Name__c}
,那么您需要在其中保留显式查询。
我最近才开始学习 Apex,目前还有很多主题让我难以驾驭。我到处寻找有效的解决方案,但我仍然无法弄清楚。
我在我的 Salesforce 组织上创建了一个按钮,用于从 visualforce 页面呈现 PDF,并将其作为文件附加到记录。这将在稍后与 Docusign 一起使用以捕获合同签名。问题是,当在 VF 页面中使用合并字段时,它们要么根本不显示,要么我得到这个异常:“sObject 行是通过 SOQL 检索的,没有查询请求的字段”。
现在,异常明确指出我需要查询字段,这就是我发现我需要做的才能完成这项工作,但我一直无法弄清楚如何正确地做到这一点.我在我的控制器扩展中的几个地方尝试了 运行 查询但无济于事(我使用的是 SF 为我的自定义对象创建的标准控制器)。
这是我的分机代码:
public class attachPDFToQuote {
public final i360__Quote__c q {get; set;} //Quote object
//constructor
public attachPDFToQuote (ApexPages.StandardController stdController) {
q = (i360__Quote__c)stdController.getRecord();
/* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
System.debug(i360__Quote__c.Correspondence_Name__c);
}*/
}
public PageReference attachPDF() {
/* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
System.debug(i360__Quote__c.Correspondence_Name__c);
}*/
//generate and attach the PDF document
PageReference pdfPage = Page.ProjectAgreement;
Blob pdfBlob; //create a blob for the PDF content
if (!Test.isRunningTest()) { //if we are not in testing context
pdfBlob = pdfPage.getContent(); //generate the pdf blob
} else { //otherwise, we are in testing context. Create the blob manually.
pdfBlob = Blob.valueOf('PDF');
}
ContentVersion cvAttach = new ContentVersion(ContentLocation= 'S');
cvAttach.PathOnClient= 'Project Agreement.pdf';
cvAttach.Title= 'Project Agreement';
cvAttach.VersionData= pdfBlob;
insert cvAttach;
Id conDoc = [SELECT ContentDocumentID FROM ContentVersion WHERE Id=: cvAttach.Id].ContentDocumentId;
ContentDocumentLink ConDocLink = new COntentDocumentLink();
conDocLink.LinkedEntityId= q.Id;
conDocLink.ContentDocumentId= conDoc;
conDocLink.ShareType= 'V';
insert conDocLink;
//redirect the user
PageReference pageWhereWeWantToGo = new ApexPages.StandardController(q).view(); //redirect the User back to the Quote detail page
pageWhereWeWantToGo.setRedirect(true); //indicate that the redirect should be performed on the client side
return pageWhereWeWantToGo; //send the User on their way
}
}
我在尝试查询对象字段的地方保留了注释代码,以便它们在 VF 中显示。我也尝试了几种不同的方法,但似乎没有任何效果。如果我需要添加任何其他内容,请告诉我。
谢谢!
您没有 post Visualforce 页面的代码。
即使是同一页面(如果您的顶点 class 在 ProjectAgreement VF 中用作 <apex:page standardController="i360__Quote__c" extensions="attachPDFToQuote"
- 抓取页面的 PDF 版本的行为算作标注,单独的 http 流量到页面的新实例可以这么说。
所以我怀疑你需要像
这样的东西PageReference pdfPage = Page.ProjectAgreement;
pdfPage.getParameters().put('id', q.Id);
Blob = pdfPage.getContent();
如果可行...下一步将查看您的 VF 代码。
如果页面有 {!i360__Quote__c.Name}, {!i360__Quote__c.Correspondence_Name__c}
这样的合并字段,那么奇迹就会发生。 Salesforce 应该通过查看您的 VF 页面来确定需要哪些字段,并默默地为您查询。因此,您甚至不需要在构造函数中进行查询,只需将 stdController.getId()
保存到 class 变量,然后在 pdfPage.getParameters().set(...)
但是,如果您的 VF 页面引用了 {!quote.Correspondence_Name__c}
,那么您需要在其中保留显式查询。