[英]Cannot Update Custom Date field via SalesForce API (JSforce)
[英]Salesforce - Call external API on button click and update custom field from response
所以我首先要说我是 C#.Net/Javascript 开发人员,经验丰富,但我对 Salesforce 的经验为零。 在今天之前从未见过它。 因此,另一个团队要求我向联系人 object 添加一个自定义按钮,单击该按钮会调用外部 API 并使用响应更新联系人中的自定义字段。 它被宣传为“只需编写一些 Javascript,当单击按钮时调用 API,它实际上嵌入到页面中,15 分钟的工作......”。
在看起来相当过时的文档之后,我最终进入了 Object 管理器,选择了联系人 object,然后我进入了按钮、链接和操作页面。 我假设在此之前使用 Execute Javascript 行为完成,在 Lightning 版本中我建议不要使用。 因此,经过多次谷歌搜索,我已经阅读了有关 APEX 类、Visualforce 组件、Lightning 组件、Salesforce REST API 等的信息。不是 15 分钟的工作。
本质上,要求是在此联系人页面中嵌入一个按钮(或操作,或者..?),以便当销售人员单击它时,它会收集一些联系人的详细信息并使用它们来形成对外部服务的 API 调用. 数据将用于形成响应,然后必须读取该响应(如 JSON,然后解析)并写入联系人上的自定义字段。
开发解决方案的最佳方法是什么? 在 Apex 调试环境中,我将调用 API 并解析 JSON 响应的代码放在一起,我假设我需要将其包装在 Apex ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 方法中调用此代码并返回响应。 我不确定如何从按钮调用它,并更新联系人中的字段。 我是否需要通过 Apex Class 方法完成所有这些工作? 传递对联系人的引用,或者是否有另一个组件需要介于两者之间并执行此操作。 我是否正确假设我需要使用 Salesforce API 来更新联系人?
任何指针表示赞赏。
我会写信给你我的方法
记录页面/页面布局上的按钮 -> 照明组件或流程 -> Apex class 用于收集数据 -> apex class 请求和响应 API(不要忘记将端点添加到远程站点设置)-> 解析响应并更新联系人(您可以在 Apex 中使用查询和 DML 操作)
照明组件将非常简单,只需将顶点 class 作为 controller 示例
<aura:component implements="force:appHostable,lightning:isUrlAddressable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" controller="contactController" access="global" >
<aura:handler name="init" value="{!this}" action="{!c.fetchContact}"/>
</aura:component>
controller
({
fetchContact : function(component, event, helper) {
helper.fetchContactHelper(component, event, helper);
}
})
帮手
({
fetchAccHelper : function(component, event, helper) {
var action = component.get("c.fetchContacts");
action.setParams({
});
action.setCallback(this, function(response){
var state = response.getState();
if (state === "SUCCESS") {
}
});
$A.enqueueAction(action);
}
})
假设是顶点 function 是 fetchContacts 和 class contactController
天啊。 这可能是一个 15 分钟的工作,但绝对是“当你知道如何做的时候很容易”或者有一些例子;)
JSON.deserializeUntyped()
手工制作解析器,但寿命太短了。 这是一个很好的 apex 代码生成器,类似于您从解析 WSDL 获得的内容: https://json2apex.herokuapp.com/我们将尝试做 Aura 组件的方式。 这很难看,LWC 是未来,但嘿,它会让你开始。
Go 到设置 -> 远程站点设置并使用https://en.wikipedia.org/
添加新条目
创建新的 Apex class:
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)。 您可以勾选关于“闪电般快速行动”的最后一个复选框。 名称可以与 class 相同,但不必如此。
对于组件(~ 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);
}
})
最后 go Object Manager -> Contact -> Buttons Links and Actions。 创建新的快速操作。 并将其添加到页面布局!
它应该让你开始。 也许您会决定将其拆分一下,Apex 只会进行标注,将结果返回给 UI,如果用户满意 - 可以使用以下方法之一更新联系人: https://developer.salesforce.com/docs /atlas.en-us.lightning.meta/lightning/data_service_save_record.htm 。 关注点分离等等(但用户是否会对 2 次点击感到满意)。
PS如果你调整它并且它死了但是很难看到任何 JavaScript 错误 - 这将是因为默认是在发布模式下运行,SF 稍微重写你的源代码,优化,为像 IE11 这样的“浏览器”添加填充... Go 设置 -> 调试模式并为您的用户启用。
PPS 在沙盒/开发组织中,最好使用 go 设置 -> Session 设置 -> 并取消选中“启用安全和持久的浏览器缓存以提高性能”。 您的组件将永远是新鲜的,节省了一些疯狂的按 Ctrl+R。 不要在产品中这样做;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.