- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我首先要说我是一名 C# .Net/Javascript 开发人员,拥有丰富的经验,但我对 Salesforce 的经验为零。今天之前从未见过它。因此,另一个团队要求我向 Contact 对象添加自定义按钮,单击该按钮时会调用外部 API 并使用响应更新 Contact 中的自定义字段。它被宣传为“只需编写一些在单击按钮时调用 API 的 Javascript,它实际上是嵌入到页面中的,15 分钟的工作...”。
按照看起来相当过时的文档,我最终进入了对象管理器,选择了联系人对象,然后我进入了按钮、链接和操作页面。我假设在此之前使用 Execute Javascript 行为完成,在 Lightning 版本中我被建议不要使用。因此,在大量谷歌搜索之后,我阅读了有关 APEX 类、Visualforce 组件、Lightning 组件、Salesforce REST API 等的信息。这不是 15 分钟的工作。
本质上,要求是将一个按钮(或操作,或..?)嵌入到此联系人页面中,以便当销售人员单击它时,它会收集一些联系人的详细信息并使用它们来形成 API 调用外部服务。数据将用于形成响应,然后必须读取(作为 JSON,然后解析)并写入联系人的自定义字段。
开发解决方案的最佳方法是什么?在 Apex 调试环境中,我将调用 API 和解析 JSON 响应的代码放在一起,我假设我需要将其包装在 Apex 类中,并使用调用此代码并返回响应的方法。我不确定的是如何从按钮调用它,并更新联系人中的字段。我是否需要通过 Apex 类方法执行所有这些操作?传递对联系人的引用,或者是否有另一个组件需要位于两者之间并执行此操作。我假设我需要使用 Salesforce API 来更新联系人是否正确?
感谢任何指点。
最佳答案
哦,伙计。这可能是一个 15 分钟的工作,但它绝对是“当你知道怎么做时很容易”或者有一些例子;)
JSON.deserializeUntyped()
手工制作解析器但生命太短暂了。这是一个很好的顶点代码生成器,类似于您从解析 WSDL 中得到的:https://json2apex.herokuapp.com/ 我们会尝试做 Aura 组件的方式。这很丑陋,LWC 是 future ,但嘿,它会让你开始。
转到设置 -> 远程站点设置并使用 https://en.wikipedia.org/
添加新条目
创建新的 Apex 类:
public with sharing class Stack63364119 {
static final String endpoint = 'https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=';
@AuraEnabled
public static String doCallout(Id contactId){
if(contactId == null){
throw new MyException('Missing record id');
}
List<Contact> contacts = [SELECT MailingCountry FROM Contact WHERE Id = :contactId];
if(contacts.isEmpty() || String.isBlank(contacts[0].MailingCountry)){
throw new MyException('Could not find the contact');
}
Contact c = contacts[0];
HttpRequest req = new HttpRequest();
req.setEndpoint(endpoint + c.MailingCountry);
req.setMethod('GET');
HTTPResponse res = new Http().send(req);
System.debug(res.getStatus());
System.debug(res.getBody());
// no special parsing, just chuck it into Description field
// no error handling
if(res.getStatusCode() == 200){
c.Description = res.getBody().abbreviate(32000);
update c;
}
return res.getBody();
}
public class MyException extends Exception{}
}
在开发者控制台中制作新的“闪电组件”(它将是 Aura,而不是 LWC)。您可以勾选关于“闪电般快速行动”的最后一个复选框。名称可以与类相同,但不是必须的。
对于组件(~ html 部分)粘贴这个
<!-- Loosely based on https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/controllers_server_actions_call.htm -->
<aura:component controller="Stack63364119" implements="force:hasRecordId,force:lightningQuickAction" >
<!-- in the name of all that is holy do not name the JS function same as the Apex class function, it'll give you very cryptic errors to debug -->
<aura:handler name="init" value="{!this}" action="{!c.runCallout}"/>
</aura:component>
对于 Controller (~ JavaScript)粘贴这个
({
runCallout : function(cmp) {
let action = cmp.get('c.doCallout');
action.setParams({contactId : cmp.get('v.recordId')});
action.setCallback(this, function(response){
let state = response.getState();
if (state === "SUCCESS") {
alert('Saved OK: ' + response.getReturnValue());
$A.get("e.force:closeQuickAction").fire(); // if you want to self-close
} else if (state === "ERROR") {
var errors = response.getError();
if (errors) {
if (errors[0] && errors[0].message) {
console.log("Error message: " + errors[0].message);
}
} else {
console.log("Unknown error");
}
}
});
$A.enqueueAction(action);
}
})
最后转到对象管理器 -> 联系人 -> 按钮链接和操作。创建新的快速操作。并将其添加到页面布局中!
它应该可以帮助您入门。也许你会决定稍微拆分一下,Apex 只会执行标注,将结果返回到 UI,如果用户满意 - 更新联系人可以使用以下之一完成:https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/data_service_save_record.htm .关注点分离等等(但用户会对 2 次点击感到满意)。
附言如果你调整它并且它死了但是很难看到任何 JavaScript 错误 - 这将是因为默认是在 Release模式下运行,SF 稍微重写你的源代码,优化,为像 IE11 这样的“浏览器”填充 polyfills......去设置 -> Debug模式并为您的用户启用。
附言在 sandbox/dev org 中,最好转到设置 -> session 设置 -> 并取消勾选“启用安全和持久的浏览器缓存以提高性能”。您的组件将永远是新鲜的,省去了按 Ctrl+R 的狂热。不要在产品中这样做 ;)
关于Salesforce - 单击按钮调用外部 API 并根据响应更新自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63364119/
我从下面的代码行收到错误“错误错误:AddIMRConroller 编译错误:字段表达式的初始术语必须是具体的 SObject:第 21 行第 23 列的列表”。 string[] str1 = im
Salesforce 支持不同的沙箱。 例如“部分”或“开发”沙箱。 有没有办法检测我的脚本连接到哪种沙箱? 我使用 Python 和 simple_salesforce。 最佳答案 我的 Pytho
下面一行在 salesforce 中给出了“FIELD_INTEGRITY_EXCEPTION”。请为此提供替代方案。 imr.Assigned_DTM__c = DateTime.valueOfGm
下面一行在 salesforce 中给出了“FIELD_INTEGRITY_EXCEPTION”。请为此提供替代方案。 imr.Assigned_DTM__c = DateTime.valueOfGm
我正在尝试实现批处理。我需要一些关于如何测试的帮助/指导。我在这里所做的只是在调试日志中显示机会名称。但是当我在 Apex 测试执行中运行 scheduleBatchable 类时,它也有测试类。未显
我在 salesforce 中创建了一个包,它将使用用户的电子邮件 ID 发出 http 标注请求以获取该电子邮件的数据并将数据添加到某个自定义对象。但是当我尝试使用 UserInfo.getUser
我正在尝试将 Salesforce 数据加载到 Python 数据框中,以便我们可以在那里进行所有操作。 simple_salesforce 处理了我们达到 2,000 限制的警告: from sim
我在 Salesforce 托管包中编写了一个 Apex 类,它使用 apex-lang 的托管版本。库包: global class MySorter implements al.Objectcom
我已经开始使用现有的应用程序,并且代码的唯一副本在 SalesForce 中。我如何备份(导出)它,以便在我弄得一团糟时可以回滚到这个原始代码? 最佳答案 有几个选项可以备份或添加版本控制到您的 Sa
Salesforce 向我抛出了一条新的错误消息,到目前为止我还没有在文档中找到任何有用的信息。我试图在 Controller 扩展中保存一个对象,它实际上保存了记录,但它没有返回到我指示的页面,而是
我需要防止输入重复名称。需要使用触发器来施加此限制。我想知道如何限制 DML 操作的发生。不确定 .addError 在批量代码中的用法。 Set Seta= new Set(); for(oj_
我正在尝试通过创建一个触发器来解决基于“邮箱已满”的邮件退回问题,该触发器在邮件包含“邮箱已满”时重新发送邮件。 我面临的问题是我需要将重新发送的次数限制为 3 次。 一旦收到退回的电子邮件,我现在就
salesforce.com 中单个自定义对象中的最大记录数是多少? https://login.salesforce.com/help/doc/en/limits.htm 中似乎没有指出限制 当然,
是否可以为具有配置文件的用户使用共享规则。如果用户有配置文件,它们有什么用吗?或者配置文件是否完全覆盖了记录访问权限,这样我就可以忘记共享规则? 我的情况是我的所有用户都有个人资料。我想做的是将某些记
自从我不得不进行 S2S 集成以来,已经发布了几个版本,但我遇到了一个意想不到的问题,希望有人能更有效地解决这个问题。 我有两个组织,通过 S2S 共享联系人。 每个组织中的联系人都具有相同的架构,即
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 去年关闭。 社区在 3 个月前审查了是否重新
我正在查看SOQL文档,但找不到查询来获取实体的所有字段数据,例如Account,例如 select * from Account [ SQL syntax ] SOQL中是否有类似上面的语法来提取a
我正在尝试通过允许指定无效电子邮件地址的其他服务将电子邮件地址存储在 Salesforce.com 中。如果这些错误的无效电子邮件地址之一通过其 Web 服务 API 发送到 Salesforce.c
我想获取安装在 salesforce 组织中的所有包的命名空间前缀。我该怎么做? 最佳答案 一种相当简单的方法是查询 ApexClass 对象并获取不同的 NamespacePrefix 值。 Sel
你好, 好吧,我很困惑。我的任务是更新一个 PHP 脚本,该脚本使用 BulkAPI 将一些数据 upsert 到 Opportunity 实体中。 这一切都很顺利,只是 Bulk API 为一些明确
我是一名优秀的程序员,十分优秀!