将图像插入到visualforce电子邮件模板中(无需硬编码ID)

时间:2015-02-25 17:33:36

标签: salesforce visualforce

在visualforce电子邮件模板中包含图像的“官方”解决方案建议在模板中使用硬编码ID来引用存储为文档的图像文件。

https://help.salesforce.com/HTViewHelpDoc?id=email_template_images.htm&language=en_US

是否有更好的方法可以避免硬编码实例ID和OID?我尝试使用合作伙伴URL来获取实例ID,但是我收到了以下错误

错误错误:对实体“oid”的引用必须以“;”结尾分隔符。

使用: {!LEFT($ Api.Partner_Server_URL_140,FIND( “com /”,$ Api.Partner_Server_URL_140)3)/

替换“https://na2.salesforce.com/

“na2.salesforce.com/servlet/servlet.ImageServer?id=01540000000RVOe&oid=00Dxxxxxxxxx&lastMod=1233217920”

我应该使用静态资源吗?

2 个答案:

答案 0 :(得分:2)

我到了这里寻找与Visualforce电子邮件模板中的硬编码ID和OID相关的问题的答案。好吧,我找到了解决方法。

首先,我需要创建一个Visualforce组件:

<apex:component access="global" controller="LogomarcaController">
    <apex:image url="{!LogoUrl}" />
</apex:component>

在相应的控制器类中,我创建了一个 SFInstance 属性来获取正确的URL Salesforce Instance, LogoUrl 属性来连接SFInstance和ID ......最后我使用自定义设置( Config_Gerais__c.getInstance()。ID_Documento_Logomarca__c )来配置沙箱或生产中的图像ID(在我的情况下,文档对象):

public class LogomarcaController {
public String LogoUrl {
    get {
        id orgId = UserInfo.getOrganizationId();
        String idDocumentoLogomarca = Config_Gerais__c.getInstance().ID_Documento_Logomarca__c;
        return this.SfInstance + '/servlet/servlet.ImageServer?id=' + idDocumentoLogomarca  + '&oid=' + orgId ;
    }
}

public String SfInstance
{
    get{
        string SFInstance = URL.getSalesforceBaseUrl().toExternalForm();
        list<string> Dividido = SFInstance.split('.visual', 0);//retira o restante a partir de .visual
        SFInstance = dividido[0];
        dividido = SFInstance.split('://',0);//retira o https://
        SFInstance = dividido[1];
        if(!SFInstance.contains('sybf')) //managed package prefix, if you need
        {
           SFInstance = 'sybf.'+  SFInstance;
        }
        return 'https://'+SFInstance;
    }
}
}

最后,我在Visualforce模板中添加了组件:

<messaging:emailTemplate subject="Novo Ofício - {!relatedTo.name}" recipientType="User" relatedToType="Oficio__c" >
<messaging:htmlEmailBody >

    <c:Logomarca />

</messaging:htmlEmailBody>
<messaging:plainTextEmailBody >

</messaging:plainTextEmailBody>
</messaging:emailTemplate>

PS:我的一些变量,属性和注释都是用我的母语(葡萄牙语)。如果您在理解它们时遇到一些问题,请问我!

答案 1 :(得分:0)

我们遇到了类似的问题,在尝试了各种解决方案之后,以下方法对我们有效。在我们的示例中,图片作为内容资产(https://help.salesforce.com/articleView?id=000320130&type=1&language=en_US&mode=1)上传

解决方案:

<img src="{!LEFT($Api.Partner_Server_URL_260,FIND('/services',$Api.Partner_Server_URL_260))}/file-asset-public/<Image_Name_Here>?oid={!$Organization.Id}&height=50&width=50"/>