gpt4 book ai didi

google-maps - 如何将 Salesforce 与 Google map 集成?

转载 作者:行者123 更新时间:2023-12-04 16:56:34 25 4
gpt4 key购买 nike

如何将 Salesforce 与 Google map 集成?我只是在寻找有关如何...

  • 在 Salesforce 中搜索联系人
  • 在谷歌地图上绘制它们。
  • 最佳答案

    编辑 :

    感谢 tggagne的评论我已经意识到人们仍然看到这个答案。这里的代码已经有 2.5 年的历史了。如果您想查看它 - 检查编辑历史记录。

    很多同时发生了变化,创建了更多混搭示例。其中最重要的是 Cory Cowgill 的“SF Bus Radar”(githubyoutube)应用程序(我认为是在 Dreamforce'11 上创建的)。

    尽管如此 - 这是我更新的示例,其中包含服务器端地理编码、地理定位类型的新字段和 JSON 解析器的使用。

    它尝试将地理编码结果缓存在联系人记录中。请记住,它可能不是“生产就绪”(没有 Google Business API key = 因为我们所有的请求都来自同一个 Salesforce IP 服务器池 there might be error messages)。这就是为什么我也离开了客户端地理编码。




    在 checkout 之前,您需要在环境中进行 2 处更改:

  • 添加指向 Remote Site Setting 的“https://maps.googleapis.com”启用来自 Apex
  • 的标注
  • 在设置 -> 自定义 -> 联系人 -> 字段中添加字段“位置”。类型应为“地理位置”。我选择了显示为小数和 6 位小数的精度。
    public with sharing class mapController {
    public String searchText {get;set;}
    public List<Contact> contacts{get; private set;}

    public static final String GEOCODING_URI_BASE = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=';

    // For purposes of this demo I'll geocode only couple of addresses server-side. Real code can use the commented out value.
    public static final Integer MAX_CALLOUTS_FROM_APEX = 3; // Limits.getLimitCallouts()

    public mapController(){
    searchText = ApexPages.currentPage().getParameters().get('q');
    }

    public void find() {
    if(searchText != null && searchText.length() > 1){
    List<List<SObject>> results = [FIND :('*' + searchText + '*') IN ALL FIELDS RETURNING
    Contact (Id, Name, Email, Account.Name,
    MailingStreet, MailingCity, MailingPostalCode, MailingState, MailingCountry,
    Location__Latitude__s, Location__Longitude__s)
    ];
    contacts = (List<Contact>)results[0];
    if(contacts.isEmpty()){
    ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'No matches for "' + searchText + '"'));
    } else {
    serverSideGeocode();
    }
    } else {
    if(contacts != null) {
    contacts.clear();
    }
    ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Please provide at least 2 characters for the search.'));
    }
    }

    public void clearGeocodedData(){
    for(Contact c : contacts){
    c.Location__Latitude__s = c.Location__Longitude__s = null;
    }
    Database.update(contacts, false);
    contacts.clear();
    }

    public String getContactsJson(){
    return JSON.serialize(contacts);
    }
    public String getDebugContactsJson(){
    return JSON.serializePretty(contacts);
    }

    private void serverSideGeocode(){
    List<Contact> contactsToUpdate = new List<Contact>();
    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setMethod('GET');
    req.setTimeout(10000);

    for(Contact c : contacts){
    if((c.Location__Latitude__s == null || c.Location__Longitude__s == null)){
    String address = c.MailingStreet != null ? c.MailingStreet + ' ' : '' +
    c.MailingCity != null ? c.MailingCity + ' ' : '' +
    c.MailingState != null ? c.MailingState + ' ' : '' +
    c.MailingPostalCode != null ? c.MailingPostalCode + ' ' : '' +
    c.MailingCountry != null ? c.MailingCountry : '';
    if(address != ''){
    req.setEndpoint(GEOCODING_URI_BASE + EncodingUtil.urlEncode(address, 'UTF-8'));
    try{
    HttpResponse res = h.send(req);
    GResponse gr = (GResponse) JSON.deserialize(res.getBody(), mapController.GResponse.class);
    if(gr.status == 'OK'){
    LatLng ll = gr.results[0].geometry.location;
    c.Location__Latitude__s = ll.lat;
    c.Location__Longitude__s = ll.lng;
    contactsToUpdate.add(c);
    } else {
    ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Geocoding of "' + address + '" failed:' + gr.status));
    }
    }catch(Exception e){
    ApexPages.addMessages(e);
    }
    }
    // Bail out if we've reached limit of callouts (not all contacts might have been processed).
    if(Limits.getCallouts() == MAX_CALLOUTS_FROM_APEX) {
    break;
    }
    }
    }
    if(!contactsToUpdate.isEmpty()) {
    Database.update(contactsToUpdate, false); // some data in Developer editions is invalid (on purpose I think).
    // If update fails because "j.davis@expressl&amp;t.net" is not a valid Email, I want the rest to succeed
    }
    }

    // Helper class - template into which results of lookup will be parsed. Some fields are skipped!
    // Visit https://developers.google.com/maps/documentation/geocoding/#Results if you need to create full mapping.
    public class GResponse{
    public String status;
    public GComponents[] results;
    }
    public class GComponents{
    public String formatted_address;
    public GGeometry geometry;
    }
    public class GGeometry {
    public LatLng location;
    }
    public class LatLng{
    public Double lat, lng;
    }
    }

  • <apex:page controller="mapController" tabStyle="Contact" action="{!find}" id="page">
    <head>
    <style>
    div #map_canvas { height: 400px; }
    </style>
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
    </head>
    <apex:sectionHeader title="Hello StackOverflow!" subtitle="Contact full text search + Google Maps integration" />
    <apex:pageMessages />
    <apex:form id="form">
    <apex:pageBlock id="searchBlock">
    <apex:inputText value="{!searchText}" />
    <apex:commandButton value="Search" action="{!find}"/>
    <p>Examples: <a href="/apex/{!$CurrentPage.Name}?q=USA">"USA"</a>, "Singapore", "Uni", "(336) 222-7000". If it works in the global search box, it will work here.</p>
    </apex:pageBlock>
    <apex:pageBlock title="Found {!contacts.size} Contact(s)..." rendered="{!NOT(ISNULL(contacts)) && contacts.size > 0}" id="resultsBlock">
    <apex:pageBlockButtons location="top">
    <apex:commandButton value="Clear cached locations" title="Click if you want to set 'null' as geolocation info for all these contacts" action="{!clearGeocodedData}" />
    </apex:pageBlockButtons>
    <apex:pageBlockTable value="{!contacts}" var="c" id="contacts">
    <apex:column headerValue="{!$ObjectType.Contact.fields.Name.label}">
    <apex:outputLink value="../{!c.Id}">{!c.Name}</apex:outputLink>
    </apex:column>
    <apex:column headerValue="Address">
    {!c.MailingStreet} {!c.MailingCity} {!c.MailingCountry}
    </apex:column>
    <apex:column value="{!c.Account.Name}"/>
    <apex:column headerValue="Location (retrieved from DB or geocoded server-side)">
    {!c.Location__Latitude__s}, {!c.Location__Longitude__s}
    </apex:column>
    </apex:pageBlockTable>
    <apex:pageBlockSection columns="1" id="mapSection">
    <div id="map_canvas" />
    </apex:pageBlockSection>
    <apex:pageBlockSection title="Click to show/hide what was geocoded server-side and passed to JS for further manipulation" columns="1" id="debugSection">
    <pre>{!debugContactsJson}</pre>
    </apex:pageBlockSection>
    <pre id="log"></pre>
    </apex:pageBlock>
    </apex:form>
    <script type="text/javascript">
    twistSection(document.getElementById('page:form:resultsBlock:debugSection').childNodes[0].childNodes[0]); // initially hide the debug section

    var contacts = {!contactsJson}; // Array of contact data, some of them might have lat/long info, some we'll have to geocode client side
    var coords = []; // Just the latitude/longitude for each contact
    var requestCounter = 0;

    var markers = []; // Red things we pin to the map.
    var balloon = new google.maps.InfoWindow(); // Comic-like baloon that floats over markers.

    function geocodeClientSide() {
    for(var i = 0; i < contacts.length; i++) {
    if(contacts[i].Location__Latitude__s != null && contacts[i].Location__Longitude__s != null) {
    coords.push(new google.maps.LatLng(contacts[i].Location__Latitude__s, contacts[i].Location__Longitude__s));
    } else {
    ++requestCounter;
    var address = contacts[i].MailingStreet + ' ' + contacts[i].MailingCity + ' ' + contacts[i].MailingCountry;
    var geocoder = new google.maps.Geocoder();
    if (geocoder) {
    geocoder.geocode({'address':address}, function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
    coords.push(results[0].geometry.location);
    } else {
    var pTag = document.createElement("p");
    pTag.innerHTML = status;
    document.getElementById('log').appendChild(pTag);
    }
    if(--requestCounter == 0) {
    drawMap();
    }
    });
    }
    }
    }
    // It could be the case that all was geocoded on server side (or simply retrieved from database).
    // So if we're lucky - just proceed to drawing the map.
    if(requestCounter == 0) {
    drawMap();
    }
    }

    function drawMap(){
    var mapOptions = {
    center: coords[0],
    zoom: 3,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    for(var i = 0; i < coords.length; ++i){
    var marker = new google.maps.Marker({map: map, position: coords[i], title:contacts[i].Name, zIndex:i});

    google.maps.event.addListener(marker, 'click', function() {
    var index = this.zIndex;
    balloon.content = '<b>'+contacts[index].Name + '</b><br/>' + contacts[index].Account.Name + '<br/>' + contacts[index].Email;
    balloon.open(map,this);
    });
    markers.push(marker);
    }
    }

    geocodeClientSide();
    </script>
    </apex:page>

    关于google-maps - 如何将 Salesforce 与 Google map 集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122038/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com