Всем доброе утро,
Прежде всего, Force.com IDE и Salesforce - это новый для меня набор навыков. Я пытаюсь использовать библиотеку TwilioForce APEX: https://www.twilio.com/docs/salesforce/install
для создания нового лида Salesforce для каждого входящего звонка в учетной записи Twilio моего клиента. Я дошел до создания нового проекта Force.com в Eclipse, скопировав в проект компоненты, классы и страницы Twilioforce, но мне нужны некоторые рекомендации по написанию логики для создания лида.
У меня есть вопросы: 1. Можете ли вы предоставить ссылки на справочные материалы, демонстрирующие, как программно создать нового потенциального клиента в Salesforce? 2. Как мне протестировать компоненты TwilioForce, особенно те, которые я изменил, чтобы отразить номер телефона Twilio и токен моего клиента? Можно ли их вызывать из проекта Force.com в Eclipse или их нужно вызывать из моей учетной записи developer.org? 3. Как только я выясню, как выполнить вышеуказанное создание лида из входящих вызовов Twilio, как мне развернуть созданную мной кодовую базу для моего клиента?
Спасибо, Сид
РЕДАКТИРОВАТЬ: EyeScream, ваш образец очень помог. Вот класс TwilioRestResponse, поставляемый с кодовой базой TwilioForce:
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 и вставить в соответствующие поля в новом лиде. Каков подходящий синтаксис для ссылки на CallObject.PhoneNumberSid в моем новом лиде? Как вариант, лучше разобрать TwilioRestResponse? Если да, как мне выбрать только номер телефона и имя вызывающего абонента из GetResponseText?
Еще раз спасибо, Сид