[salesforce]Force.com SitesでユーザフレンドリーなURLの設定
Force.com Sitesで外部公開するページのURLは通常は、
http://[設定したドメイン]/[Visualforceページ名]
という形になります。
例:http://abeuhuru-developer-edition.na2.force.com/calendarsmallPage
このままだと、ドメイン以下の部分にスラッシュをたくさんつけたり、Visualforceページ名として許可されていない文字をURLに混ぜることができません。例えばブログでよくあるURLのように
http://myblog.force.com/posts/2009/12/31/auld-lang-syne
みたいなURLを提供することができず、全てのページがドメインの直下に並んでいるように見えるので、ユーザビリティ的にもSEO的にも問題になることがあります。
このURLをリライトして自由な文字列を設定できる仕組みとして、UrlRewriter という仕組みが提供されています。この仕組みを使うことで、従来では
http://myblog.force.com/posts?id=003D000000Q0PcN
こんなURLだったページに、
http://myblog.force.com/posts/2009/12/31/auld-lang-syne
こんなURLでアクセスすることが可能になります。
1.リライトするためのAPEXクラスを書く
リライトの仕組みを使うには、そのためのAPEXクラスを書く必要があります。これが無いとこの仕組みは使えません。めんどいですががんばりましょう。
例えば、こんな感じのクラスを書きます。
[php]
global with sharing class myRewriter implements Site.UrlRewriter {
//Variables to represent the user-friendly URLs for
//account and contact pages
String ACCOUNT_PAGE = ‘/myaccount/’;
String CONTACT_PAGE = ‘/mycontact/’;
//Variables to represent my custom Visualforce pages
//that display account and contact information
String ACCOUNT_VISUALFORCE_PAGE = ‘/myaccount?id=’;
String CONTACT_VISUALFORCE_PAGE = ‘/mycontact?id=’;
global PageReference mapRequestUrl(PageReference
myFriendlyUrl){
String url = myFriendlyUrl.getUrl();
if(url.startsWith(CONTACT_PAGE)){
//Extract the name of the contact from the URL
//For example: /mycontact/Ryan returns Ryan
String name = url.substring(CONTACT_PAGE.length(),
url.length());
//Select the ID of the contact that matches
//the name from the URL
Contact con = [select id from Contact where name =:
name LIMIT 1];
//Construct a new page reference in the form
//of my Visualforce page
return new PageReference(CONTACT_VISUALFORCE_PAGE + con.id);
}
if(url.startsWith(ACCOUNT_PAGE)){
//Extract the name of the account
String name = url.substring(ACCOUNT_PAGE.length(),
url.length());
//Query for the ID of an account with this name
Account acc = [select id from Account where name =:name LIMIT 1];
//Return a page in Visualforce format
return new PageReference(ACCOUNT_VISUALFORCE_PAGE + acc.id);
}
//If the URL isn’t in the form of a contact or
//account page, continue with the request
return null;
}
global List<PageReference> generateUrlFor(List<PageReference>
mySalesforceUrls){
//A list of pages to return after all the links
//have been evaluated
List<PageReference> myFriendlyUrls = new List<PageReference>();
//a list of all the ids in the urls
List<id> accIds = new List<id>();
// loop through all the urls once, finding all the valid ids
for(PageReference mySalesforceUrl : mySalesforceUrls){
//Get the URL of the page
String url = mySalesforceUrl.getUrl();
//If this looks like an account page, transform it
if(url.startsWith(ACCOUNT_VISUALFORCE_PAGE)){
//Extract the ID from the query parameter
//and store in a list
//for querying later in bulk.
String id= url.substring(ACCOUNT_VISUALFORCE_PAGE.length(),
url.length());
accIds.add(id);
}
}
// Get all the account names in bulk
List <account> accounts = [select name from Account where id in :accIds];
// make the new urls
Integer counter = 0;
// it is important to go through all the urls again, so that the order
// of the urls in the list is maintained.
for(PageReference mySalesforceUrl : mySalesforceUrls) {
//Get the URL of the page
String url = mySalesforceUrl.getUrl();
if(url.startsWith(ACCOUNT_VISUALFORCE_PAGE)){
myFriendlyUrls.add(new PageReference(ACCOUNT_PAGE + accounts.get(counter).name));
counter++;
} else {
//If this doesn’t start like an account page,
//don’t do any transformations
myFriendlyUrls.add(mySalesforceUrl);
}
}
//Return the full list of pages
return myFriendlyUrls;
}
}
[/php]
この例だと、例えば
http://www.example.com/mycontact/Ryan Guest
というURLでアクセスすると、もともとは
http://www.example.com/account?id=001D0000InCsg
というURLであるページを表示させるようなことが可能になります。
この要領で、自分の自由にリライト設定を記述することができます。スラッシュをたくさんつけたりチルダやドットを付けたりもたぶん可能です。
2.Sitesにリライトクラスを設定する
開発したAPEXクラスをSitesに設定します。
[設定]→[開発]→[サイト]→サイトの編集
から、URL書き換えクラスというところに設定します。