大家早上好,
首先,Force.com IDE 和 Salesforce 对我来说是一项新技能。我正在尝试使用 TwilioForce APEX 库:https ://www.twilio.com/docs/salesforce/install
为我客户的 Twilio 帐户上的每个来电创建新的 Salesforce 潜在客户。我已经在 Eclipse 中创建了一个新的 Force.com 项目,将 Twilioforce 组件、类和页面复制到项目中,但需要一些指导来了解如何编写逻辑来创建线索。
我的问题: 1. 您能否提供指向参考材料的链接,以演示如何以编程方式在 Salesforce 中创建新的潜在客户?2. 如何测试 TwilioForce 组件,尤其是我为反映客户的 Twilio 电话号码和令牌而更改的组件?这些可以从 Eclipse 的 Force.com 项目中调用,还是必须从我的 developer.org 帐户调用?3. 一旦我弄清楚如何通过传入的 Twilio 调用完成上述潜在客户创建,我如何将我创建的代码库部署到我的客户?
谢谢, 席德
编辑:EyeScream,你的样本是一个巨大的帮助。这是 TwilioForce 代码库附带的 TwilioRestResponse 类:
public class TwilioRestResponse {
private String responseText;
private integer httpStatus;
private String url;
private String queryString;
private boolean error;
public TwilioRestResponse(String url, String text, integer status){
Pattern p = Pattern.compile('([^?]+)\\??(.*)');
Matcher m = p.matcher(url);
m.matches();
this.url = m.group(1);
this.queryString = m.group(2);
this.responseText = text;
this.httpStatus=status;
this.error = (status>=400);
}
// getters and setters
public String getResponseText() {
return responseText;
}
public void setResponseText(String responseText) {
this.responseText = responseText;
}
public integer getHttpStatus() {
return httpStatus;
}
public void setHttpStatus(integer httpStatus) {
this.httpStatus = httpStatus;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getQueryString() {
return queryString;
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
}
还有一个 CallsXmlParser 类,如下所示:
public class CallsXmlParser{
//All Parsed records will be in this list
public List<Call> listRecords = new List<Call>();
//Data Model to store all response elements
public class Call{
public string Sid{get;set;}
public string DateCreated{get;set;}
public string DateUpdated{get;set;}
public string CallSegmentSid{get;set;}
public string AccountSid{get;set;}
public string Called{get;set;}
public string Caller{get;set;}
public string PhoneNumberSid{get;set;}
public string Status{get;set;}
public string StartTime{get;set;}
public string EndTime{get;set;}
public string Duration{get;set;}
public string Price{get;set;}
public string Flags{get;set;}
public string Annotation{get;set;}
}
public CallsXmlParser(){
}
public CallsXmlParser(string data){
XmlStreamReader xsr = new XmlStreamReader(data);
listRecords = parse(xsr);
}
public Call[] parse(XmlStreamReader reader) {
Call[] members = new Call[0];
while(reader.hasNext()) {
if (reader.getEventType() == XmlTag.START_ELEMENT) {
if ('Call' == reader.getLocalName()) {
Call member = parseMember(reader);
members.add(member);
}
}
reader.next();
}
return members;
}
//Parsing Each Call Tag and its nested tags
public Call parseMember(XmlStreamReader reader){
Call callObject = new Call();
while(reader.hasNext()) {
if ('Call' == reader.getLocalName() && reader.getEventType() == XmlTag.END_ELEMENT) {
break;
}
else if('Sid' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Sid = reader.getText();
}
}else if('DateCreated' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.DateCreated= reader.getText();
}
}else if('DateUpdated' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.DateUpdated= reader.getText();
}
}else if('CallSegmentSid' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.CallSegmentSid= reader.getText();
}
}else if('AccountSid' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.AccountSid= reader.getText();
}
}else if('Called' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Called= reader.getText();
}
}else if('Caller' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Caller= reader.getText();
}
}else if('PhoneNumberSid' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.PhoneNumberSid= reader.getText();
}
}else if('Status' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Status = reader.getText();
}
}else if('StartTime' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.StartTime = reader.getText();
}
}else if('EndTime' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.EndTime = reader.getText();
}
}else if('Duration' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Duration = reader.getText();
}
}else if('Price' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Price = reader.getText();
}
}else if('Flags' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Flags = reader.getText();
}
}else if('Annotation' == reader.getLocalName() && reader.getEventType() == XmlTag.START_ELEMENT){
reader.next();
if(reader.getEventType() == XmlTag.CHARACTERS) {
callObject.Annotation = reader.getText();
}
}
reader.next();
}
return callObject;
}
}
我非常基本的 insertLead 类如下:
public with sharing class insertLead {
Lead1 = new Lead(Phone='TwilioRestResponse.GetResponseText');
}
我需要从 TwilioRestResponse 或 CallXmlParser 类中读取电话号码和 CallerID 名称,并将其插入新潜在客户的适当字段中。在我的新潜在客户中引用 CallObject.PhoneNumberSid 的适当语法是什么?或者,解析出 TwilioRestResponse 更好吗?如果是这样,我将如何从 GetResponseText 中仅选择电话号码和 CallerID Name?
再次感谢,席德