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

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


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クラスを書く必要があります。これが無いとこの仕組みは使えません。めんどいですががんばりましょう。
例えば、こんな感じのクラスを書きます。

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;
  }

}

この例だと、例えば
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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です