Рассматривайте страницу Salesforce VisualForce как внешний виджет - PullRequest
2 голосов
/ 21 октября 2011

Я хочу превратить Salesforce VisualForce Page в виджет для моего корпоративного сайта.Я хочу получить доступ к виджету, используя код на стороне сервера и учетную запись службы.Я буду кэшировать, стилизовать и выводить html виджета на мою веб-страницу.Я знаю, что мог бы просто воспроизвести виджет с серверным кодом и несколькими вызовами API, но мне нравится идея иметь возможность управлять виджетом в Salesforce и иметь виджет, доступный для повторного использования в другом месте в Salesforce.

В этом случае виджет будет сообщать о текущих лидерах в конкурсе, который мы отслеживаем в Salesforce.Я планирую использовать этот подход для других «мини-отчетов».Это очень полезный шаблон.Я уверен, что кто-то там уже элегантно решил это.Мои поиски пока пусты.

Я пытался избежать Сайтов, потому что пользователь, попавший на наш корпоративный сайт, не имеет учетной записи в Salesforce (сейчас я думаю о сайте, который разрешает анонимный доступ).

Моя первая попытка выглядела так (навеяно SSO для портала самообслуживания):

var ws = new sfapi.SforceService();
var lr = ws.login(Secrets.salesforce_user_name, Secrets.salesforce_password);
string url = "https://na6.salesforce.com/apex/mywidget?sessionId=" + lr.sessionId;

Я тоже пробовал? Sid и? Csssid, но подобные ссылки просто отсылают меня кСтраница входа в систему Salesforce:

https://na6.salesforce.com/apex/mywidget?sessionId=00D3000000myorg!my-session-id-from-logging-in-with-the-api-8_i2fX_9wnYdwnwatGVuX6jGjmVmnv50j78yfGF1aKHdoDFtIx_J9

Вероятно, я мог бы использовать стандартные методы очистки экрана для публикации в стандартной форме входа в систему Salesforce с именем пользователя и паролем, а затем открыть страницу / apex / mywidget.Но это кажется неуклюжим и неподдерживаемым.

Теперь я думаю о создании нового сайта, который будет доступен для общественности только для того, чтобы раскрыть мой виджет.По крайней мере, я мог бы с уверенностью отсканировать эту страницу.

Любая помощь приветствуется.Сейчас я собираюсь поиграть с подходом анонимных сайтов.

Ответы [ 3 ]

9 голосов
/ 28 октября 2011

Рендеринг данных на страницу Visualforce, а затем отрисовка экрана кажется немного ломкой, не говоря уже о неэффективности - есть лучший способ ...

Определите веб-сервис Apex REST, затем вы можете легко вызвать этот веб-сервис из кода на стороне сервера и, при необходимости, по-прежнему отображать его в Visualforce - вы можете вызвать метод REST Apex, как и любой другой метод Apex. *

Вот пример веб-службы REST. Я просто возвращаю Map<String,String> здесь, но вы можете вернуть любой примитивный тип, любой sObject или List или Map примитивов или sObjects (если у Map есть строковые ключи) - см. веб-сервисы Apex REST документы

@RestResource(urlMapping='/MyResource/*')
global with sharing class MyRestResource {
    @HttpGet
    global static Map<String,String> getResource() {
        Map<String,String> result = new Map<String,String>();

        result.put('key1', 'value1');
        result.put('key2', 'value2');

        return result;
    }
}

Вот некоторый PHP, который вызывает его (я предполагаю, что у вас есть токен доступа (или идентификатор сеанса) и URL-адрес экземпляра):

$url = "$instance_url/services/apexrest/MyResource";
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
  array("Authorization: OAuth $access_token",
    "Content-type: application/json"));

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 200 ) {
    die("Error: call to URL $url failed with status $status, ".
      "response $json_response\n");
}

$response = json_decode($json_response, true);

echo "The service says ".$response['key1'].' '.$response['key2']."\n";

curl_close($curl);

А вот страница Visualforce, если вы хотите показать те же данные

<apex:page controller="TestRestController">
  <p>Controller says {!result}</p>
</apex:page>

Контроллер страницы:

public class TestRestController {
    public String getResult() {
        Map<String, String> result = MyRestResource.getResource();

        return result.get('key1') + ' ' + result.get('key2');
    }
}
0 голосов
/ 22 октября 2011

Похоже, что Force.com Sites - это именно то, что вам нужно.

Идея сайтов заключается в том, что она позволяет вам получать доступ к страницам Visualforce без необходимости входа в систему.

0 голосов
/ 21 октября 2011

Я не уверен, что это будет работать для ваших целей, но есть URL, который вы можете попробовать:

https://<endpoint host>/secur/frontdoor.jsp?sid=<session id>

После загрузки этой страницы вы можете перенаправить на URL виджета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...