この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

Force.com サイトの URL の書き換え

サイトは、サイト訪問者にわかりやすい URL とリンクを表示する組み込みロジックを備えています。アドレスバーに入力したり、ブックマークから起動したり、または外部 Web サイトからリンクする URL 要求を再記述するルールを作成します。サイトページ内のリンクの URL を再記述するルールも作成できます。URL を再記述すると、URL がわかりやすくなるだけでなく、ユーザが直感的に理解できるようになるため、検索エンジンによるサイトページのインデックス作成がさらに容易になります。

たとえば、自分のブログサイトを持っているとします。URL を書き換えない場合、ブログのエントリの URL は次のようになります。http://myblog.force.com/posts?id=003D000000Q0PcN

URL を書き換えると、ユーザはレコード ID ではなく日付やタイトルでブログの投稿にアクセスできます。大晦日の投稿の URL は次のようになります。http://myblog.force.com/posts/2009/12/31/auld-lang-syne

また、サイトページ内に表示されるリンクの URL を書き換えることもできます。大晦日の投稿にバレンタインデーの投稿へのリンクが含まれる場合、リンク URL は次のように表示されます。http://myblog.force.com/posts/2010/02/14/last-minute-roses

サイトの URL を書き換えるには、元の URL をわかりやすい URL に対応付ける Apex クラスを作成して、Apex クラスをサイトに追加します。

Site.UrlRewriter インターフェイスのメソッドについての詳細は、UrlRewriter インターフェース」を参照してください。

Apex クラスの作成

作成する Apex クラスでは、Force.com 提供のインターフェース Site.UrlRewriter を実装する必要があります。通常、次の形式を使用する必要があります。
1global class yourClass implements Site.UrlRewriter {
2    global PageReference mapRequestUrl(PageReference
3            yourFriendlyUrl)
4    global PageReference[] generateUrlFor(PageReference[]
5            yourSalesforceUrls);
6}
Apex クラスを作成するときは、次の制限と推奨事項に留意してください。
クラスおよびメソッドはグローバルである必要がある
Apex クラスおよびメソッドはすべて global である必要があります。
クラスに両方のメソッドを実装する必要がある
Apex クラスには mapRequestUrl メソッドおよび generateUrlFor メソッドの両方を実装する必要があります。いずれのメソッドも使用しない場合は、そのメソッドが null を返すようにします。
Visualforce サイトページでのみ機能する書き換え
受信 URL 要求は、サイトに関連付けられている Visualforce ページのみに対応付けできます。標準ページ、画像、その他のエンティティに対応付けることはできません。
サイトページのリンクの URL を書き換えるには、$Page マージ変数を含む !URLFOR 関数を使用します。たとえば、次のコードでは、myPage という名前の Visualforce ページにリンクします。
1<apex:outputLink value="{!URLFOR($Page.myPage)}"></apex:outputLink>

forceSSL=”true を使用する Visualforce <apex:form> 要素は、urlRewriter によって影響されません。

メモ

Visualforce 開発者ガイドの付録「関数」を参照してください。
符号化された URL
Site.urlRewriter インターフェースを使用して取得する URL は符号化されています。符号化されていない URL の値にアクセスする必要がある場合は、EncodingUtil クラスurlDecode メソッドを使用します。
文字の制限
わかりやすい URL は、Salesforce の URL とは異なる必要があります。3 文字のエンティティのプレフィックスまたは 15 文字または 18 文字の ID を含む URL は書き換えられません。
書き換えられた後の URL ではピリオドは使用できません。
文字列の制限
書き換えられた後の URL パスの一部として、次の予約文字列を使用することはできません。
  • apexcomponent
  • apexpages
  • ex
  • faces
  • flash
  • flex
  • google
  • home
  • ideas
  • images
  • img
  • javascript
  • js
  • lumen
  • m
  • resource
  • search
  • secur
  • services
  • servlet
  • setup
  • sfc
  • sfdc_ns
  • site
  • style
  • vote
  • widg
