tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:ApexによるForce.comサイトのドメイン部分取得を試してみました

ApexでForce.comサイトのドメイン部分取得を試してみました。Force.comサイトはSalesforceの仕組みで外部公開できるWebサイトを構築できる仕組みです。
f:id:tyoshikawa1106:20190421104735p:plain


URLはこんな感じになります。※developer-editionはDE組織の場合に自動で表示される部分。

https://<任意の値>-developer-edition.ap5.force.com/


Force.comサイトのURLも本番組織とSandbox組織で別々のURLが設定されます。Sandbox組織にも個別にURLが付与されるのは便利ですが、検証用にSandbox組織のサイトURLをブックマークしておいたあとに組織のリフレッシュを行った場合、URLが新しくなるためブックマークをやり直す必要が出てきます。


このブックマークのやり直しが少し面倒な作業となってしまうので自動的にリンクを用意できる仕組みを考えてみました。今回参考にしたのはこちらのページです。
f:id:tyoshikawa1106:20190421105521p:plain

Get Site URL from apex - Salesforce Stack Exchange


下記の処理で取得できるのと紹介がありました。

String name = 'mysite';

Site site = [
    SELECT GuestUserId
    FROM Site
    WHERE Name = :name
];

String path = '/sites/servlet.SiteDebugMode';
PageReference pr = new PageReference(path);
pr.getParameters().put('guid', site.GuestUserId);
pr.getParameters().put('sitedebugmode', 'x');
String url = pr.getContent().toString().substringAfter('URL=').substringBefore(path);

System.debug(url); //eg "http://dev-bigass.cs81.force.com/mysite"


コピペして開発者コンソールで試してみると・・・
f:id:tyoshikawa1106:20190421110056p:plain


無事にドメイン部分を取得できました。
f:id:tyoshikawa1106:20190421110212p:plain


動作することは確認できたので、今回やりたいことに合わせてApexクラスを用意します。
f:id:tyoshikawa1106:20190421110543p:plain


基本的にはコンストラクタメソッドでURLを取得しているだけです。クエリ取得処理やURL取得処理は別メソッドに分けて呼び出すようにするとメンテがしやすくなります。(ちゃんとした機能として実装するときはHelperクラス、Daoクラスというように別クラスに分けたりします。)
f:id:tyoshikawa1106:20190421110842p:plain:w300


Apexクラス実装時に注意が必要なのはPageReference型変数に対してgetContent処理を行うとき、getContent処理はテストクラス内では実行することができたいため、『Test.isRunningTest()』処理でテストクラスでの処理を分岐させています。
f:id:tyoshikawa1106:20190421111033p:plain


Apexクラスの用意ができたらVisualforceページ側でリンクを用意するだけです。siteUrl変数にForce.comサイトのドメイン部分が格納されているのであとはページ名やURLパラメータを文字列で付与するだけ。
f:id:tyoshikawa1106:20190421112658p:plain


こんな感じでつくったページがこちら。ラベルとボタンが表示されているだけの簡易な機能ですが、検証等でアクセスするForce.comサイトページのリンク集として活用できます。
f:id:tyoshikawa1106:20190421111533p:plain


ボタンにマウスを当てればリンクが設定されていることを確認できます。
f:id:tyoshikawa1106:20190421111833p:plain


こうしたページを用意しておけばSandboxリフレッシュ後に一ページずつURLを確認していく手間が省けるので作業が効率化されます。ApexでForce.comサイトのドメイン部分取得の仕組みこんな感じで活用するのが良いと思います。