2011-10-20 36 views
2

我想將Salesforce VisualForce頁面轉換爲我公司網站的窗口小部件。我想使用服務器端代碼和服務帳戶訪問小部件。我會緩存,樣式,並在我的網頁中輸出小部件html。我知道我可以通過服務器端代碼和幾個API調用重新創建窗口小部件,但是我喜歡能夠在Salesforce中管理窗口小部件並讓該窗口小部件可供在Salesforce中的其他位置重用的想法。將Salesforce VisualForce頁面視爲外部窗口小部件

在這種情況下,小部件將報告我們在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頁面。但是,這感覺笨拙和不支持。

現在我正在考慮製作一個公開的新網站來公開我的小工具。至少我可以放心地刮掉那個頁面。

任何幫助表示讚賞。我現在要使用匿名網站方法。

回答

8

渲染數據到Visualforce頁面,然後屏幕抓取似乎有點脆,更不用提效率低下 - 有一個更好的辦法...

定義頂點REST Web服務,那麼你可以很容易地調用該Web服務從您的服務器端代碼中提取出來,如果需要,仍然可以在Visualforce中渲染它 - 您可以像調用其他Apex方法一樣調用Apex REST方法。

下面是一個示例REST Web服務。我只是在一個Map<String,String>在這裏,但你可以返回任何原始類型,任何的sObject或原語或sObjects的列表或地圖(只要該地圖具有字符串鍵) - 見the Apex REST Web Services docs

@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調用它(我假設你有一個訪問令牌(也稱爲會話ID)和實例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

很好的回答;這是一個更好的做事方式。 –

+0

現在看起來頭等。我會在這個週末嘗試一下。謝謝! – twamley

+0

不客氣!如果一切正常,請將對號移動到此答案,以便我們推廣最佳做法:-) – metadaddy

0

我不知道這是否會滿足您的需要,但有你可以嘗試一個網址:

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

一旦頁面加載,你可以重定向到URL窗口小部件。

+0

哦,這可能工作。測試一下。 – twamley

+0

謝謝,馬修。我得到它與該網址的工作。我必須在第一個和第二個請求之間共享一個CookieContainer,以便認證繼續進行 - 但它工作正常!我不假設你知道frontdoor.jsp是否需要一個重定向參數,我可以在一個請求中而不是兩個請求中執行它? – twamley

+0

我試過retURL PARAM,我感到我必須有啓動Javascript的錯誤信息(我使用C#和HttpWebRequest的)。 CookieCollection和兩個請求工作得不錯。再次感謝。 – twamley

0

聽起來像Force.com站點正是你想要的。

站點背後的想法是,它允許您訪問Visualforce頁面而無需登錄。

+0

當我願意咬掉一大塊Salesforce網站時,我認爲您是對的。但在這種情況下,我正在使用「小部件」。寶貝如果你願意的話。爲了讓一個部件離開我的網站,我可以IFrame或屏幕刮 - 它們都感覺笨拙。我將按照metadaddy的建議設置自定義REST Web服務。不過謝謝。 – twamley

相關問題