相対パスのみ
PageReference.getUrl() メソッドでは、ホスト名またはサイトのプレフィックス (ある場合) の直後に指定する URL の一部のみが返されます。たとえば、URL が http://mycompany.force.com/sales/MyPage?id=12345 であり、「sales」がサイトのプレフィックスである場合、/MyPage?id=12345 のみが返されます。
ドメインとサイトのプレフィックスは書き換えできません。
一意のパスのみ
サイトのプレフィックスと同じ名前を持つディレクトリには、URL を対応付けできません。たとえば、サイト URL が http://acme.force.com/help で、サイトプレフィックスが「help」である場合、help/page への URL をポイントすることはできません。結果として、返されるパスは http://acme.force.com/help/page ではなく、http://acme.force.com/help/help/page になります。
一括クエリ
ページ作成でのパフォーマンスを向上させるには、generateUrlFor メソッドでタスクを一度に 1 つずつではなく、一括で実行します。
項目の一意性の適用
URL を書き換えるために選択した項目が一意であることを確認します。クエリに SOQL の一意の項目またはインデックス付き項目を使用すると、パフォーマンスが向上する可能性があります。
また、Site.lookupIdByFieldValue メソッドを使用して、一意の項目名と値でレコードを検索できます。このメソッドでは、指定の項目に一意の ID または外部 ID が含まれていることを確認します。含まれていない場合は、エラーを返します。
次はその一例です。ここで、mynamespace は名前空間、Blog はカスタムオブジェクト名、title はカスタム項目名、myBlog は検索対象の値です。
1Site.lookupIdByFieldValue(Schema.sObjectType.
2        mynamespace__Blog__c.fields.title__c,'myBlog');

サイトへの URL 書き換えの追加

URL を書き換える Apex クラスを作成したら、次のステップに従ってそのクラスをサイトに追加します。
  1. [設定] で、[開発] | [サイト] をクリックします。
  2. [新規] をクリックします。既存のサイトを変更する場合は [編集] をクリックします。
  3. [サイトの編集] ページで、[URL 書き換えクラス] の [Apex クラス] を選択します。
  4. [保存] をクリックします。

サイトで URL の書き換えが有効になっている場合、すべての PageReferences はこの URL 書き換えクラスを通過して渡されます。

メモ

コード例

この例では、mycontact と myaccount という 2 つの Visualforce ページで構成される単純なサイトが存在します。このサンプルを試してみる前に、両方のページで「参照」権限が有効になっていることを確認します。各ページでそのオブジェクト種別の標準コントローラが使用されます。取引先責任者ページには親取引先ページへのリンクと取引先責任者の詳細が含まれます。

書き換えを実装する前は、「書き換え前のサイト URL」に示されるように、アドレスバーとリンク URL はレコード ID (ランダムな 15 桁の文字列) を表示しました。書き換えを有効にした後は、「書き換え後のサイト URL」に示されるように、アドレスバーとリンクがわかりやすく書き換えられた URL を表示します。

これらのページの URL の書き換えに使用する Apex クラスについては、詳しい説明と共にURL を書き換える Apex クラスの例に示しています。

サイトページの例

このセクションでは、この例で使用する取引先ページおよび取引先責任者ページの Visualforce を示します。

取引先ページは取引先の標準コントローラを使用する、標準的な詳細ページです。このページは myaccount という名前になります。
1<apex:page standardController="Account">
2    <apex:detail relatedList="false"/>
3</apex:page>
取引先責任者ページで取引先責任者の標準コントローラを使用し、2 つの部分で構成されます。最初の部分は URLFOR 関数と $Page マージ変数を使用して親取引先にリンクし、後の部分は単純に取引先の詳細を示します。Visualforce ページでは URLFOR 以外に書き換えロジックを備えていません。このページは mycontact という名前になります。
1<apex:page standardController="contact">
2    <apex:pageBlock title="Parent Account">
3        <apex:outputLink value="{!URLFOR($Page.mycontact,null, 
4                [id=contact.account.id])}">{!contact.account.name}
5                </apex:outputLink>
6    </apex:pageBlock>
7    <apex:detail relatedList="false"/>
8</apex:page>

URL を書き換える Apex クラスの例

