[salesforce]Force.com SitesでユーザフレンドリーなURLの設定

By |12月 14, 2010|Force.comでWeb制作, |


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書き換えクラスというところに設定します。
ws000319

参考:Site.UrlRewriter Interface