ApexでForce.comサイトのドメイン部分取得を試してみました。Force.comサイトはSalesforceの仕組みで外部公開できるWebサイトを構築できる仕組みです。
URLはこんな感じになります。※developer-editionはDE組織の場合に自動で表示される部分。
https://<任意の値>-developer-edition.ap5.force.com/
Force.comサイトのURLも本番組織とSandbox組織で別々のURLが設定されます。Sandbox組織にも個別にURLが付与されるのは便利ですが、検証用にSandbox組織のサイトURLをブックマークしておいたあとに組織のリフレッシュを行った場合、URLが新しくなるためブックマークをやり直す必要が出てきます。
このブックマークのやり直しが少し面倒な作業となってしまうので自動的にリンクを用意できる仕組みを考えてみました。今回参考にしたのはこちらのページです。
下記の処理で取得できるのと紹介がありました。
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"
コピペして開発者コンソールで試してみると・・・
無事にドメイン部分を取得できました。
動作することは確認できたので、今回やりたいことに合わせてApexクラスを用意します。
基本的にはコンストラクタメソッドでURLを取得しているだけです。クエリ取得処理やURL取得処理は別メソッドに分けて呼び出すようにするとメンテがしやすくなります。(ちゃんとした機能として実装するときはHelperクラス、Daoクラスというように別クラスに分けたりします。)
Apexクラス実装時に注意が必要なのはPageReference型変数に対してgetContent処理を行うとき、getContent処理はテストクラス内では実行することができたいため、『Test.isRunningTest()』処理でテストクラスでの処理を分岐させています。
Apexクラスの用意ができたらVisualforceページ側でリンクを用意するだけです。siteUrl変数にForce.comサイトのドメイン部分が格納されているのであとはページ名やURLパラメータを文字列で付与するだけ。
こんな感じでつくったページがこちら。ラベルとボタンが表示されているだけの簡易な機能ですが、検証等でアクセスするForce.comサイトページのリンク集として活用できます。
ボタンにマウスを当てればリンクが設定されていることを確認できます。
こうしたページを用意しておけばSandboxリフレッシュ後に一ページずつURLを確認していく手間が省けるので作業が効率化されます。ApexでForce.comサイトのドメイン部分取得の仕組みこんな感じで活用するのが良いと思います。