サイトの URL 書き換え機能として使用される Apex クラスは、mapRequestUrl メソッドを使用して、受信 URL 要求を適切な Salesforce レコードに対応付けます。さらに、generateUrlFor メソッドを使用して、取引先ページへのリンクの URL をわかりやすい形式に書き換えます。
1swfobject.registerObject("clippy.codeblock-5", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17global with sharing class myRewriter implements Site.UrlRewriter {
18
19    //Variables to represent the user-friendly URLs for
20    //account and contact pages
21    String ACCOUNT_PAGE = '/myaccount/';
22    String CONTACT_PAGE = '/mycontact/';
23    //Variables to represent my custom Visualforce pages
24    //that display account and contact information
25    String ACCOUNT_VISUALFORCE_PAGE = '/myaccount?id=';
26    String CONTACT_VISUALFORCE_PAGE = '/mycontact?id=';
27
28    global PageReference mapRequestUrl(PageReference
29            myFriendlyUrl){
30        String url = myFriendlyUrl.getUrl();
31
32        if(url.startsWith(CONTACT_PAGE)){
33            //Extract the name of the contact from the URL
34            //For example: /mycontact/Ryan returns Ryan
35            String name = url.substring(CONTACT_PAGE.length(),
36                    url.length());
37
38            //Select the ID of the contact that matches
39            //the name from the URL
40            Contact con = [SELECT Id FROM Contact WHERE Name =:
41                    name LIMIT 1];
42
43            //Construct a new page reference in the form
44            //of my Visualforce page
45            return new PageReference(CONTACT_VISUALFORCE_PAGE + con.id);
46        }
47        if(url.startsWith(ACCOUNT_PAGE)){
48            //Extract the name of the account
49            String name = url.substring(ACCOUNT_PAGE.length(),
50                    url.length());
51
52            //Query for the ID of an account with this name
53            Account acc = [SELECT Id FROM Account WHERE Name =:name LIMIT 1];
54
55           //Return a page in Visualforce format
56            return new PageReference(ACCOUNT_VISUALFORCE_PAGE + acc.id);
57        }
58        //If the URL isn't in the form of a contact or
59        //account page, continue with the request
60        return null;
61    }
62    global List<PageReference> generateUrlFor(List<PageReference> 
63            mySalesforceUrls){
64        //A list of pages to return after all the links 
65        //have been evaluated
66        List<PageReference> myFriendlyUrls = new List<PageReference>();
67        
68        //a list of all the ids in the urls
69        List<id> accIds = new List<id>();
70        
71        // loop through all the urls once, finding all the valid ids
72        for(PageReference mySalesforceUrl : mySalesforceUrls){
73        //Get the URL of the page
74        String url = mySalesforceUrl.getUrl();
75 
76            //If this looks like an account page, transform it
77            if(url.startsWith(ACCOUNT_VISUALFORCE_PAGE)){
78                //Extract the ID from the query parameter
79                //and store in a list
80                //for querying later in bulk.
81                        String id= url.substring(ACCOUNT_VISUALFORCE_PAGE.length(),
82                        url.length());
83                        accIds.add(id);
84            }
85        }
86
87    // Get all the account names in bulk
88    List <account> accounts = [SELECT Name FROM Account WHERE Id IN :accIds];
89
90    // make the new urls
91    Integer counter = 0;
92
93    // it is important to go through all the urls again, so that the order
94    // of the urls in the list is maintained. 
95    for(PageReference mySalesforceUrl : mySalesforceUrls) {
96
97       //Get the URL of the page
98       String url = mySalesforceUrl.getUrl();
99
100       if(url.startsWith(ACCOUNT_VISUALFORCE_PAGE)){
101         myFriendlyUrls.add(new PageReference(ACCOUNT_PAGE + accounts.get(counter).name));
102         counter++;
103       } else {
104         //If this doesn't start like an account page,
105         //don't do any transformations
106         myFriendlyUrls.add(mySalesforceUrl);
107       }
108    }
109   
110    //Return the full list of pages
111    return myFriendlyUrls;
112  }
113
114}

書き換え前と書き換え後

ここでは、元のサイト URL を書き換える Apex クラスを実装した結果の表示例を示します。最初の図では ID ベースの URL、2 番目の図ではわかりやすい URL が表示されています。
書き換え前のサイト URL 前のサイト URL
図中の番号を付した要素の内容は、次のとおりです。
  1. 取引先責任者ページの書き換え前の元の URL
  2. 取引先責任者ページから親取引先ページへのリンク
  3. 取引先ページへのリンクの書き換え前の元の URL (ブラウザのス���ータスバーに表示される)
書き換え後のサイト URL 後のサイト URL
図中の番号を付した要素の内容は、次のとおりです。
  1. 取引先責任者ページの書き換えられた URL
  2. 取引先責任者ページから親取引先ページへのリンク
  3. 取引先ページへのリンクの書き換え後の URL (ブラウザのステータスバーに表示される)