Salesforce Pages Developers Guide

User Manual: Pdf

Open the PDF directly: View PDF PDF.
Page Count: 1

DownloadSalesforce Pages Developers Guide
Open PDF In BrowserView PDF
Version 29.0: Winter ’14

Visualforce 開発者ガイド

最終更新日: 2013/10/16
©

Copyright 2000–2013 salesforce.com, inc. All rights reserved. Salesforce.com およびその他の名称や商標は、salesforce.com, inc. の
登録商標です。本ドキュメントに記載されたその他の商標は、各社に所有権があります。

目次

目次
第 1 章: Visualforce の導入...................................................................................................................1
Visualforce とは?......................................................................................................................................................................2
Visualforce ページとは?...............................................................................................................................................2
Visualforce マークアップ.................................................................................................................................3
Visualforce コントローラ.................................................................................................................................3
Visualforce ページを使用できる場所.........................................................................................................................4
Visualforce をサポートするエディション.............................................................................................................................4
Visualforce の開発に必要な権限............................................................................................................................................4
Visualforce のアーキテクチャ設計........................................................................................................................................5
Visualforce の利点....................................................................................................................................................................6
Visualforce を使用する必要がある状況は?...........................................................................................................................7
Visualforce ページと Sコントロールの比較.........................................................................................................................8
Visualforce のバージョン設定方法........................................................................................................................................9
バージョン 29.0 の Visualforce の新機能.............................................................................................................................10
ドキュメント表記規則.........................................................................................................................................................10

第 2 章: Visualforce 開発用ツール.......................................................................................................12
開発モードフッターの使用.................................................................................................................................................13
Visualforce エディタについて..............................................................................................................................................15

第 3 章: Visualforce のクイックスタート............................................................................................18
Visualforce の正常なコンパイル..........................................................................................................................................18
最初のページの作成.............................................................................................................................................................19
Visualforce による項目値の表示..........................................................................................................................................20
Visualforce コンポーネントライブラリの使用...................................................................................................................22
Visualforce ページによる既存のページの上書き...............................................................................................................24
標準オブジェクトリストページへのリダイレクト..........................................................................................................27
ページでの入力コンポーネントの使用..............................................................................................................................27
入力項目の表示ラベルの追加とカスタマイズ..................................................................................................................29
フォームの項目のタブ順序の設定......................................................................................................................................30
ページへの連動項目の追加.................................................................................................................................................32
Visualforce ダッシュボードコンポーネントの作成...........................................................................................................36
カスタムオブジェクトの関連リストの表示......................................................................................................................36
インライン編集の有効化.....................................................................................................................................................36
PDF としてのページの表示................................................................................................................................................39
ページでのデータのテーブルの作成..................................................................................................................................41
ページでのデータのテーブルの編集..................................................................................................................................42
ページでのクエリ文字列パラメータの使用......................................................................................................................43
クエリ文字列パラメータの取得..............................................................................................................................44

i

目次

リンクでのクエリ文字列パラメータの設定..........................................................................................................45
単一ページでのクエリ文字列パラメータの取得と設定......................................................................................46
ページでの Ajax の使用........................................................................................................................................................47
コマンドリンクとボタンによる部分ページ更新の実装......................................................................................47
非同期操作のための状況の提供..............................................................................................................................48
任意のコンポーネントでのイベントへの Ajax 動作の適用.................................................................................49

第 4 章: Visualforce ページの外観と HTML 出力のカスタマイズ......................................................51
Visualforce ページのスタイル設定......................................................................................................................................51
Salesforce スタイルの使用........................................................................................................................................51
カスタムスタイルの使用.........................................................................................................................................54
コンポーネントの DOM ID を使用したスタイルの定義....................................................................................55
HTML コメントと IE 条件付きコメント..........................................................................................................................56
Visualforce で追加または変更される HTML タグ............................................................................................................57
HTML5 文書型の整理の緩和..................................................................................................................................57
 および  タグの自動生成の手動による無効化................................................................................58
カスタム doctype の使用.......................................................................................................................................................59
カスタム ContentType の使用..............................................................................................................................................60
Visualforce コンポーネントのカスタム HTML 属性の設定............................................................................................61
HTML5 manifest 属性を使用したオフラインキャッシュ................................................................................................63

第 5 章: 標準コントローラ.................................................................................................................64
Visualforce ページへの標準コントローラの関連付け ......................................................................................................64
標準コントローラによるデータへのアクセス .................................................................................................................65
標準コントローラアクションの使用..................................................................................................................................65
入力規則と標準コントローラ.............................................................................................................................................67
標準コントローラを使用するページのスタイル設定......................................................................................................67
オブジェクトのアクセシビリティの確認..........................................................................................................................67

第 6 章: 標準リストコントローラ......................................................................................................69
Visualforce ページへの標準リストコントローラの関連付け...........................................................................................70
リストコントローラによるデータへのアクセス..............................................................................................................70
標準リストコントローラアクションの使用......................................................................................................................71
リストコントローラによるページネーション..................................................................................................................72
標準リストコントローラによるリストビューの使用......................................................................................................72
リストコントローラによるレコードの編集......................................................................................................................74

第 7 章: カスタムコントローラおよびコントローラ拡張...................................................................76
カスタムコントローラおよびコントローラ拡張とは?.....................................................................................................76
カスタムコントローラの作成.............................................................................................................................................77
コントローラ拡張の作成.....................................................................................................................................................79
カスタムリストコントローラの作成..................................................................................................................................80

ii

目次

コントローラメソッド.........................................................................................................................................................82
コントローラクラスのセキュリティ..................................................................................................................................85
大量のデータセットを使用した作業..................................................................................................................................85
ページ全体での参照のみモードの設定..................................................................................................................86
コントローラメソッドでの参照のみモードの設定..............................................................................................87
カスタムコントローラおよびコントローラ拡張の作成に関する考慮事項...................................................................87
Visualforce ページ内の実行順序..........................................................................................................................................88
Visualforce ページの get 要求の実行順序................................................................................................................89
Visualforce ページの postback 要求の実行順序.......................................................................................................91
Visualforce ページの実行順序の例...........................................................................................................................93
カスタムコントローラおよびコントローラ拡張のテスト............................................................................................100
入力規則とカスタムコントローラ....................................................................................................................................103
transient キーワードの使用................................................................................................................................................104

第 8 章: 高度な例..............................................................................................................................106
初めてのカスタムコントローラの作成............................................................................................................................106
カスタムコントローラクラスの作成....................................................................................................................106
getter メソッドの定義.............................................................................................................................................107
action メソッドの定義.............................................................................................................................................109
navigation メソッドの定義......................................................................................................................................111
ウィザードの作成...............................................................................................................................................................113
商談ウィザードコントローラ................................................................................................................................114
商談ウィザードのステップ 1.................................................................................................................................116
商談ウィザードのステップ 2.................................................................................................................................118
商談ウィザードのステップ 3.................................................................................................................................119
高度な Visualforce ダッシュボードコンポーネント........................................................................................................120
Visualforce と Google Chart の統合....................................................................................................................................121
カスタムリストコントローラによるレコードの一括更新............................................................................................125

第 9 章: Visualforce によるボタン、リンク、およびタブの上書き...................................................128
標準リストコントローラを使用したタブの上書き........................................................................................................129
Visualforce のカスタムボタンおよびリンクの定義.........................................................................................................130
標準リストコントローラを使用したカスタムリストボタンの追加............................................................................132
レコードタイプの表示.......................................................................................................................................................133

第 10 章: 静的リソースの使用..........................................................................................................135
静的リソースの作成...........................................................................................................................................................135
Visualforce マークアップでの静的リソースの参照.........................................................................................................136

第 11 章: カスタムコンポーネントの作成と使用.............................................................................138
カスタムコンポーネントとは?..........................................................................................................................................138
カスタムコンポーネントの定義.......................................................................................................................................139

iii

目次

カスタムコンポーネントのマークアップ........................................................................................................................140
Visualforce ページでのカスタムコンポーネントの使用.................................................................................................141
カスタムコンポーネントのバージョン設定の管理........................................................................................................141
カスタムコンポーネントの属性.......................................................................................................................................142
カスタムコンポーネントコントローラ............................................................................................................................143

第 12 章: 動的 Visualforce バインド..................................................................................................145
標準オブジェクトでの動的参照の使用............................................................................................................................146
カスタムオブジェクトおよびパッケージでの動的参照の使用....................................................................................154
Apex 対応付けとリストの参照..........................................................................................................................................162
項目セットの使用...............................................................................................................................................................159
グローバル変数への動的参照...........................................................................................................................................162
$Resource を使用した静的リソースへの動的参照..............................................................................................162
$Action を使用した action メソッドへの動的参照..............................................................................................164
$ObjectType を使用したスキーマ詳細への動的参照..........................................................................................166

第 13 章: 動的 Visualforce コンポーネント........................................................................................170
動的コンポーネントの制限...............................................................................................................................................171
動的コンポーネントの作成と表示....................................................................................................................................171
関連リストの使用例...........................................................................................................................................................174

第 14 章: Visualforce とメールの統合...............................................................................................180
Visualforce を使用したメールの送信.................................................................................................................................180
メッセージクラスを使用したカスタムコントローラの作成............................................................................180
メール添付ファイルの作成....................................................................................................................................182
Visualforce メールテンプレート........................................................................................................................................186
Visualforce メールテンプレートの作成.................................................................................................................186
Visualforce メールテンプレートでのカスタムスタイルシートの使用..............................................................189
ファイルの添付.......................................................................................................................................................191
Visualforce メールテンプレート内でのカスタムコントローラの使用..............................................................194

第 15 章: Visualforce Charting...........................................................................................................196
Visualforce Charting の制限および考慮事項.....................................................................................................................196
Visualforce Charting のしくみ.............................................................................................................................................197
単純なグラフ作成の例...........................................................................................................................................197
グラフデータの提供...............................................................................................................................................198
コントローラメソッドを使用したグラフデータの提供........................................................................199
JavaScript 関数を使用したグラフデータの提供.......................................................................................200
JavaScript 配列を使用したグラフデータの提供.......................................................................................201
グラフデータの形式....................................................................................................................................201
Visualforce Charting を使用した複雑なグラフの作成.....................................................................................................202
更新されたデータによるグラフの更新............................................................................................................................206

iv

目次

 を使用したグラフデータの更新........................................................................................206
JavaScript Remoting を使用したグラフデータの更新..........................................................................................208
グラフの外観の制御...........................................................................................................................................................212
グラフの色...............................................................................................................................................................213
グラフのレイアウトとアノテーション................................................................................................................214
棒グラフ...................................................................................................................................................................215
その他の線形系列グラフ.......................................................................................................................................216
円グラフ...................................................................................................................................................................219
ゲージグラフ...........................................................................................................................................................220
レーダーグラフ.......................................................................................................................................................220

第 16 章: Visualforce でのフローの表示............................................................................................222
Visualforce ページにフローを埋め込む.............................................................................................................................222
 を使用した高度な例................................................................................................................................224
フローの finishLocation 属性の設定..................................................................................................................................226
フローのユーザインターフェースのカスタマイズ........................................................................................................228

第 17 章: Visualforce でのテンプレートの使用.................................................................................230
 を使用したテンプレートの定義.......................................................................................................230
 を使用する既存ページの参照...................................................................................................................233

第 18 章: モバイルデバイスの開発...................................................................................................236
Salesforce Classic とは?........................................................................................................................................................236
Salesforce Classic および Visualforce Mobile を実行できるデバイス..................................................................236
モバイルアプリケーションの機能と制限事項....................................................................................................237
Visualforce Mobile を使用する必要がある状況....................................................................................................238
iPhone および BlackBerry 用のページの開発...................................................................................................................239
iPhone の考慮事項...................................................................................................................................................241
BlackBerry の考慮事項.............................................................................................................................................243
クロスプラットフォームの互換性のあるページの開発....................................................................................244
JavaScript ライブラリの使用..................................................................................................................................247
Visualforce ページのモバイル化........................................................................................................................................249
モバイル準備完了の Visualforce タブの作成........................................................................................................249
モバイル設定への Visualforce タブの追加............................................................................................................250
モバイル設定を作成する............................................................................................................................250
データセットを定義する............................................................................................................................251
モバイルオブジェクトプロパティを編集する........................................................................................252
モバイルタブをカスタマイズする............................................................................................................252
Visualforce Mobile ページのテスト........................................................................................................................253
例: iPhone 用の対応付けアプリケーションの作成.........................................................................................................254
カスタムコントローラの作成................................................................................................................................255
対応付けおよびリストビューの作成....................................................................................................................256
v

目次

詳細ページの作成...................................................................................................................................................259

第 19 章: Force.com AppExchange アプリケーションへの Visualforce の追加...................................261
Visualforce ページとコンポーネントのパッケージバージョン設定の管理..................................................................262

第 20 章: Visualforce ページでの JavaScript の使用...........................................................................264
JavaScript を使用したコンポーネントの参照...................................................................................................................264
Visualforce での JavaScript ライブラリの使用...................................................................................................................265
Apex コントローラの JavaScript Remoting........................................................................................................................267
JavaScript Remoting の例.....................................................................................................................................................274

第 21 章: ベストプラクティス..........................................................................................................276
Visualforce のパフォーマンス向上のためのベストプラクティス.................................................................................276
コンポーネント ID へのアクセスのベストプラクティス.............................................................................................278
静的リソースのベストプラクティス................................................................................................................................281
コントローラおよびコントローラ拡張のためのベストプラクティス........................................................................281
コンポーネント facet の使用のためのベストプラクティス...........................................................................................282
ページブロックコンポーネントのベストプラクティス................................................................................................284
PDF を表示するためのベストプラクティス...................................................................................................................285
 のベストプラクティス.............................................................................................................................287

第 22 章: 標準のコンポーネントの参照............................................................................................288
analytics:reportChart ............................................................................................................................................................288
apex:actionFunction .............................................................................................................................................................290
apex:actionPoller ..................................................................................................................................................................292
apex:actionRegion ................................................................................................................................................................294
apex:actionStatus ..................................................................................................................................................................295
apex:actionSupport ...............................................................................................................................................................298
apex:areaSeries ......................................................................................................................................................................300
apex:attribute ........................................................................................................................................................................302
apex:axis ................................................................................................................................................................................304
apex:barSeries........................................................................................................................................................................306
apex:canvasApp ....................................................................................................................................................................309
apex:chart..............................................................................................................................................................................312
apex:chartLabel......................................................................................................................................................................315
apex:chartTips ......................................................................................................................................................................316
apex:column ..........................................................................................................................................................................317
apex:commandButton............................................................................................................................................................323
apex:commandLink...............................................................................................................................................................326
apex:component.....................................................................................................................................................................330
apex:componentBody ...........................................................................................................................................................333
apex:composition ..................................................................................................................................................................335
apex:dataList..........................................................................................................................................................................336
apex:dataTable ......................................................................................................................................................................338
vi

目次

apex:define ............................................................................................................................................................................345
apex:detail .............................................................................................................................................................................346
apex:dynamicComponent .....................................................................................................................................................348
apex:emailPublisher ..............................................................................................................................................................349
apex:enhancedList ................................................................................................................................................................351
apex:facet...............................................................................................................................................................................353
apex:flash ..............................................................................................................................................................................354
apex:form ..............................................................................................................................................................................355
apex:gaugeSeries ...................................................................................................................................................................359
apex:iframe ...........................................................................................................................................................................361
apex:image ............................................................................................................................................................................362
apex:include ..........................................................................................................................................................................364
apex:includeScript .................................................................................................................................................................365
apex:inlineEditSupport .........................................................................................................................................................366
apex:input .............................................................................................................................................................................368
apex:inputCheckbox .............................................................................................................................................................371
apex:inputField......................................................................................................................................................................375
apex:inputFile .......................................................................................................................................................................379
apex:inputHidden .................................................................................................................................................................382
apex:inputSecret ...................................................................................................................................................................383
apex:inputText ......................................................................................................................................................................386
apex:inputTextarea ...............................................................................................................................................................389
apex:insert .............................................................................................................................................................................393
apex:legend ...........................................................................................................................................................................394
apex:lineSeries ......................................................................................................................................................................395
apex:listViews .......................................................................................................................................................................397
apex:logCallPublisher ...........................................................................................................................................................398
apex:message .........................................................................................................................................................................400
apex:messages .......................................................................................................................................................................401
apex:milestoneTracker ..........................................................................................................................................................403
apex:outputField ...................................................................................................................................................................404
apex:outputLabel ..................................................................................................................................................................405
apex:outputLink ...................................................................................................................................................................408
apex:outputPanel ..................................................................................................................................................................411
apex:outputText ....................................................................................................................................................................413
apex:page...............................................................................................................................................................................416
apex:pageBlock .....................................................................................................................................................................422
apex:pageBlockButtons .........................................................................................................................................................425
apex:pageBlockSection .........................................................................................................................................................428
apex:pageBlockSectionItem ..................................................................................................................................................431
apex:pageBlockTable ............................................................................................................................................................434
apex:pageMessage .................................................................................................................................................................440
apex:pageMessages ...............................................................................................................................................................441
apex:panelBar .......................................................................................................................................................................442

vii

目次

apex:panelBarItem ................................................................................................................................................................444
apex:panelGrid .....................................................................................................................................................................447
apex:panelGroup ..................................................................................................................................................................451
apex:param ............................................................................................................................................................................452
apex:pieSeries .......................................................................................................................................................................453
apex:radarSeries ....................................................................................................................................................................455
apex:relatedList ....................................................................................................................................................................457
apex:repeat ............................................................................................................................................................................459
apex:scatterSeries ..................................................................................................................................................................461
apex:scontrol .........................................................................................................................................................................463
apex:sectionHeader ...............................................................................................................................................................464
apex:selectCheckboxes ..........................................................................................................................................................465
apex:selectList .......................................................................................................................................................................470
apex:selectOption .................................................................................................................................................................474
apex:selectOptions ................................................................................................................................................................477
apex:selectRadio ...................................................................................................................................................................478
apex:stylesheet ......................................................................................................................................................................482
apex:tab .................................................................................................................................................................................483
apex:tabPanel ........................................................................................................................................................................486
apex:toolbar ..........................................................................................................................................................................490
apex:toolbarGroup ................................................................................................................................................................494
apex:variable .........................................................................................................................................................................496
apex:vote ...............................................................................................................................................................................497
chatter:feed ...........................................................................................................................................................................497
chatter:feedWithFollowers ...................................................................................................................................................498
chatter:follow ........................................................................................................................................................................499
chatter:followers ...................................................................................................................................................................500
chatter:newsfeed ...................................................................................................................................................................500
chatter:userPhotoUpload ......................................................................................................................................................501
chatteranswers:aboutme ........................................................................................................................................................501
chatteranswers:allfeeds ..........................................................................................................................................................502
chatteranswers:changepassword ............................................................................................................................................503
chatteranswers:datacategoryfilter ..........................................................................................................................................503
chatteranswers:feedfilter .......................................................................................................................................................504
chatteranswers:feeds .............................................................................................................................................................505
chatteranswers:forgotpassword .............................................................................................................................................505
chatteranswers:forgotpasswordconfirm .................................................................................................................................506
chatteranswers:guestsignin ....................................................................................................................................................506
chatteranswers:help ...............................................................................................................................................................507
chatteranswers:login .............................................................................................................................................................507
chatteranswers:registration ...................................................................................................................................................508
chatteranswers:searchask ......................................................................................................................................................509
chatteranswers:singleitemfeed ..............................................................................................................................................509
flow:interview .......................................................................................................................................................................510

viii

目次

ideas:detailOutputLink .........................................................................................................................................................511
ideas:listOutputLink .............................................................................................................................................................512
ideas:profileListOutputLink .................................................................................................................................................514
knowledge:articleCaseToolbar ..............................................................................................................................................516
knowledge:articleList ............................................................................................................................................................516
knowledge:articleRendererToolbar .......................................................................................................................................518
knowledge:articleTypeList ...................................................................................................................................................518
knowledge:categoryList ........................................................................................................................................................519
liveAgent:clientChat..............................................................................................................................................................520
liveAgent:clientChatAlertMessage .......................................................................................................................................520
liveAgent:clientChatEndButton............................................................................................................................................521
liveAgent:clientChatInput.....................................................................................................................................................522
liveAgent:clientChatLog.......................................................................................................................................................522
liveAgent:clientChatMessages...............................................................................................................................................523
liveAgent:clientChatQueuePosition......................................................................................................................................524
liveAgent:clientChatSaveButton...........................................................................................................................................524
liveAgent:clientChatSendButton..........................................................................................................................................525
liveAgent:clientChatStatusMessage .....................................................................................................................................525
messaging:attachment ..........................................................................................................................................................526
messaging:emailHeader ........................................................................................................................................................527
messaging:emailTemplate ....................................................................................................................................................528
messaging:htmlEmailBody ...................................................................................................................................................530
messaging:plainTextEmailBody ...........................................................................................................................................531
site:googleAnalyticsTracking ................................................................................................................................................532
site:previewAsAdmin ...........................................................................................................................................................533
social:profileViewer...............................................................................................................................................................534
support:caseArticles ..............................................................................................................................................................535
support:caseFeed ..................................................................................................................................................................537
support:clickToDial ..............................................................................................................................................................538
support:portalPublisher ........................................................................................................................................................539
topics:widget .........................................................................................................................................................................540

付録.................................................................................................................................................541
付録 A: グローバル変数、関数、および式の演算子...............................................................541
グローバル変数.......................................................................................................................................................541
$Action..........................................................................................................................................................543
$Api...............................................................................................................................................................551
$Component..................................................................................................................................................551
$ComponentLabel.........................................................................................................................................552
$CurrentPage.................................................................................................................................................552
$Label............................................................................................................................................................553
$Label.Site.....................................................................................................................................................553
$ObjectType..................................................................................................................................................555
$Organization................................................................................................................................................561
ix

目次

$Page.............................................................................................................................................................561
$Profile..........................................................................................................................................................562
$Resource.......................................................................................................................................................562
$SControl......................................................................................................................................................563
$Setup............................................................................................................................................................563
$Site...............................................................................................................................................................564
$System.OriginDateTime.............................................................................................................................565
$User..............................................................................................................................................................566
$User.UITheme および $User.UIThemeDisplayed.....................................................................................566
$UserRole......................................................................................................................................................567
関数...........................................................................................................................................................................567
式の演算子...............................................................................................................................................................579

付録 B: Apex および Visualforce 開発のセキュリティのヒント...............................................582
クロスサイトスクリプト (XSS).............................................................................................................................582
Visualforce ページのエスケープされない出力と式.............................................................................................584
クロスサイトリクエストフォージェリ (CSRF)..................................................................................................586
SOQL インジェクション.......................................................................................................................................587
データアクセスコントロール................................................................................................................................588

付録 C: Visualforce コントローラで使用する Apex クラス......................................................590
ApexPages クラス.....................................................................................................................................................591
ApexPages インスタンスメソッド.............................................................................................................591
Action クラス...........................................................................................................................................................593
Action インスタンスメソッド....................................................................................................................594
Cookie クラス..........................................................................................................................................................595
Cookie インスタンスメソッド...................................................................................................................597
IdeaStandardController クラス................................................................................................................................599
IdeaStandardController インスタンスメソッド.........................................................................................600
IdeaStandardSetController クラス...........................................................................................................................601
IdeaStandardSetController インスタンスメソッド....................................................................................603
KnowledgeArticleVersionStandardController クラス..............................................................................................604
KnowledgeArticleVersionStandardController インスタンスメソッド.......................................................606
Message クラス........................................................................................................................................................607
Message インスタンスメソッド.................................................................................................................608
PageReference クラス...............................................................................................................................................610
PageReference インスタンスメソッド.......................................................................................................613
SelectOption クラス.................................................................................................................................................619
SelectOption インスタンスメソッド..........................................................................................................620
StandardController クラス.......................................................................................................................................623
StandardController インスタンスメソッド................................................................................................624
StandardSetController クラス..................................................................................................................................629

x

StandardSetController

第1章
Visualforce の導入
過去数年にわたり、salesforce.com はオンデマンドアプリケーションを作成するための包括的なプラットフォーム
を作成してきました。他の高度なアプリケーション開発プラットフォームと同様に、Force.com プラットフォー
ムでは次の事項を定義するための別個のツールを提供します。
•

データの構造 (データモデル)

•

データの操作方法の詳細を設定するルール (ビジネスロジック)

•

データの表示方法を指定するレイアウト (ユーザインターフェース)
メモ: データモデル、ビジネスロジックまたはユーザインターフェースに影響するかどうかに基づいたア
プリケーション開発ツールの分割は、Model-View-Controller (MVC) (Model はデータモデル、View はユー
ザインターフェース、および Controller はビジネスロジックを表す) アプリケーション開発パターンとし
ても知られています。

アプリケーション用のデータモデルおよびビジネスロジックを作成するこのツールは、Force.com プラットフォー
ムサーバでネイティブに実行される強力なソリューションです。ユーザインターフェースを定義する既存のツー
ルには次のような特定の制限がありました。
•

ページレイアウト。アプリケーション開発者がレコード詳細ページで項目、ボタンおよび関連リストを編成
できるポイント & クリックツールです。情報セットの表示方法については柔軟に対応できない場合がありま
す。項目は必ず関連リストの上に表示する必要があります。ボタンは必ず項目の上に表示する必要がありま
す。Sコントロールとカスタムリンクは特定の領域内にのみ配置できます。

•

Sコントロール。アプリケーション開発者が詳細ページまたはカスタムタブにカスタム HTML を表示できる
ツール。次の点を除いて、ページレイアウト以上の柔軟性を提供します。
◊ ブラウザ内から実行する。そのため、一度に多数のレコードの値を表示または更新する場合はパフォーマ
ンスが低下します。
◊ カスタムユーザインターフェース要素に標準の Salesforce ページと同じデザインを提供する簡単な方法が
備わっていない。
◊ 開発者は項目の一意性およびメタデータのその他の連動関係を自分で適用する必要がある。
重要: Sコントロールは、Visualforce ページに置き換えられました。組織で以前に Sコントロールを使
用していない場合、Sコントロールは作成できません。既存の Sコントロールに影響はありません。今
後も編集できます。

1

Visualforce の導入

Visualforce とは?

これらの理由から、salesforce.com は、Force.com プラットフォームに高度なカスタムユーザインターフェースを
作成するための次世代のソリューションである Visualforce を導入しました。

関連リンク
Visualforce のアーキテクチャ設計
Visualforce の利点
Visualforce をサポートするエディション
Visualforce ページと Sコントロールの比較
Visualforce とは?

バージョン 29.0 の Visualforce の新機能

Visualforce とは?
Visualforce は、Force.com プラットフォームでネイティブにホストできる高度なカスタムユーザインターフェース
を、開発者が作成できるようにするフレームワークです。Visualforce フレームワークには、HTML に似たタグ
ベースのマークアップ言語が含まれています。
Visualforce マークアップ言語では、各 Visualforce タグが、ページのセクション、関連リスト、または項目など、
大まかなユーザインターフェースコンポーネントまたはきめの細かいユーザインターフェースコンポーネントに
対応しています。Visualforce コンポーネントの動作は、標準の Salesforce ページと同じロジックを使用して制御す
ることも、開発者が独自のロジックを Apex で記述されたコントローラクラスと関連付けることもできます。

図 1 : Visualforce コンポーネントと、それに対応するタグのサンプル

関連リンク
カスタムコントローラの作成
コントローラ拡張の作成

Visualforce ページとは?
開発者は Visualforce を使用して Visualforce ページ定義を作成できます。ページ定義は次の 2 つの主要な要素で構
成されます。

2

Visualforce の導入

•

Visualforce マークアップ

•

Visualforce コントローラ

Visualforce マークアップ

Visualforce マークアップ
Visualforce マークアップは、Visualforce タグ、HTML、Javascript、または 1 つの  タグ内に埋め込ま
れているその他の Web 対応コードで構成されています。マークアップでは、ページに含める必要のあるユーザ
インターフェースコンポーネントとその表示方法を定義します。

Visualforce コントローラ
Visualforce コントローラは、関連付けられた Visualforce マークアップで指定されたコンポーネントをユーザが操
作 (ボタンやリンクのクリックなど) したときの動作を指定する命令のセットです。コントローラを使用すると、
ページに表示されるデータにアクセスでき、また、コンポーネントの動作を変更できます。
開発者は Force.com プラットフォームが提供する標準コントローラを使用するか、または Apex で記述されたク
ラスを含むカスタムコントローラロジックを追加できます。
•

標準コントローラは、標準の Salesforce ページで使用されているものと同じ機能およびロジックで構成されま
す。たとえば、標準取引先コントローラを使用する場合、Visualforce ページで [保存] ボタンをクリックした
場合、標準の取引先編集ページで [保存] をクリックした場合と同じ動作が行われます。
ページで標準コントローラを使用した場合に、ユーザにそのオブジェクトへのアクセス権がないと、ページ
には権限がないというエラーメッセージが表示されます。オブジェクトへのユーザのアクセシビリティを確
認し、コンポーネントを適切に表示することでこれを回避できます。

•

標準リストコントローラでは、一連のレコードを表示または操作できる Visualforce ページを作成できます。
レコードセットを使用する既存の Salesforce ページの例として、リストページ、関連リスト、一括アクション
ページなどがあります。

•

カスタムコントローラは Apex で記述されるクラスで、標準コントローラを使用せずにすべてのページのロ
ジックを実装します。カスタムコントローラを使用する場合、新しいナビゲーション要素または動作を定義
できますが、標準コントローラにすでに定義された機能も再実装する必要があります。
その他の Apex クラスと同様に、カスタムコントローラ全体はシステムモードで実行されます。このモードで
は現在のユーザのオブジェクトと項目レベルの権限は無視されます。カスタムコントローラ内で、ユーザプ
ロファイルを用いてアクセスするか否かを独自に決定することができます。

•

コントローラ拡張は、Apex で記述されるクラスで、標準コントローラまたはカスタムコントローラの動作を
追加するか、動作を上書きします。拡張を使用すれば、独自のカスタムロジックを追加する一方で、別のコ
ントローラの機能も使用できます。
標準コントローラはユーザモードで実行し、現在のユーザの権限、項目レベルのセキュリティ、共有ルール
が強制されるため、標準コントローラを拡張すると、ユーザ権限を重視する Visualforce ページを構築できま
す。拡張クラスはシステムモードで実行しますが、標準コントローラはユーザモードで実行します。カスタ
ムコントローラと同様、ユーザプロファイルを参照してプログラムでアクセスさせるか否かを指定できます。
メモ: カスタムコントローラとコントローラ拡張クラスはシステムモードで実行されるため、ユーザ権限
や項目レベルのセキュリティを無視しますが、クラス定義に with sharing キーワードを使用すること
によって、ユーザの組織の共有設定、ロール階層、および共有ルールを使用するかどうかを選択できま

3

Visualforce の導入

Visualforce ページを使用できる場所

す。詳細は、『Force.com Apex コード開発者ガイド』の「with sharing または without sharing キー
ワードの使用」を参照してください。

Visualforce ページを使用できる場所
開発者は Visualforce ページを使用して次のことを実行できます。
•

取引先の [新規] ボタンまたは取引先責任者の [保存] ボタンなどの、標準ボタンを上書きする

•

[取引先] タブホームページなどのタブ概要ページを上書きする

•

カスタムタブを定義する

•

詳細ページレイアウトにコンポーネントを埋め込む

•

ダッシュボードコンポーネントまたはカスタムヘルプページを作成する

•

Salesforce コンソールのサイドバー (カスタムコンソールコンポーネント) をカスタマイズ、拡張、統合する

Visualforce をサポートするエディション
Visualforce は、Contact Manager Edition、Group Edition、Professional Edition、Enterprise Edition、Unlimited Edition、
Performance Edition、および Developer Edition で使用できます。

Visualforce の開発に必要な権限
Visualforce の開発には、特定の活動に応じてさまざまな権限が必要です。
必要なユーザ権限
Visualforce 開発モードを有効化する

「アプリケーションのカスタマイズ」

Visualforce ページを作成、編集、削除する

「アプリケーションのカスタマイズ」

カスタム Visualforce コンポーネントを作成、編集する 「アプリケーションのカスタマイズ」
カスタム Visualforce コントローラまたは Apex を編集す 「Apex 開発」
る
Visualforce ページセキュリティを設定する

「ユーザの管理」
および
「アプリケーションのカスタマイズ」

Visualforce ページのバージョン設定を行う

「アプリケーションのカスタマイズ」

静的リソースを作成、編集、削除する

「アプリケーションのカスタマイズ」

Visualforce タブを作成する

「アプリケーションのカスタマイズ」

4

Visualforce の導入

Visualforce のアーキテクチャ設計

Visualforce のアーキテクチャ設計
次のアーキテクチャの図に示すように、すべての Visualforce ページ全体は、開発者がページを作成する場合もエ
ンドユーザがページを要求している場合も、両方とも Force.com プラットフォーム上で実行されます。

図 2 : Visualforce システムアーキテクチャ - 開発モード
開発者が Visualforce ページの記述を完了して、プラットフォームに保存すると、プラットフォームアプリケー
ションサーバは、そのマークアップを、Visualforce レンダラによって解釈可能な抽象的な命令セットにコンパイ
ルすることを試みます。コンパイルでエラーが生成されると、保存が中止され、開発者にエラーが返されます。
それ以外の場合は、命令がメタデータリポジトリに保存され、Visualforce レンダラに送信されます。レンダラは
その命令を HTML に変換し、開発者のビューを更新します。そのため、マークアップに変更が行われるたびに
開発者に即座にフィードバックが提供されます。
以下のアーキテクチャの図では、開発者ではないユーザが Visualforce ページを要求するときのプロセスフローを
示します。このページはすでに命令にコンパイル済みであるため、アプリケーションサーバはメタデータリポジ
トリからページを取得して、HTML に変換するためにそれを Visualforce レンダラに送信します。

5

Visualforce の導入

Visualforce の利点

図 3 : Visualforce システムアーキテクチャ - 標準ユーザモード
メモ: Visualforce ページは salesforce.com サーバではなく force.com サーバの 1 つで実行できます。

関連リンク
Visualforce とは?
Visualforce の利点
Visualforce ページと Sコントロールの比較

Visualforce の利点
Visualforce には、マークアップ言語として次のような利点があります。
ユーザフレンドリーな開発
開発者は結果ページを表示するウィンドウと同じウィンドウで Visualforce のマークアップを編集できます。
そのため、開発者はコードを保存するだけで編集結果を直ちに確認できます。Visualforce エディタペインに
は、オートコンプリートと構文の強調表示機能もあります。
また、Visualforce では、開発者が即座にサポートコンポーネントを作成できる「クイック修正」もサポート
しています。たとえば、開発者は Salesforce にログインして、URL に新しいページの名前を入力するだけ
で、新しい Visualforce ページを定義できます。wiki とほぼ同様に、ページがまだ存在していない場合は、プ
ラットフォームによって自動的に作成されます。
他の Web ベースのユーザインターフェース技術との統合
Visualforce マークアップは最終的に HTML で表示されるため、設計者は Visualforce タグと、標準 HTML、
JavaScript、Flash、またはプラットフォーム上の HTML ページ内で実行できるその他の任意のコード (Force.com
プラットフォームの差し込み項目および式など) を併用できます。

6

Visualforce の導入

Visualforce を使用する必要がある状況は?

Model-View-Controller (MVC) スタイルの開発
Visualforce は、アプリケーションのビュー (Visualforce マークアップで定義されるユーザインターフェース)
と、アプリケーションの仕組みを特定するコントローラ (Apex で記述された Visualforce コントローラで定義
されるビジネスロジック) の間を明確に分けることで、Model-View-Controller (MVC) 開発パターンに準拠し
ています。このアーキテクチャでは、設計者および開発者は、新規アプリケーションの作成で行う作業を
簡単に分割できます。設計者はユーザインターフェースのデザインに集中し、開発者はアプリケーション
を機能させるビジネスロジックに取り組むことができます。
簡潔な構文
Visualforce ページは、約 90% 少ない行数のコードで、Sコントロールと同じ機能を実装できます。
データ主導のデフォルト
Visualforce コンポーネントは、プラットフォームによってインテリジェントに表示されます。たとえば、
ページ設計者は、さまざまな種別の編集可能な項目 (メールアドレス、カレンダーの日付など) に対して異
なるコンポーネントタグを使用する必要はありません。すべての項目に汎用の  タグを
使用できます。Visualforce レンダラは各項目の適切な編集インターフェースを表示します。
ホストされているプラットフォーム
Visualforce ページは、Force.com プラットフォームによってその全体がコンパイルおよび表示されます。こ
れらのページは非常に緊密に統合されているため、表示または編集されるデータ量に関係なく、標準の
Salesforce ページと同じパフォーマンスを示します。
自動アップグレード可能
Visualforce ページは、Force.com プラットフォームの他の部分がアップグレードされた場合でも書き換える
必要はありません。ページはメタデータとして保存されているため、システムの残りの部分と共に自動的
にアップグレードされます。

Visualforce を使用する必要がある状況は?
Salesforce では、強力な CRM 機能を提供するアプリケーションが組み込まれています。また、Salesforce では組
織に応じて組み込みアプリケーションをカスタマイズする機能も用意されています。ただし、組織には、既存の
機能ではサポートされていない複雑なビジネスプロセスがあることがあります。Force.com プラットフォームに
は、このような場合に高度な管理者や開発者がカスタム機能を実装できるさまざまな方法が搭載されています。
そうした方法の中には、Visualforce、Apex、および SOAP API などがあります。

Visualforce
Visualforce では、タグベースのマークアップ言語を使用して、開発者はより効果的にアプリケーションを開発し
たり、Salesforce のユーザインターフェースをカスタマイズしたりできます。Visualforce を使用して、次のことが
できます。
•
•
•

ウィザードやその他のマルチステッププロセスの構築
アプリケーションを介した独自のカスタムフローコントロールの作成
最適かつ効果的なアプリケーションの相互作用を目的とした、ナビゲーションパターンやデータ固有ルール
の定義

7

Visualforce の導入

Visualforce ページと Sコントロールの比較

Apex
次のような場合に Apex を使用します。
•
•
•
•
•
•

Web サービスを作成する
メールサービスを作成する
複数のオブジェクトに複雑な検証を実行する
ワークフローでサポートされていない複雑なビジネスプロセスを作成する
カスタムトランザクションロジック (1 つのレコードやオブジェクトだけでなく、トランザクション全体で発
生するロジック) を作成する
レコードの保存などの別の操作にカスタムロジックを追加し、ユーザインターフェース、Visualforce ページ、
SOAP API のいずれでも、その操作が実行されるようにする

詳細は、『Force.com Apex コード開発者ガイド』を参照してください。

SOAP API
一度に 1 つのレコードタイプのみを処理し、トランザクション制御 (Savepoint の設定や変更のロールバックなど)
を必要としない複合アプリケーションに機能を追加する場合、標準の SOAP API コールを使用します。
詳細は、『SOAP API 開発者ガイド』を参照してください。

Visualforce ページと Sコントロールの比較
重要: Sコントロールは、Visualforce ページに置き換えられました。組織で以前に Sコントロールを使用
していない場合は、作成できません。既存の Sコントロールに影響はありません。今後も編集できます。
Visualforce ページは、次世代の Sコントロールとされ、パフォーマンスの向上および作成の簡略化のために、可
能な限り Sコントロールの代わりに使用する必要があります。次の表は、Visualforce ページと Sコントロールの
相違点を説明したものです。
Visualforce ページ

Sコントロール

必要な技術的スキル

HTML、XML

HTML、JavaScript、AJAX ツール
キット

言語スタイル

タグマークアップ

手続き型コード

ページ上書きモデル

タグを使用して標準コンポーネント ページ全体の HTML および
およびカスタムコンポーネントを作 JavaScript の作成
成

標準 Salesforce コンポーネントライ はい
ブラリ

いいえ

組み込みプラットフォームへのアク はい。標準コントローラを使用
セス

いいえ

データ分割

いいえ

はい

開発者は、テキストボックスなどの 開発者は入力コンポーネントを特定
入力コンポーネントを特定の項目 (取 の項目に分割することはできませ
引先名など) で分割することができ ん。代わりに、API を使用する

8

Visualforce の導入

Visualforce のバージョン設定方法

Visualforce ページ

Sコントロール

ます。ユーザがその入力コンポーネ JavaScript コードを記述して、ユーザ
ントに値を保存すると、値はデータ 指定の項目値でデータベースを更新
ベースにも保存されます。
する必要があります。
スタイルシートの継承

はい

いいえ。Salesforce スタイルシートを
手動で指定する必要があります。

一意性など、項目メタデータの設定 はい (デフォルト)
ユーザが一意性または必須性の項目
属性に反しているレコードを保存し
ようとすると、エラーメッセージが
自動的に表示され、ユーザは再度試
行することができます。

はい。describe API コールを使用
して JavaScript でコード化する場合。
ユーザが一意性または必須性の項目
属性に反しているレコードを保存し
ようとすると、エラーメッセージは
Sコントローラ開発者がこれらの属
性をチェックしたコードを記述した
場合にのみ表示されます。

Apex との統合

直接。カスタムコントローラにバイ 間接。API を経由して Apex
ンド。
webService メソッドを使用。

パフォーマンス

マークアップが Force.com プラット API へのすべてのコールではサーバ
フォーム上で実行されるため、すぐ との往復が必要になるため、応答速
に反応します。
度が低い。付加はパフォーマンスを
調整する開発者によって異なる。

ページコンテナ

ネイティブ

iFrame 内

関連リンク
Visualforce とは?
Visualforce の利点
Visualforce のアーキテクチャ設計

Visualforce のバージョン設定方法
Summer '09 リリースから、Visualforce ページおよびコンポーネントはバージョン設定されています。ページまた
はコンポーネントにバージョン番号がある場合、古い Visualforce 要素の機能は新しい実装が導入されても変わり
ません。Visualforce バージョンは 15.0 から開始します。Visualforce ページのバージョンを 15.0 より前のバージョ
ンに設定しようとすると、自動的に 15.0 に変更されます。
下位互換性を持たせるため、各 Visualforce ページおよびカスタムコンポーネントは、特定のバージョンの Visualforce
のほか、指定されたバージョンの API のバージョン設定で保存されます。Visualforce ページまたはコンポーネン
トがインストール済み管理パッケージを参照する場合、このページまたはコンポーネントが参照する各管理パッ
ケージのバージョン設定も同時に保存されます。Visualforce、API、および管理パッケージのコンポーネントが次
のバージョンにアップグレードした場合、Visualforce ページおよびコンポーネントは特定の、既知の動作のバー
ジョンにバインドされます。

9

Visualforce ページで参照されているカスタムコンポーネントは必ずそのバージョン番号で実行されます。つまり、
カスタムコンポーネントがバージョン 15.0 で設定されている場合、バージョン 15.0 または 16.0 ページのどちら
で実行されているかを問わず、必ず Visualforce バージョン 15.0 の動作をします。
リリースノートには、Visualforce バージョン間での変更を記載しています。また、コンポーネントの参照には、
どの Visualforce のバージョンで標準コンポーネントが導入されているのか、また、あるバージョンでコンポーネ
ントまたは属性が廃止になっているかどうかが記載されています。
Visualforce ページまたはカスタムコンポーネントに Salesforce API および Visualforce のバージョンを設定する手順
は、次のとおりです。
1. Visualforce ページまたはコンポーネントを編集して、[バージョン設定] をクリックします。
メモ: [設定] の [開発] からページまたはカスタムコンポーネントを編集する場合にのみ、ページまた
はカスタムコンポーネントのバージョン設定にアクセスできます。[開発モード] で編集する場合は、
バージョン設定にアクセスできません。
2. Salesforce API の[バージョン]を選択します。このバージョンは、ページまたはコンポーネントで使用する
Visualforce のバージョンも示します。
3. [保存] をクリックします。

関連リンク
カスタムコンポーネントのバージョン設定の管理

Visualforce の導入

ドキュメント表記規則

規則

説明

斜体

構文の記述では、斜体は変数を示します。実際の値を入力してください。次の
例では、3 つの値を入力する必要があります。datatype variable_name [ =
value];
構文で太字かつ斜体のテキストは、クラス名や変数の値など、ユーザが指定す
る必要があるコード要素を表します。
public static class Y

Ca

He e { ... }

Bold Courier font

コードサンプルと構文の記述では、太字の Courier フォントはコードまたは構
文の部分を強調します。

<>

構文の記述では、不等号 (< >) は表示されたとおりに入力します。






{}

構文の説明では、中かっこ ({ }) は表示されたとおりに入力します。

Hello {!$User.FirstName}!


[]

構文の記述では、角かっこで囲まれるものはすべて省略可能です。次の例で
は、 a e の指定は省略可能です。
da a_

|

e

a iabe_ a e [ =

a e];

構文の記述では、パイプ記号は「または」を意味します。次のいずれか (すべ
てではない) を実行できます。次の例では、2 つの方法のいずれかを使用して
未入力のセットを作成するか、次のようにセットを入力することができます。
Set e _ a e
[= new Set();] |
[= new Set [個人情報] を選択します。
◊ [私の設定] をクリックした場合は、[個人用] > [高度なユーザの詳細] を選択します。
3. [編集] をクリックします。
4. [開発モード] チェックボックスをオンにします。
5. 必要に応じて、[開発モードでビューステートを表示] チェックボックスをオンにして開発フッターの [ビュー
ステート] タブを有効にします。このタブは、Visualforce ページのパフォーマンス監視に役立ちます。
6. [保存] をクリックします。

•

[設定] で [開発] > [ページ] をクリックすると、Salesforce ユーザインターフェースで Visualforce ページを開発
することもできます。Visualforce コンポーネントの場合は、[設定] で [開発] > [コンポーネント] をクリックし
ます。

•

Force.com IDE は、他にはない機能を備えた Eclipse IDE のプラグインです。Force.com IDE には、Force.com
アプリケーションを構築およびリリースするための統合インターフェースがあり、ソースコードエディタ、
プロジェクトウィザード、統合ヘルプなどのツールが用意されています。この IDE は、上級開発者および開
発チーム向けに設計されています。

12

Visualforce 開発用ツール

開発モードフッターの使用

開発モードフッターの使用
開発モードを有効にすると、そのページの URL に移動してページコンテンツの表示と編集ができます。たとえ
ば、ページの名前が HelloWorld、自分の salesforce.com インスタンスが na3.salesforce.com である場合、ブ
ラウザのアドレスバーに「https://na3.salesforce.com/apex/HelloWorld」と入力します。開発モードで
は、特殊な開発フッターを使用して、Visualforce ページとカスタムコントローラの編集や、Visualforce のパフォー
マンス監視もできます。
開発モードを有効にすると、すべての Visualforce ページで、ブラウザの下部に開発モードフッターが表示されま
す。
•

ページの名前のタブをクリックしてページエディタを開くと、[設定] 領域に戻らずに、関連付けられた
Visualforce マークアップの表示と編集が行えます。変更は、ページを保存するとすぐに表示されます。

•

カスタムコントローラがページに使用されている場合、コントローラクラスの名前はタブとして提供されま
す。そのタブをクリックすると、関連付けられた Apex クラスを編集できます。

•

ページでいずれかのコントローラ拡張を使用する場合、拡張それぞれの名前がタブとして表示されます。そ
のタブをクリックすると、関連する Apex クラスを編集できます。

•

[設定] で有効にすると、[View State (ビューステート)] タブには、Visualforce ページのビューステートに影響
する項目に関する情報が表示されます。

•

[Save (保存)] (編集ペインのすぐ上) をクリックすると、変更を保存し、ページのコンテンツを更新できます。

•

[Component Reference (コンポーネントの参照)] をクリックすると、サポートされているすべての Visualforce
コンポーネントのドキュメントを表示できます。

•

[使用場所] をクリックすると、カスタムタブ、コントローラ、またはその他のページなど、そのページを参
照する Salesforce の全項目の一覧が表示されます。

•

開発モードフッターパネルを折りたたむには、縮小ボタン ( ) をクリックします。展開するには、展開ボタ
ン ( ) をクリックします。

•

開発モードを完全にオフにするには、[Disable Development Mode (開発モードを無効化)] ボタン ( ) をクリッ
クします。開発モードは、個人設定の個人情報ページで再度有効化されるまで、オフのままになります。

[View State (ビューステート)] タブについて
Web ページのビューステートは、サーバ要求時 (データの送受信など) にコントローラの状態を維持するために
必要なすべてのデータで構成されます。ビューステートは、ページの合計サイズに含まれるため、ページのパ
フォーマンスは、ビューステートを効率よく管理するかどうかによって変わることがあります。開発モードフッ
ターの [View State (ビューステート)] タブでは、Salesforce とやり取りするときの Visualforce ページの状態に関す
る情報を提供します。
メモ: [View State (ビューステート)] タブは、ページ要求プロセスを理解している開発者が使用する必要
があります。このタブを使用する前に、Visualforce ページでの実行の順序についてよく理解してくださ
い。
[View State (ビューステート)] タブを有効にする手順は、次のとおりです。
1. Salesforce ページ上部で、名前の横にある下向き矢印をクリックします。名前の下にあるメニューで、[設定]
または [私の設定] のどちらか表示されるほうを選択します。
2. 左ペインで、次のいずれかを選択します。
•

[設定] をクリックした場合は、[私の個人情報] > [個人情報] を選択します。
13

Visualforce 開発用ツール

•

開発モードフッターの使用

[私の設定] をクリックした場合は、[個人用] > [高度なユーザの詳細] を選択します。

3. [編集] をクリックします。
4. [開発モード] チェックボックスがオフの場合は、オンにします。
5. [開発モードでビューステートを表示] チェックボックスをオンにします。
6. [Save (保存)] をクリックします。
メモ: ビューステートはフォームデータにリンクしているため、[View State (ビューステート)] タブは、
ページに  タグが含まれる場合にのみ表示されます。また、[View State (ビューステート)]
タブは、カスタムコントローラまたはコントローラ拡張を使用するページにのみ表示されます。
[View State (ビューステート)] タブは、フォルダノードで構成されます。いずれかのフォルダをクリックすると、
[コンテンツ] タブのある円グラフが表示されます。このグラフには、フォルダの子 Visualforce カスタムコント
ローラ、Apex オブジェクト、または項目が表示されます。グラフの各片の上にマウスポインタを重ねると、親
の合計サイズを占める各要素を表示できます。これは、個々のテキストノードと同じ情報です。グラフを表示す
るには、ブラウザで Flash バージョン 6 以降が有効である必要があります。
Salesforce で許容される Visualforce ページの最大ビューステートサイズは 135KB です。[View State (ビューステー
ト)] タブには、ページのどの要素がその領域を占めているかが表示されます。一般に、ビューステートサイズが
小さいほど読み込み時間が短くなります。ページのビューステートを最小限にするには、Apex コントローラコー
ドを最適化し、使用されている不要な Visualforce コンポーネントを削除します。次に例を示します。
ビューステートの大部分をコントローラまたはコントローラ拡張で使用されているオブジェクトから取得し
ていることが分かった場合は、Visualforce ページに関連するデータのみを戻すように SOQL コールの絞り込
みを検討する。
ビューステートが大規模なコンポーネントツリーの影響を受けている場合は、ページが依存しているコンポー
ネント数の削減を試みる。

•

•

[View State (ビューステート)] タブを使用した Visualforce の改善方法の詳細は、「Visualforce のパフォーマンス向
上のためのベストプラクティス」 (ページ 276)を参照してください。
[View State (ビューステート)] タブには、次の列が含まれます (アルファベット順)。
列

説明

% of Parent (親の割合)

カスタムコントローラ、Apex オブジェクト、または項
目が親の合計サイズに占める割合。

Name (名前)

カスタムコントローラ、Apex オブジェクト、または項
目の名前。

Size (サイズ)

カスタムコントローラ、Apex オブジェクト、または項
目のビューステートサイズ。

Type (種別)

カスタムコントローラ、Apex オブジェクト、または項
目の種別。

Value (値)

項目の値。

[Name (名前)] 列には、Visualforce ページのさまざまな部分を定義するノードが含まれます。次のようなノード

があります (アルファベット順)。

14

Visualforce 開発用ツール

Visualforce エディタについて

ノード

説明

Component Tree (コンポーネントツリー)

ページの全体構造を表します。サイズは、ページに配
置するコンポーネントの数によって影響されます。一
般に、コンポーネントの数が少ないほど、コンポーネ
ントツリーが小さくなり、読み込み時間が短くなりま
す。ビューステートサイズのうち、コンポーネントツ
リーがどの程度を占めているかを表示するには、[View
State (ビューステート)] フォルダをクリックします。

Internal (内部)

Visualforce ページによって使用される内部 Salesforce デー
タを表します。開発者はこのノードを制御できません。
ビューステートサイズのうち、内部要素がどの程度を
占めているかを表示するには、[State (状態)] フォル
ダをクリックします。

Expressions (数式)

Visualforce ページで定義される数式によって使用される
データを表します。

State (状態)

このフォルダには、Visualforce カスタムコントローラ、
Apex オブジェクト、または項目がすべて含まれます。
子の Controller フォルダおよび Controller Extension フォ
ルダを展開すると、ページ上の各オブジェクト、その
項目、項目の値を表示できます。一般に、これらは
Apex コントローラロジックによって異なります。

View State (ビューステート)

このフォルダにはすべてのノードが含まれます。クリッ
クすると、Visualforce ページのビューステートに関する
全体的な情報が表示されます。[Capacity (容量)] タブに
は、割り当てられたビューステートサイズのうち、使
用中のサイズが表示されます。割り当て量を超えると、
グラフにも超過したサイズ (キロバイト単位) が表示さ
れます。

Visualforce エディタについて
開発モードフッターまたは [設定] から Visualforce ページを編集する場合、次の機能を持つエディタを使用できま
す。
構文の強調表示
エディタは、キーワードとすべての関数および演算子について、自動的に構文を強調表示します。
検索 (

)

検索により、現在のページ、クラス、またはトリガの中のテキストを検索できます。検索を使用するには、
[Search (検索)] テキストボックスに文字列を入力し、[Find Next (次を検索)] をクリックします。
• 検出した検索文字列を他の文字列で置き換えるには、[Replace (置換)] テキストボックスに新しい文
字列を入力し、そのインスタンスだけを置き換える場合は [replace] をクリックし、そのインスタンス
と、それ以外にそのページ、クラス、またはトリガに出現する検索文字列のすべてのインスタンスを置
き換える場合は、[Replace All (すべて置換)] をクリックします。
15

Visualforce 開発用ツール

Visualforce エディタについて

•

検索操作で大文字と小文字を区別するには、[Match Case (大文字と小文字を区別する)] オプションをオ
ンにします。

•

検索文字列として正規表現を使用するには、[Regular Expressions (正規表現)] オプションをオンにしま
す。正規表現は、JavaScript の正規表現規則に従います。正規表現を使った検索では、折り返されて複数
行になる文字列も検索できます。
正規表現で検出した文字列を置換操作で使用する場合、検出した検索文字列から得られる正規表現のグ
ループ変数 ($1、$2 など) をバインドすることもできます。たとえば、

タグを

タグで置き換 え、元の

の属性はすべてそのままにするには、 を検索し、それを で置 き換えます。 指定行に移動 ( ) このボタンにより、指定した行番号を強調表示できます。その行が現在表示されていない場合は、エディ タがその行までスクロールします。 元に戻す ( ) およびやり直し ( ) [Undo (元に戻す)] を使用すると編集動作を取り消します。[Redo (やり直し)] を使用すると元に戻した編集 動作をやり直します。 フォントサイズ ドロップダウンリストからフォントサイズを選択し、エディタに表示される文字のサイズを制御します。 行と列の位置 カーソルの行と列の位置は、エディタ下部のステータスバーに表示されます。これは、[Go To Line (指定行 に移動)] ( ) と共に使用し、エディタ内をすばやく移動できます。 行と文字の計数 行と文字の合計数は、エディタ下部のステータスバーに表示されます。 エディタは、次のキーボードショートカットをサポートします。 Tab カーソル位置にタブを追加する SHIFT+Tab タブを削除する CTRL+f [検索] ダイアログを開く、または、現在の検索の次の検索値を検索する CTRL+r [検索] ダイアログを開く、または、現在の検索の次の検索値を指定した置換文字列に置き換える CTRL+g [Go To Line (指定行に移動)] ダイアログを開く CTRL+s 適用の実行 16 Visualforce 開発用ツール Visualforce エディタについて CTRL+z 最後の編集操作を取り消します。 CTRL+y 元に戻した最後の編集操作をやり直します。 17 第3章 Visualforce のクイックスタート Visualforce の重要な要素を紹介するために、この章には言語の機能を説明する例のセットが含まれています。こ れらの例は、すべてのタグやコントローラのあらゆる詳細、ルール、または例外を網羅するものではありません が、Visualforce の新しい開発者は、このガイドの残りの部分に記載される詳細な説明に進む前に、このチュート リアルで、Visualforce がどのように機能するかを理解することができます。 これらの例は、初級と上級のセクションに分けられています。初級の例では、主に Visualforce マークアップを使 用します。上級の例では、Visualforce マークアップのほかに、Force.com Apex コードを使用します。 Apex を必要とする 高度な例 は、独立した章で説明されています。 Visualforce の正常なコンパイル Visualforce ページとコンポーネントは、正しくコンパイルされない限り保存できません。次は、Visualforce ペー ジを作成するときの注意事項のリストです。 • コンポーネントのタグが apex: (apex の後にコロン) のような正しい名前空間の識別子で始まっていることを 確認します。 • すべての開始引用符と開始括弧に対する終了引用符と終了括弧があることを確認します。 • コントローラまたはコントローラ拡張の名前が正しく付けられていることを確認します。 • Salesforce API バージョン 19.0 以降を使用して作成された Visualforce ページとコンポーネントは、適切なフォー ムの XML で記述されている必要があります。一般的に、要素が正しくネストされている必要があること、空 でない要素に終了タグが必要であること、空の要素は閉じスラッシュ (/) で終了している必要があること、な どを意味します。World Wide Web コンソーシアム (W3C) では、適切なフォームの XML の仕様に関する記 事を提供しています。 次の例外が許可されます。 ◊ 適切なフォームの XML に違反するコードは JavaScript 内では許可されます。たとえば、Visualforce で タグを使用する必要はありません。 ◊ 適切なフォームの XML に違反するコードは式内では許可されます。たとえば、数式では引用符をエスケー プする必要はありません。 ◊ など、ページの開始に通常必要とされる XML ディレク ティブは、 などの最上位のコンテナタグ内で使用できます。 18 Visualforce のクイックスタート 最初のページの作成 最初のページの作成 開発モードが有効な場合、ブラウザのアドレスバーに次のようなページの URL を入力することによって、最初 の Visualforce ページを作成できます。 https://Sae f ce_i a ce/apex/ Ne PageNa e たとえば、「HelloWorld」というページを作成するときに、salesforce.com 組織が na3.salesforce.com を使用 している場合、「http://na3.salesforce.com/apex/HelloWorld」と入力します。 ページはまだ存在しないため、中間ページが表示され、そこから新規ページを作成できるようになっています。 [Create Page < Ne PageNa e> (ページ a eOfNe Page を作成)] をクリックして、自動的に作成します。 メモ: Visualforce 開発モードが有効でない場合は、[設定] で [開発] > [ページ] をクリックしてから [新規] をクリックし、新しいページを作成できます。 Visualforce ページは、セットアップのこの部分以降で常に編集できるようになりますが、編集の結果を確 認するには、ページの URL に移動する必要があります。そのため、ほとんどの開発者は、開発モードを 有効にして作業することによって単一のウィンドウでページの参照と編集を行うことを好みます。 図 4 : 新しい Visualforce ページ デフォルトのテキストを含む Visualforce ページが表示されました。新しいページを編集するには、ブラウザの下 に表示されている[ページエディタ]のバーをクリックします。ページエディタが展開されて、次の Visualforce マー クアップが表示されます。

Congratulations

This is your new Apex Page: HelloWorld
このデフォルトのマークアップには、すべてのページに必要な タグ (ページのマークアップを開 始/終了するタグ) のみが含まれます。 の開始タグと終了タグに組み込まれているのはプレーンテキ ストで、一部は

標準 HTML タグでフォーマットされています。 19 Visualforce のクイックスタート Visualforce による項目値の表示 必須の タグを維持するかぎり、プレーンテキストや有効な HTML をこのページに必要なだけ追 加できます。たとえば、ページエディタに次のコードを入力して [Save (保存)] をクリックすると、ページに「Hello World!」という太字のテキストが表示されます。 Hello World! ヒント: 警告には注意してください。開始タグに一致する終了タグがない HTML が含まれているページ を保存すると、Visualforce エディタに警告が表示されます。ページは保存されますが、不正な形式の HTML は、表示されるページに問題を引き起こす原因となります。 Visualforce による項目値の表示 Visualforce ページでは、数式と同じ式の言語を使用します。つまり、{! } 内のすべてが、現在コンテキストにあ るレコードから得られる値にアクセスできる式として評価されます。たとえば、{!$User.FirstName} 式をペー ジに追加すると、現在のユーザの「名」を表示できます。 Hello {!$User.FirstName}! $User は、現在のユーザレコードを常に表すグローバル変数です。すべてのグローバル変数は、$ 記号で参照さ れます。Visualforce で使用できるグローバル変数のリストについては、「グローバル変数」 (ページ 541)を参照し てください。 特定の取引先、取引先責任者、またはカスタムオブジェクトレコードなど、グローバルに使用できるようになっ ていないレコードの項目にアクセスするには、ページをコントローラに関連付ける必要があります。コントロー ラを使用すると、特定のオブジェクトのレコードにアクセスする方法を指定するロジックなど、アプリケーショ ンを実行するためのデータやビジネスロジックをページで使用できます。ページのカスタムコントローラは Apex を使用して定義できますが、Salesforce には、すべての標準およびカスタムオブジェクトに使用できる標準コント ローラが含まれています。 たとえば、取引先に対して標準コントローラを使用するには、 タグに standardController 属性 を追加し、取引先オブジェクトの名前を割り当てます。 Hello {!$User.FirstName}! ページを保存したら、ページの [取引先] タブが強調表示され、ページのコンポーネントのデザインが [取引先] タブに適用されます。さらに、{!account.} 式の構文を使用して、現在コンテキストにある取引先 レコードの項目にアクセスできるようになります。 たとえば、取引先の名前をページに表示するには、ページのマークアップで {!account.name} を使用します。 Hello {!$User.FirstName}!

You are viewing the {!account.name} account.

20 Visualforce のクイックスタート Visualforce による項目値の表示 {!account.name} 式は、標準取引先コントローラの getAccount() メソッドにコールし、現在コンテキストに ある取引先のレコード ID を返します。その後、ドット表記を使用してそのレコードの name 項目にアクセスし ます。 メモ: この式の言語を使用して親オブジェクトにアクセスすることはできません。言い換えると、 {!account.parent.name} はエラーを返します。 メモ: ページを保存すると、 など、すべての入力コンポーネ ントの value 属性について、文字テキストや空白を含まない単一式であり、単一のコントローラメソッ ドまたはオブジェクトプロパティへの有効な参照であるかどうかが検証されます。エラーが発生すると ページを保存できません。 取引先レコードを現在のコンテキストに取り込むには、レコードの ID を指定するページ URL にクエリパラメー タを追加する必要があります。手順は、次のとおりです。 1. 任意の方法で、取引先の ID を検索します。そのための簡単な方法として、取引先レコードの詳細ページを表 示し、URL の最後にある文字コードをコピーするやり方があります。たとえば、次の URL で取引先詳細ペー ジに移動するとします。 https://na3.salesforce.com/001D000000IRt53 この場合、001D000000IRt53 が取引先の ID になります。 2. ページに戻り、ブラウザのアドレスバーの URL にクエリ文字列パラメータとして取引先 ID を追加します。 たとえば、ページが次の場所にあったとします。 https://na3.salesforce.com/apex/HelloWorld2 URL の最後に ?id=001D000000IRt53 を追加します。 https://Sae f ce_i a ce/apex/HelloWorld2?id=001D000000IRt53 メモ: URL に id パラメータを使用する場合、そのパラメータは、標準コントローラで参照されるエン ティティと同じエンティティを参照する必要があります。 取引先 ID を URL に指定したら、次の図のようにページに適切な取引先名が表示されます。 21 Visualforce のクイックスタート Visualforce コンポーネントライブラリの使用 図 5 : Visualforce ページの取引先データの表示 Visualforce コンポーネントライブラリの使用 ここまでで、例に使用された唯一の Visualforce タグは、すべての Visualforce マークアップの先頭と末尾に配置す る必要がある必須の タグです。ただし、 または タグを使用して HTML ドキュメ ントに画像やテーブルを挿入できるのと同様に、Visualforce コンポーネントライブラリに定義されたタグを使用 して、Visualforce ページにユーザインターフェースコンポーネントを追加できます。 たとえば、詳細ページでセクションのように見えるコンポーネントを追加するには、 コン ポーネントタグを使用します。 You are viewing the {!account.name} account. 図 6 : コンポーネント 22 Visualforce のクイックスタート Visualforce コンポーネントライブラリの使用 タグは、関連リスト、詳細ページ、および入力項目などの、一般的な Salesforce インターフェースコンポーネン ト用にも存在します。たとえば、詳細ページのコンテンツを追加するには、 コンポーネントタ グを使用します。 You are viewing the {!account.name} account. 図 7 : 属性がない コンポーネント タグに特定の属性が何も指定されていなくても、 は、コンテキストレコードの完全な詳細ビュー を表示します。どのレコードの詳細を表示するか、関連リストやタイトルを表示するかなど、プロパティを変更 するにはタグで属性を使用できます。たとえば、次のマークアップは、コンテキストの取引先所有者の詳細を表 示しますが、関連リストや色付きのタイトルバーは表示しません。 You are viewing the {!account.name} account. 23 Visualforce のクイックスタート Visualforce ページによる既存のページの上書き 図 8 : 関連リストまたはタイトル要素のない コンポーネント コンポーネントライブラリを参照するには、ページエディタで [Component Reference (コンポーネントの参照)] をクリックします。このページから、任意のコンポーネントにドリルダウンして、定義した任意のカスタムコン ポーネントを含め、各コンポーネントで使用可能な属性を参照できます。 関連リンク 標準のコンポーネントの参照 Visualforce ページによる既存のページの上書き 標準の取引先詳細ページなど、既存のページ形式を変更するとします。取引先のすべての情報は単一ページに表 示されます。多くの情報がある場合は、延々とスクロールする必要があります。Visualforce ページを使用すると、 取引先責任者、商談など、取引先の各セクションをタブに表示できます。 最初に、クイック修正を使用して新しい Visualforce ページを作成します。 1. ブラウザで、テキスト「/apex/tabbedAccount」を Salesforce インスタンスの URL に追加します。たとえ ば、Salesforce インスタンスが https://na1.salesforce.com の場合、新しい URL は https://na1.salesforce.com/apex/tabbedAccount になります。次のエラーメッセージが表示されます。 2. 新規ページを作成するには、[Create Page tabbedAccount (ページ tabbedAccount を作成)] をクリックします。 3. ページの左下のページエディタリンクをクリックします。これにより、新しいページのコードが次のように 表示されます。 24 Visualforce のクイックスタート Visualforce ページによる既存のページの上書き

Congratulations

This is your new Page: tabbedAccount
4. 既存のコードを次のコードで置き換えて、[Save (保存)] をクリックします。 5. [取引先] ページにはデータがありません。前のページと同様に、URL に特定の取引先の ID を指定する必要 があります。たとえば、https://Salesforce_instance/apex/tabbedAccount?id=001D000000IRt53 の ように指定します。取引先 ID を追加した後、ページは次のように表示されます。 25 Visualforce のクイックスタート Visualforce ページによる既存のページの上書き このページマークアップについては、次の点に留意してください。 •

New Account Name!

このページについては、次の点に留意してください。 • これはサンプルページです。
40 Visualforce のクイックスタート ページでのデータのテーブルの作成 This is a sample page: API version 28.0 選択したフォントは、Visualforce PDF 表示サービスで使用できる必要があります。現在、マルチバイト文字 を含む拡張文字でサポートされているフォントは「Arial Unicode MS」のみです。 • PDF 作成時の最大応答サイズは、PDF として表示される前で 15 MB 未満です。これは Visualforce 要求の標 準制限です。 • 生成される PDF の最大ファイルサイズは、60 MB です。 • 生成された PDF に含まれるすべての画像の最大合計サイズは 30 MB です。 • PDF 表示では、data: URI スキーム形式で符号化された画像はサポートされていません。 • 次のコンポーネントは、PDFとして表示するときに 2 バイトのフォントをサポートしません。 ◊ PDF として表示するページでこのようなコンポーネントを使用することはお勧めしません。 関連リンク Visualforce ページのスタイル設定 PDF を表示するためのベストプラクティス ページでのデータのテーブルの作成 または などの一部の Visualforce コンポーネントでは、レコード のコレクションを反復することによって、一度に複数のレコードの情報を表示できます。この概念を説明するた めに、次のページでは、 コンポーネントを使用して、現在コンテキストにある取引先 に関連付けられた取引先責任者をリストします。 You are viewing the {!account.name} account. メモ: このページに取引先データを表示するには、有効な取引先レコードの ID をページの URL のクエ リパラメータとして指定する必要があります。次に例を示します。 https://Sae f ce_i a ce/apex/myPage?id=001x000xxx3Jsxb レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 41 Visualforce のクイックスタート ページでのデータのテーブルの編集 図 14 : コンポーネント 他の反復コンポーネントと同様に、 には、value と var という 2 つの必須属性が含ま れます。 • value は、sObject レコードまたは他のすべての Apex 型の値のリストを取ります。上記の例では、 {!account.Contacts} は現在コンテキストにある取引先の ID を取得してから、リレーションをトラバース して、関連付けられた取引先責任者のリストを取得します。 • var は、反復変数の名前を指定します。この変数は、各取引先責任者の項目にアクセスするために、 タグの本文内で使用されます。この例では、取引先責任者の名前を表示するため に、value="{!contact.Name}" が タグで使用されています。 コンポーネントは、1 つ以上の子 コンポーネントを使用します。テー ブルの行数は、value 属性を使用して返されるレコード数によって制御されます。 メモ: コンポーネントは、標準の Salesforce リストのスタイルを自動的に適用 します。独自のスタイルでリストを表示するには、代わりに を使用します。 ページでのデータのテーブルの編集 最後のチュートリアルでは、データのテーブルを作成しました。データテーブルの列に を 使用することによって、編集可能項目を含むテーブルを作成できます。 を使用すると、 変更したデータを保存できます。メッセージ (「Saving」など) は、 タグで自動的に表 示されます。 次のページでは、複数の業種を同時に編集できるページを作成します。 42 Visualforce のクイックスタート ページでのクエリ文字列パラメータの使用 メモ: URL に ID 属性がある場合、このページは正しく表示されません。たとえば、 https://c.na1.visual.soma.force.com/apex/HelloWorld?id=001D000000IR35T ではエラーが発 生します。URL から ID を削除する必要があります。 ページマークアップについては、次の点に注意してください。 • このページは、コントローラの標準セットを活用して、テーブルのデータを生成します。使用するデータセッ トの名前を指定するには、recordSetVar 属性を使用します。次に、 の値に、その セットの名前を使用してテーブルにデータを入力します。 • タグは、項目の正しい表示を自動的に生成します。この場合は、ドロップダウンリスト として表示を行います。 • タグを使用するには、ページが タグで囲まれている必要があります。 フォームによって、Visualforce ページ内の、ユーザが操作できる部分が指定されます。 図 15 : データテーブルの編集例 ページでのクエリ文字列パラメータの使用 前述の例で示すように、デフォルトのページコンテキスト (つまり、ページに表示されるデータのソースを提供 するレコード) は、ページ URL 内の id という名前のクエリ文字列パラメータで制御されます。クエリ文字列パ ラメータを取得して Visualforce マークアップに設定することもできます。次のトピックで例を参照してくださ い。 • クエリ文字列パラメータの取得 • リンクでのクエリ文字列パラメータの設定 • 単一ページでのクエリ文字列パラメータの取得と設定 43 Visualforce のクイックスタート クエリ文字列パラメータの取得 クエリ文字列パラメータの取得 Visualforce マークアップでクエリ文字列パラメータを参照するには、$CurrentPage グローバル変数を使用しま す。$CurrentPage を使用すると、parameters 属性を指定してページのクエリ文字列パラメータにアクセスし、 その後、個別の各パラメータにアクセスできます。 $CurrentPage.parameters. a a e e _ a e たとえば、特定の取引先責任者に関する詳細情報を [取引先] ページに追加するとします。取引先レコード ID は デフォルトの id クエリ文字列パラメータで指定され、取引先責任者レコード ID は cid というクエリ文字列パ ラメータで指定されます。 You are displaying values from the {!account.name} account and a separate contact that is specified by a query string parameter. Name {!contact.Name} Phone {!contact.Phone} この例が正しく表示されるためには、Visualforce ページを URL 内の有効な取引先 ID および取引先責任者 ID に 関連付ける必要があります。たとえば、001D000000IRt53 が取引先 ID で 003D000000Q0bIE が取引先責任者 ID の場合、URL は次のようになります。 https://Sae f ce_i a ce/apex/MyFirstPage?id=001D000000IRt53&cid=003D000000Q0bIE レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 メモ: URL に id パラメータを使用する場合、そのパラメータは、標準コントローラで参照されるエン ティティと同じエンティティを参照する必要があります。 44 Visualforce のクイックスタート リンクでのクエリ文字列パラメータの設定 図 16 : ページでのクエリ文字列パラメータの使用 リンクでのクエリ文字列パラメータの設定 クエリ文字列パラメータをページへのリンクに設定するには、手動でリンク URL を作成するか、 タグを タグ内で使用します。たとえば、次の例はどちらも外部ページへの同一のリンクを 作成します。 Search Google Search Google 2 つ目のメソッドでは、URL を手動で作成するのではなく タグを使用します。スタイル上の理由 から、この方法をお勧めします。 45 Visualforce のクイックスタート 単一ページでのクエリ文字列パラメータの取得と設定 メモ: のほか、 を使用して の要求パラメータを設定します。 単一ページでのクエリ文字列パラメータの取得と設定 前述のクエリ文字列パラメータの取得と設定の例に続き、この例では、単一ページ上で 2 つのアクションを組み 合わせてより興味深い結果を作成する方法を示します。「クエリ文字列パラメータの取得」の例に基づいて、次 のページではリストに含まれる各取引先責任者の名前をハイパーリンクにし、その下に表示される詳細コンポー ネントのコンテキストを制御します。 これは、次の操作により実行できます。 • データテーブルを タグでラップする • 各取引先責任者名を、 タグで適切な cid パラメータを設定する に変換 する 標準コントローラと一緒に使用されると、コマンドリンクは常に現在のページをページに新しく追加された情報 で完全に更新します。この場合は、更新された cid が取引先責任者詳細コンポーネントを更新します。 You are displaying contacts from the {!account.name} account. Click a contact's name to view his or her details. Name {!contact.Name} Phone {!contact.Phone} このマークアップを保存した後、ブラウザを id クエリ文字列パラメータで更新します。ただし、次のように URL に cid パラメータは指定しません。 https://Sae f ce_i a ce/apex/MyFirstPage?id=001D000000IRt53 最初は、取引先責任者詳細ページは表示されませんが、取引先責任者名をクリックすると、ページに該当する詳 細ビューが表示されます。 46 Visualforce のクイックスタート ページでの Ajax の使用 メモ: URL に id パラメータを使用する場合、そのパラメータは、標準コントローラで参照されるエン ティティと同じエンティティを参照する必要があります。 関連リンク コントローラメソッド ページでの Ajax の使用 一部の Visualforce コンポーネントは Ajax を認識するコンポーネントであり、JavaScript をまったく記述すること なくページに Ajax の動作を追加できます。次のトピックで例を参照してください。 • コマンドリンクとボタンによる部分ページ更新の実装 • 非同期操作のための状況の提供 • 任意のコンポーネントでのイベントへの Ajax 動作の適用 コマンドリンクとボタンによる部分ページ更新の実装 最も広く使用されている Ajax 動作の 1 つに部分ページ更新があります。ページ全体を再読み込みするのではな く、ユーザの何らかのアクションに従って特定の部分のページのみを更新する動作です。 部分ページ更新を実装する最も単純な方法は、更新する必要のあるコンポーネントを識別するために、 または タグで reRender 属性を使用する方法です。ユーザがボ タンまたはリンクをクリックすると、識別されたコンポーネントとそのすべての子コンポーネントのみが更新さ れます。 たとえば、「単一ページでのクエリ文字列パラメータの取得と設定」 (ページ 46)で説明されている取引先責任 者リストの例を考えてください。この例では、ユーザがリストの取引先責任者の名前をクリックしてその詳細を 表示すると、このアクションの結果としてページ全体が更新されます。そのマークアップに 2 つの変更を適用す ることによって、リストの下の領域のみが更新されるようにページの動作を変更できます。 1. まず、再表示するページの部分を作成または特定します。これを行うには、 タグを タグでラップし、出力パネルに id パラメータを指定します。id の値は、この領域を 参照する名前で、ページのあらゆる場所で使用できます。この値は、ページ内で一意である必要があります。 2. 次に、定義した領域の部分ページ更新を実行するために使用する、呼び出しポイント (コマンドリンク) を示 します。これを行うには、 タグに reRender 属性を追加し、出力パネルの id に割り当 てられた値と同じ値をその属性に指定します。 最終的なマークアップは次のようになります。 You are displaying contacts from the {!account.name} account. Click a contact's name to view his or her details. 47 Visualforce のクイックスタート 非同期操作のための状況の提供 {!contact.Name} ページを保存したら、任意の取引先責任者をクリックし、ページ全体を更新しなくても詳細コンポーネントが表 示されることを確認します。 メモ: テーブルのコンテンツを更新するために reRender 属性を使用することはできません。 非同期操作のための状況の提供 部分ページ更新などの Ajax 動作は、ページユーザが作業を進める間にバックグラウンドで発生する非同期イベ ントです。使い勝手をよくするために、デザイナーは、現在進行中のバックグラウンドのアクティビティについ てユーザに警告する状況要素を追加することがよくあります。 Visualforce は、 タグを使った状況更新をサポートしています。このタグを使用すると、 startText または stopText 属性によって、バックグラウンドのイベントの開始時または終了時にテキストを表 示できます。また、さらに上級の開発者であれば、画像やその他のコンポーネントを表示することができます。 この例では、取引先責任者リストのページに、開発段階であることを示す状況テキストを追加します。ユーザが 取引先責任者の名前をクリックすると、詳細領域が表示される間、その領域に [要求中...] というテキストが表示 されます。 メッセージを実装するには、 を非同期的に更新される コンポーネント の周りにラップします。2 つのタグの間に、「stop」という名前の タグを追加します。 facet は、コンポーネントに示されるデータに関するコンテキスト情報を提供する、Visualforce コンポーネント内 の 1 つの領域のコンテンツで構成されます。たとえば、 はテーブルのヘッダー、フッター、 キャプションの facet をサポートしますが、 は列のヘッダーまたはフッターの facet のみをサポー トします。 コンポーネントを使用すると、Visualforce コンポーネントのデフォルトの facet を独自 のコンテンツで上書きできます。facet の開始タグと終了タグ内で使用できるのは 1 つの子のみです。 メモ: すべてのコンポーネントが facet をサポートしているわけではありません。facet をサポートしているコン ポーネントは「標準のコンポーネントの参照」に記載されています。 次の例では、 は、アクションが完了するとすぐに表示されるコンポーネントを含む、 「stop」という facet (この例では詳細領域) をサポートします。 You are displaying contacts from the {!account.name} account. Click a contact's name to view his or her details. 48 {!contact.Name} {!contact.Name} ページを保存したら、任意の取引先責任者にマウスポインタを移動し、クリックしなくても詳細領域が適切な情 報で更新されることを確認します。 関連リンク Visualforce ページでの JavaScript の使用 50 第4章 Visualforce ページの外観と HTML 出力のカスタマイズ Visualforce ぺージおよびコンポーネントは、表示するブラウザに送信される HTML を出力します。Visualforce の HTML 生成機能は高度であり、自動的にページ構造、コンテンツ、スタイルを提供します。また、Visualforce に は、Visualforce のデフォルトの HTML を変更し、ページを独自の HTML や、CSS スタイルシートまたは JavaScript ファイルなどの関連付けられた追加リソースに置き換える方法も多数用意されています。 • 個々のコンポーネントにカスタムスタイルを添付したり、ページに独自のスタイルやスタイルシートを含め たりして、Visualforce ページのスタイルをカスタマイズできます。これにより、ページ上の個々の要素のデザ インをカスタマイズできます。 • Visualforce ページの「doctype」(ドキュメント種別または DTD) を変更できます。これは、HTML5 を使用す る場合に特に便利で、ブラウザの互換性問題について対処できる場合もあります。 • ブラウザで別の出力処理方法を強制するには、Visualforce ページの特定のコンテンツタイプを設定できます。 たとえば、ブラウザウィンドウに表示する代わりに CSV ファイルとしてダウンロードする場合にこの機能を 使用できます。 • 生成される HTML に「パススルー」するカスタム属性を Visualforce コンポーネントに添付できます。この機 能は、たとえば jQuery Mobile や Knockout.js などの JavaScript フレームワークと併用するために、ページ要素 に data- 属性を添付する場合に便利です。 • Visualforce ページで生成される HTML の自動「整理」を緩和して、HTML5 アプリケーションを作成しやす くすることができます。 • 自分で追加する静的 HTML タグのために、ページでの および タグの生成を手動で無効化する ことができます。 Visualforce ページのスタイル設定 Visualforce ページのスタイルは、標準の Salesforce ページのデザインを模倣するか、独自のスタイルシートやコン テンツタイプを使用して容易に設定できます。 多くの Visualforce コンポーネントには style または styleClass 属性が含まれています。このいずれかの属性 を定義すると、CSS コードをコンポーネントに関連付けることができます。カスタム CSS コードを使用すると、 幅、高さ、色、フォントなど、コンポーネントのデフォルトのビジュアルスタイルを変更できます。 Salesforce スタイルの使用 詳細ページの関連リストやセクションヘッダーなど、多くの Visualforce コンポーネントのデザインは、Salesforce の同じコンポーネントと共通しています。配色など、こうしたコンポーネントのスタイルの一部は、コンポーネ ントが表示されるタブに基づいています。コンポーネントのスタイル設定に使用するタブスタイルを指定するに 51 Visualforce ページの外観と HTML 出力のカスタマイズ Salesforce スタイルの使用 は、ページを標準コントローラに関連付けるか、 または タグの tabStyle 属 性を設定します。 • Visualforce ページに標準コントローラを使用する場合、新しいページには、関連付けられたオブジェクトの Salesforce での標準タブのスタイルが適用されます。これにより、関連オブジェクトに関連付けられたメソッ ドやレコードにアクセスすることもできます。 • カスタムコントローラを使用する場合、 タグの tabStyle 属性により、関連付けられた Salesforce ページのデザインを模倣できます。ページを部分的に Salesforce ページに似せる場合、 タ グの tabStyle 属性を使用できます。「getter メソッドの定義」 (ページ 107)の例を参照してください。 Salesforce ユーザインターフェースのカスタマイズの詳細は、Salesforce ヘルプの 「ユーザインターフェース設定 のカスタマイズ」を参照してください。 Salesforce スタイルの拡張 ページにスタイルシートを追加するには、 タグを使用します。スタイルシートのスタイル 定義に Visualforce コンポーネントを接続するには、これらのほとんどのコンポーネントで使用できる style 属性 または styleClass 属性を使用します。このように、独自の Salesforce スタイルを拡張できます。 次のマークアップは非常に基本的なページを示します。 タグは、[設定] の [開発] > [静的リ ソース] で TestStyles という名前の静的リソースとして保存された、CSS スタイルシートを参照します。これは、 タグの value 属性の $Resource グローバル変数によって参照されます。 タグの styleClass 属性は、スタイルシートに定義されたサンプルスタイルクラスを使用しています。 この例に使用されているスタイルシートは、次のとおりです。 .sample { font-weight: bold; } ユーザに表示する Salesforce スタイルの識別 Visualforce ページを作成する場合、期待される Salesforce のデザインを知っておくと、そのスタイルにマッチした ページを表示するのに役立ちます。たとえば、ユーザがデザインをカスタマイズするかどうか選択できるとしま す。Visualforce ページは、その違いを考慮して設計する必要があります。 ユーザに表示するスタイルを識別するには、$User.UITheme と $User.UIThemeDisplayed という 2 つのグロー バル変数が役立ちます。これら 2 つの変数は、$User.UITheme がユーザに表示すべきデザインを返し、 $User.UIThemeDisplayed が実際のデザインを返すという点で異なります。たとえば、ユーザは [新しいユーザ インターフェースのテーマ] のデザインを表示するよう設定された権限を持っている場合がありますが、そのデ ザインをサポートしていないブラウザを使用していると、Internet Explorer 6 などで $User.UIThemeDisplayed が異なる値を返す場合があります。 どちらの変数も、次の値のいずれかを返します。 • Theme1 — 古い Salesforce テーマ • Theme2 — Spring '10 以前に使用されていた Salesforce テーマ • PortalDefault — Salesforce カスタマーポータル のテーマ • Webstore — Salesforce AppExchange のテーマ 52 Visualforce ページの外観と HTML 出力のカスタマイズ • Salesforce スタイルの使用 Theme3 — Spring '10 で導入された、現在の Salesforce テーマ 開発者が Salesforce に似た CSS スタイルをハードコードしたとします。Visualforce ページで新しいスタイルにつ いても同じデザインを維持するために、開発者はユーザの設定に合わせるために複数のスタイルシートの中から 選択する必要があります。次の例に、それを実現する方法の 1 つを示します。 この例では、次の点に留意してください。 • 表示するセクションを「切り替え」るには rendered 属性を使用する。 • タグには rendered 属性がないため、この属性があるコンポーネントでラップする必要 がある。 ユーザ向けに新しいデザインを有効にしても、ユーザがそれを表示するための適切なブラウザやアクセシビリ ティの設定を行っていない可能性があります。次のコード例では、$User.UITheme 変数を使用して代替情報を ユーザに表示します。 We've noticed that the new look and feel is enabled for your organization. However, you can't take advantage of its brilliance. Please check with your administrator for possible reasons for this impediment. $User.UITheme は Theme3 と同じですが、$User.UIThemeDisplayed は異なります。そのため、ページは最大 限まで表示されません。 Salesforce スタイルシートの使用 警告: Salesforce スタイルシードはバージョン管理されておらず、コンポーネントの外観やクラス名は予 告なしに変更される可能性があります。Salesforce.com では、Salesforce スタイルシートを直接参照し、そ れに依存するのではなく、Salesforce スタイルのデザインを模倣した Visualforce コンポーネントを使用す ることをお勧めします。 Salesforce では、アプリケーション全体でさまざまなスタイルシート (.css ファイル) を使用して、すべてのタブを Salesforce のデザインに準拠させています。これらのスタイルシートは、 タグの showHeader 属性 に false を指定しない限り、Visualforce ページに自動的に含まれます。 Salesforce スタイルシートが含まれないようにすると、独自のカスタムスタイルシートのみがページのスタイルに 影響します。Salesforce のデザインに部分的または完全にマッチするスタイルを構築するという目的では、デフォ ルトのスタイルシートから選択したコンテンツを参照し、使用することをお勧めします。 53 次のスタイルシートには、参照可能なスタイルクラスが含まれています。これらは、salesforce.com インスタンス の /dCSS/ ディレクトリにあります。 • dStandard.css – 標準のオブジェクトとタブのスタイル定義の大半が含まれる。 • allCustom.css – カスタムタブのスタイル定義が含まれる。 重要: Salesforce.com は、組み込みスタイルの変更を通知したり、マニュアルを提供したりしていません。 Visualforce ページの外観と HTML 出力のカスタマイズ コンポーネントの DOM ID を使用したスタイルの定義 HTML を作成するすべての Visualforce コンポーネントには、パススルー style および styleClass 属性があり ます。これらによって、独自のスタイルとスタイルクラスを使用して HTML タグのデザインを制御できます。 たとえば、次のコードは のクラスを設定し、スタイルを適用します。 DOM ID を使用してスタイルを適用する場合、スタイル定義に CSS 属性セレクタを使用する必要があります。 属性セレクタは、HTML タグではなく属性の定義を利用して CSS スタイルを適用します。任意の Visualforce コ ンポーネントの id 値を設定できますが、場合によってはその id の先頭に親コンポーネントの id が付加されま す。たとえば、次のコードの id は j_id0:myId です。 CSS にこれを反映するには、属性セレクタを使用します。 スタイルシートで画像を使用する場合は、画像を CSS ファイルと一緒に zip に圧縮して、1 つの静的リソースと してアップロードします。たとえば、CSS ファイルに次のような行があるとします。 body { background-image: url("images/dots.gif") } images ディレクトリ全体と親 CSS ファイルを 1 つの zip ファイルに追加します。たとえば、zip ファイルリソー ス名が myStyles の場合、次のように参照します。 警告: スタイルシートの url 値が空の文字列である場合、そのページを PDF として表示することはでき ません。たとえば、スタイルルール body { background-image: url(""); } がページに含まれる場 合、そのページは PDF として表示されません。 コンポーネントの DOM ID を使用したスタイルの定義 DOM ID を使用してスタイルを適用する場合、スタイル定義に CSS 属性セレクタを使用します。属性セレクタ は、HTML タグではなく属性の定義を利用して CSS スタイルを適用します。どの Visualforce コンポーネントで も id 値をその DOM ID に設定できます。ただし、表示される HTML に含まれる id には通常、Visualforce の自 55 Visualforce ページの外観と HTML 出力のカスタマイズ HTML コメントと IE 条件付きコメント 動 ID 生成プロセスの一環として、親コンポーネントの id が先頭に付加されます。たとえば、次のコードの実 際の HTML id は、j_id0:myId になります。 CSS にこれを反映するには、属性セレクタを使用します。 このセレクタでは、ID 内のどこかに "myId" が含まれる DOM ID が照合されるため、Visualforce コンポーネント で設定する id をスタイル設定に使用する場合は、その ID がページ上で一意である必要があります。 HTML コメントと IE 条件付きコメント Visualforce は、内容を処理することなく、表示前にほとんどの HTML コメントと XML コメントをページから 削除します。ただし、Internet Explorer 条件付きコメントは表示されるため、IE 固有のリソースおよびメタタグ を含めることができます。 Internet Explorer の条件付きコメントは、一般に古いバージョンの IE との間で発生するブラウザの互換性問題に 対処するために使用されます。条件付きコメントはページ上のどこで使用されても動作しますが、ページの タグの内側に配置されることがよくあり、その場合は、バージョン固有のスタイルシートまたは JavaScript 互換性の「shim」を含めるために使用できます。 ページの タグの内側に条件付きコメントを配置するには、標準の Salesforce ヘッダー、サイドバー、お よびスタイルシートを無効にし、独自の タグと タグを追加します。

Browser Compatibility

It's not just a job. It's an adventure.

56 Visualforce ページの外観と HTML 出力のカスタマイズ Visualforce で追加または変更される HTML タグ Visualforce では、標準 HTML コメント内の などの Visualforce タグをサポートせず、 評価もしません。ただし、IE 条件付きコメント内の次の表記は評価します。 • $Resource や $User などのグローバル変数 • URLFOR() 関数 条件付きコメントの使用方法の詳細は、Internet Explorer の条件付きコメントに関する Microsoft のドキュメント を参照してください。 Visualforce で追加または変更される HTML タグ デフォルトでは、結果が確実に有効な HTML (および XML) ドキュメントとなるようにするため、必要な HTML タグが Visualforce によってページに自動的に追加されます。 この自動的な動作を使用するページでは、Visualforce により、比較的単純な GET 要求コンテキスト (ページが最 初に読み込まれて表示されるとき) と、POSTBACK コンテキスト ( が返送されるときや、 タグを使用して Ajax 要求が行われるときなど) の 2 つのコンテキストで、HTML タグが追 加されます。 GET コンテキストでは、Visualforce で表示される HTML はやや緩和されています。ページをラップする タグや、ページのタイトル、および または を使用してページに 追加されたスタイルシートまたはスクリプトをラップする タグ、ページのコンテンツをラップする タグが追加されます。 他の Visualforce タグで生成される HTML は完全で有効な HTML になり、無効な静的 XML を含む Visualforce ページは保存できません。ただし、コントローラメソッドにアクセスする式によって追加された HTML、sObject 項目、他の非 Visualforce ソースなどは、それが返される前に Visualforce で検証されません。このため、GET 要求 を介して無効な XML ドキュメントが返される可能性があります。 POSTBACK コンテキストでは、Visualforce はより厳密です。場合によっては要求のコンテンツを既存の DOM に 挿入することが必要になるため、応答 HTML は有効になるように後処理されます。この「整理」により、欠落 したタグや片方しかないタグの修復、無効なタグや属性の削除、それ以外にも無効な HTML のクリーンアップ が行われ、コンテンツがクリーンな状態で返送先のページの DOM に挿入されます。この動作の目的は、 などの既存の DOM を更新するタグが確実に動作するようにすることです。 HTML5 文書型の整理の緩和 問題の原因となる、HTML5 アプリケーションでのデフォルトの HTML の整理を緩和するには、docType を 「html-5.0」に設定し、API バージョンを 28.0 以降に設定します。 API バージョン 28.0 以降では、POSTBACK コンテキストについて docType="html–5.0" を使用した Visualforce ページの整理動作が変更され、HTML5 タグと属性が削除されなくなりました。Visualforce では常に、すべての ページで保存時に XML が正確であるかどうかが検証され、ページの XML 形式が適切であることが要求されま すが、後処理での整理では POSTBACK 要求の不明なタグまたは属性は削除されなくなりました。これにより、 HTML 属性を幅広く使用する HTML5 および JavaScript フレームワークの操作が非常に簡単になります。 最新のブラウザは独自の整理を非常に効果的に行いますが、有効なマークアップの表示に比べて動作の一貫性に 欠けます。html–5.0 モードでの HTML の整理の削減はセーフティネットの減少を表しますが、その代わりに 柔軟性が大幅に向上します。この緩和された整理モードは、このモードが必要な HTML5 ページでのみ、HTML 検証およびデバッグツールと共に使用することをお勧めします。 57 メモ: API バージョン 28.0 以降では、ページに対する docType の判定方法の範囲が異なります。 を使用して子ページをルートページに追加する場合、階層内のいずれかのページが docType="html–5.0" に設定され、ルートページが API バージョン 28.0 以降に設定されていると、ペー ジ階層全体が html–5.0 モードで表示されます。 および タグの自動生成の手動による無効化 タグの applyHtmlTag および applyBodyTag 属性を使用して、 および タグの自動 生成を抑制し、手動で静的マークアップをページに追加しまず。 次の例で、この方法を示します。

Congratulations!

This page looks almost like HTML5!

これらの属性の動作は互いに独立して機能し、true、false、設定なしを組み合わせて使用できます。両方の属 性がデフォルトの true に設定されると、 および タグの自動生成が保持されます。どちらかが false に設定されると、対応するタグをマークアップに自分で追加する必要があります。このモードでは、ユー ザが無効なタグの組み合わせや、最新のブラウザでも処理できない属性を作成するのを Visualforce で防止できま せん。 メモ: applyHtmlTag および applyBodyTag の値に関係なく、 セクションは必要に応じて常に生 成されます。たとえば、 または タグを使用したり、ペー ジの title を設定したりすると、 タグが生成されます。 ただし、これには 1 つの例外があります。applyHtmlTag が false に設定され、ページに 以外の要素がない場合、 は生成されません。たとえば、次のコードで は タグは自動的に追加されますが、 セクションは追加されません。 Visualforce ページの外観と HTML 出力のカスタマイズ • カスタム doctype の使用 showHeader 属性は、ページについては false に設定する必要があります (例: )。 • contentType 属性は "text/html" (デフォルト) に設定する必要があります。 • 最上位、つまり最も外側の タグの値が使用されます。 タグを使用して追加さ れたページ上の applyHtmlTag および applyBodyTag 属性は無視されます。 カスタム doctype の使用 デフォルトでは、Visualforce ページは、HTML 4.01 Transitional という doctype で配信されます。特に、ページは この doctype 宣言で開始します。 Visualforce ページに異なる doctype を指定するには、 タグの docType 属性を使用します。 docType 属性は、ドキュメント種別を表す文字列を取ります。文字列の形式は次のとおりです。 -[-] 各項目は次のとおりです。 • doctype は html か xhtml のいずれか • version は doctype で有効な10 進数のバージョン番号 • variant は次のいずれか (含まれる場合) ◊ すべての html ドキュメント種別と xhmtl-1.0 ドキュメント種別については、strict、transitional、 または frameset ◊ xhmtl-1.1 ドキュメント種別については、 または basic 無効なドキュメント種別が指定されている場合、デフォルトの doctype が使用されます。有効な HTML doctype の詳細は、W3C Web サイトに掲載されているリストを参照してください。 メモ: Summer ’13 では、ページの docType の判定方法の範囲が異なります。 タグを使 用してページをメインページに追加する場合、階層内のいずれかのページが docType="html–5.0" に設 定されていると、ページ階層全体がそのモードで表示されます。 カスタム doctype の例 XHTML 1.0 Strict ドキュメント種別の Visualforce ページを作成するには、 タグの docType 属性を 使用し、xhtml-1.0-strict という値を指定します。

This is Strict XHTML!

Remember to close your tags correctly:

59 Visualforce ページの外観と HTML 出力のカスタマイズ カスタム ContentType の使用 メモ: Visualforce では、doctype と一致させるためにコンポーネントが生成したマークアップを変更した り、ヘッダーやサイドバーのような標準の Salesforce 要素のマークアップを変更したりすることはありま せん。Salesforce 要素は、大半の doctype で有効であり、どの doctype でも適切に機能しますが、厳格な doctype を選択して HTML 検証テストを通過させる場合、標準の Salesforce 要素の停止か置き換えが必要 になる場合があります。 カスタム ContentType の使用 Visualforce ページに異なる形式を指定するには、 タグの ContentType 属性を使用します。これは、 応答の Content-Type HTTP ヘッダーをページの ContentType 属性の値に設定します。 ContentType 属性は、application/vnd.ms-excel、text/csv、image/gif などの、Multipurpose Internet Mail Extension (MIME) メディアタイプを値として取ります。無効な ContentType を設定すると、ブラウザが予期し ない動作をすることがあります。有効な MIME メディアタイプの詳細は、 http://www.iana.org/assignments/media-types/を参照してください。 Microsoft Excel ContentType の例 Visualforce ページデータを Microsoft Excel スプレッドシートに表示するには、 タグの contentType 属性を使用し、application/vnd.ms-excel という値を指定します。 たとえば、次のページは取引先責任者の簡単なリストを作成します。これは、「ページでのデータのテーブルの 作成」 (ページ 41)で示した例の簡易版です。 メモ: このページに取引先データを表示するには、有効な取引先レコードの ID をページの URL のクエ リパラメータとして指定する必要があります。次に例を示します。 https://Sae f ce_i a ce/apex/myPage?id=001x000xxx3Jsxb レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 このページを Excel で表示するには、次のように contentType 属性を タグに追加します。 Excel でページが正しく表示されない場合、text/rtf など、別の MIME タイプを試してみてください。 60 Visualforce ページの外観と HTML 出力のカスタマイズ Visualforce コンポーネントのカスタム HTML 属性の設 定 Visualforce コンポーネントのカスタム HTML 属性の設定 任意の属性を多くの Visualforce コンポーネントに追加し、表示される HTML に「パススルー」することができ ます。たとえば、Visualforce と jQuery Mobile、AngularJS、Knockout などの JavaScript フレームワークを併用する とき、data-* またはその他の属性をフレームワーク関数を有効化するフックとして使用する場合に、この機能 は便利です。また、placeholder 「ゴースト」テキスト、pattern クライアント側検証、title ヘルプテキス ト属性などの HTML5 機能の使いやすさを向上させるためにも使用できます。 パススルー属性を コンポーネントなどに追加するには、属性に「html-」のプレフィック スを付け、通常どおりに属性値を設定します。 これにより、次のような HTML 出力が作成されます。 ...
「html-」で始まる属性はすべて、「html-」を削除して、表示される HTML にパススルーされます。 メモ: コンポーネントの組み込みの属性と競合するパススルー属性を使用すると、コンパイルエラーが発 生します。 パススルー属性は、次の Visualforce コンポーネントでサポートされています。 • • • • • • • • • • 61 Visualforce ページの外観と HTML 出力のカスタマイズ • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • Visualforce コンポーネントのカスタム HTML 属性の設 定 表示された HTML へのパススルー属性の追加場所など、個々のコンポーネントについての詳細は、「標準のコ ンポーネントの参照」 (ページ 288)を参照してください。 パススルー属性をサポートするコンポーネントを使用して生成できない HTML マークアップを作成するには、 Visualforce タグと静的 HTML を組み合わせます。たとえば、jQuery Mobile の listview を作成するには、 タグと必要な HTML タグを組み合わせます。 パススルー属性は、動的 Visualforce ではサポートされていません。 62 Visualforce ページの外観と HTML 出力のカスタマイズ HTML5 manifest 属性を使用したオフラインキャッシュ HTML5 manifest 属性を使用したオフラインキャッシュ タグの manifest 属性を使用して、ページの重要なリソースをオフラインでキャッシュするため に HTML5 キャッシュマニフェストを設定できます。 manifest 属性の値は、生成された HTML に渡されます。例:

Congratulations!

This page looks almost like HTML5!

タグは次のようになります。 manifest 属性は、API バージョン 28.0 以降に設定された Visualforce ページの タグで使用できま す。また、applyHtmlTag が true (デフォルト) に設定されている必要もあります。 Visualforce を使用して、ページのキャッシュマニフェストを指定できます。たとえば、上記の例で参照される CacheManifest ページは、次のようになります。 CACHE MANIFEST index.html stylesheet.css images/logo.png scripts/main.js 63 第5章 標準コントローラ Visualforce コントローラは、関連付けられた Visualforce マークアップで指定されたコンポーネントをユーザが操 作 (ボタンやリンクのクリックなど) したときの動作を指定する命令のセットです。コントローラを使用すると、 ページに表示されるデータにアクセスでき、また、コンポーネントの動作を変更できます。 Force.com プラットフォームでは、標準の Salesforce ページで使用されるものと同じ機能とロジックを持つ多くの 標準コントローラが提供されます。たとえば、標準取引先コントローラを使用する場合、Visualforce ページで [保 存] ボタンをクリックした場合、標準の取引先編集ページで [保存] をクリックした場合と同じ動作が行われま す。 標準コントローラは、Force.com API を使用してクエリできる Salesforce オブジェクトのすべてに存在します。 標準コントローラの使用に関する詳細は、次のトピックを参照してください。 • Visualforce ページへの標準コントローラの関連付け • 標準コントローラによるデータへのアクセス • 標準コントローラアクションの使用 • 入力規則と標準コントローラ • 標準コントローラを使用するページのスタイル設定 • オブジェクトのアクセシビリティの確認 • カスタムコントローラおよびコントローラ拡張 Visualforce ページへの標準コントローラの関連付け 標準コントローラを Visualforce ページに関連付けるには、 タグで standardController 属性を使 用し、Force.com API を使用してクエリ可能な Salesforce オブジェクトの名前をそれに割り当てます。 たとえば、ページを MyCustomObject という名前のカスタムオブジェクトの標準コントローラに関連付けるに は、次のマークアップを使用します。 メモ: タグで standardController 属性を使用する場合、同時に controller 属性を使用 することはできません。 64 標準コントローラ 標準コントローラによるデータへのアクセス 標準コントローラによるデータへのアクセス すべての標準コントローラには、ページ URL の id クエリ文字列パラメータで指定されたレコードを返す getter メソッドが含まれます。このメソッドを使用すると、関連付けられたページマークアップが {! bjec } 構文 (object はコントローラに関連付けられたオブジェクトの小文字の名前) を使用して、コンテキストレコードの 項目を参照できます。たとえば、標準取引先コントローラを使用するページは、{!account.name} を使用して、 現在コンテキストにある取引先の name 項目の値を返すことができます。 メモ: getter メソッドを正常に実行するには、URL の id クエリ文字列パラメータで指定されたレコード が標準コントローラと同じ型である必要があります。たとえば、標準取引先コントローラを使用するペー ジが返せるのは取引先レコードのみです。取引先責任者レコード ID が id クエリ文字列パラメータで指 定されている場合、{!account} 式ではデータは返されません。 Force.com API でのクエリと同様に、差し込み項目の構文を使用して関連するレコードからデータを取得できま す。 • 子-親リレーションは、最大 5 レベルまでトラバースできます。たとえば、取引先責任者標準コントローラを 使用している場合、{!contact.Account.Owner.FirstName} (3 レベルの子-親リレーション) を使用して、 その取引先責任者に関連付けられている取引先レコードの所有者名を返すことができます。 • 親-子リレーションは、1 レベルをトラバースできます。たとえば、標準取引先コントローラを使用している 場合、{!account.Contacts} を使用して、現在コンテキストにある取引先に関連付けられているすべての取 引先責任者の配列を返すことができます。 標準コントローラアクションの使用 action メソッドは、ユーザがボタンをクリックしたり、ページ内のある領域にマウスポインタを移動したりする などのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメータに {! } 表記を使用することによって、ページマークアップから action メソッドをコールでき ます。 • はアクションをコールするボタンを作成する • はアクションをコールするリンクを作成する • は定期的にアクションをコールする • は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) を作成し、アクションをコールする • は、アクションをコールする新しい JavaScript 関数を定義する • はページが読み込まれると、アクションをコールする 次の表に、すべての標準コントローラでサポートされる action メソッドの一覧を示します。これらのアクション は、action 属性が含まれる Visualforce コンポーネントに関連付けることができます。 アクション 説明 save 新規レコードを挿入するか、既存のレコードが現在コンテキストにある場合はそれ を更新します。この操作が完了した後、save アクションは、元のページ (わかって 65 標準コントローラ アクション 標準コントローラアクションの使用 説明 いる場合) にユーザを戻すか、保存したレコードの詳細ページにユーザを移動しま す。 quicksave 新規レコードを挿入するか、既存のレコードが現在コンテキストにある場合はそれ を更新します。save アクションとは異なり、このページはユーザを別のページに リダイレクトしません。 edit 現在コンテキストにあるレコードの編集ページにユーザを移動します。この操作が 完了した後、edit アクションは、最初にユーザがアクションを呼び出したページ にユーザを戻します。 delete 現在コンテキストにあるレコードを削除します。この操作が完了した後、delete アクションは、ページを更新するか、関連付けられたオブジェクトのタブにユーザ を移動します。 cancel 編集操作を中止します。この操作が完了した後、cancel アクションは、最初にユー ザが編集を呼び出したページにユーザを戻します。 list そのオブジェクトに対して最近使用されたリスト検索条件に基づいて、標準リスト ページの PageReference オブジェクトを返します。たとえば、標準コントローラが contact で、ユーザが表示した最近検索されたリストが New Last Week (先週に新 規作成) の場合、先週作成された取引先責任者が表示されます。 たとえば、次のページでは取引先を更新できます。[保存] をクリックすると、save アクションが標準コントロー ラでトリガされ、取引先が更新されます。 メモ: このページに取引先データを表示するには、有効な取引先レコードの ID をページの URL のクエ リパラメータとして指定する必要があります。次に例を示します。 https://Sae f ce_i a ce/apex/myPage?id=001x000xxx3Jsxb レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 メモ: 標準コントローラの save、quicksave、edit、または delete アクションに関連付けられたコマ ンドボタンとリンクは、ユーザに適切な権限がある場合にのみ表示されます。同様に、特定のレコード 66 標準コントローラ 入力規則と標準コントローラ がページに関連付けられていない場合、edit および delete アクションに関連付けられたコマンドボタ ンとリンクは表示されません。 入力規則と標準コントローラ 標準コントローラを使用する Visualforce ページにユーザがデータを入力し、そのデータが入力規則エラーになっ た場合、エラーが Visualforce ページに表示されることがあります。入力規則エラーの場所が コンポーネントに関連付けられた項目の場合、エラーはそこに表示されます。入力規則エラーの場所がページ上 部に設定されている場合は、 内の または コンポーネン トを使用してエラーを表示します。 標準コントローラを使用するページのスタイル設定 標準コントローラに関連付けられたページは、指定されたオブジェクトに関連付けられた標準の Salesforce ペー ジに使用されているスタイルを自動的に継承します。つまり、指定されたオブジェクトのタブが選択された状態 で表示され、関連付けられたタブ色がすべてのページ要素のスタイルに使用されます。 標準コントローラを使用するページのスタイルは、 タグの tabStyle 属性を使用して上書きでき ます。たとえば、次のページでは標準取引先コントローラを使用しますが、[商談] タブを強調表示し、[商談] タ ブの黄色を使用するページを表示します。 MyCustomObject に関連付けられたスタイルを使用するには、次のように指定します。 カスタム Visualforce タブに関連付けられたスタイルを使用するには、属性をタブ名 (表示ラベルではない) + アン ダースコア 2 個 (__) + 単語「tab」に設定します。たとえば、名前が Source で表示ラベルが Sources の Visualforce タブのスタイルを使用するには、次の設定を使用します。 または、標準コントローラページのスタイルを独自のカスタムスタイルシートとインラインスタイルで上書きで きます。 関連リンク Visualforce ページのスタイル設定 オブジェクトのアクセシビリティの確認 オブジェクトを表示するにはユーザの権限が不十分な場合、コントローラを使用してそのオブジェクトを表示す る Visualforce ページにはアクセスできなくなります。このエラーを回避するには、Visualforce コンポーネントが、 67 標準コントローラ オブジェクトのアクセシビリティの確認 ユーザがコントローラに関連付けられたオブジェクトに対するアクセス権を持つ場合にのみ表示されるようにす る必要があります。 オブジェクトのアクセシビリティは次のように確認できます。 {!$ObjectType.objectname.accessible} この式は true または false の値を返します。 たとえば、標準の Lead オブジェクトへのアクセス権があるかどうかを確認する場合、次のコードを使用します。 {!$ObjectType.Lead.accessible} カスタムオブジェクトの場合、コードは似ています。 {!$ObjectType.MyCustomObject__c.accessible} MyCustomObject__c は、カスタムオブジェクトの名前です。 ユーザにオブジェクトへのアクセス権がある場合のみページの一部が表示されるようにするには、コンポーネン トの render 属性を使用します。たとえば、ユーザに Lead オブジェクトへのアクセス権がある場合にページブ ロックを表示するには、次のように実行します。

This text will display if you can see the Lead object.

ユーザがオブジェクトにアクセスできない場合に、代替メッセージを表示することをお勧めします。次に例を示 します。

This text will display if you can see the Lead object.

Sorry, but you cannot see the data because you do not have access to the Lead object.

68 第6章 標準リストコントローラ 標準リストコントローラを使用すると、レコードセットの表示や操作が行える Visualforce ページを作成できま す。レコードセットを使用する既存の Salesforce ページの例として、リストページ、関連リスト、一括アクショ ンページなどがあります。標準リストコントローラは、次のオブジェクトで使用できます。 • • • • • • • • • • • • • • Account Asset Campaign Case Contact Contract Idea Lead Opportunity Order Product2 Solution User カスタムオブジェクト 標準リストコントローラの使用に関する詳細は、次のトピックを参照してください。 • Visualforce ページへの標準リストコントローラの関連付け • リストコントローラによるデータへのアクセス • 標準リストコントローラアクションの使用 • 標準リストコントローラによるリストビューの使用 • 標準リストコントローラを使用したタブの上書き • 標準リストコントローラを使用したカスタムリストボタンの追加 関連リンク カスタムコントローラの作成 69 標準リストコントローラ Visualforce ページへの標準リストコントローラの関連付 け Visualforce ページへの標準リストコントローラの関連付け 標準リストコントローラの使用方法は、標準コントローラの使用方法によく似ています。最初に コンポーネントの standardController 属性を設定し、次に同じコンポーネントの recordSetVar 属性を設定 します。 たとえば、ページを取引先の標準リストコントローラに関連付けるには、次のマークアップを使用します。 メモ: タグで standardController 属性を使用する場合、同時に controller 属性を使用 することはできません。 recordSetVar 属性は、ページがリストコントローラを使用することだけでなく、レコードコレクションの変数 名も示すことができます。この変数は、レコードコレクションのデータにアクセスする場合に使用できます。 リストコントローラによるデータへのアクセス ページをリストコントローラに関連付けたら、式言語の構文を使用してレコードのセットを参照できます。たと えば、取引先の単純なテーブルを作成するには、次のマークアップを使用してページを作成します。 これによって作成されたページには、組織のすべての取引先名のリストが表示されます。 メモ: このページでは要求で検索条件が指定されないため、ページは最後に使用した検索条件で表示され ます。リストコントローラでの検索条件の使用方法については、「標準リストコントローラによるリス トビューの使用」 (ページ 72)を参照してください。 Force.com API でのクエリと同様に、式言語の構文を使用して関連するレコードからデータを取得できます。標 準コントローラと同様に、子-親リレーションは最大 5 レベルまで、親-子リレーションは 1 レベルをトラバース できます。 70 標準リストコントローラ 標準リストコントローラアクションの使用 標準リストコントローラを使用する場合、返されるレコードは、現在のビューの定義に従って最初のデータ列を 基準に並び替えられます。これは、最初のデータ列が表示されない場合でも同様です。拡張またはカスタムリス トコントローラを使用する場合、並び替えメソッドを制御できます。 メモ: 標準リストコントローラによって返すことができるレコードは 10,000 個以下です。カスタムコン トローラは、より大きな結果セットに使用できます。「大量のデータセットを使用した作業」 (ページ 85)を参照してください。 標準リストコントローラアクションの使用 action メソッドは、ユーザがボタンをクリックしたり、ページ内のある領域にマウスポインタを移動したりする などのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメータに {! } 表記を使用することによって、ページマークアップから action メソッドをコールでき ます。 • はアクションをコールするボタンを作成する • はアクションをコールするリンクを作成する • は定期的にアクションをコールする • は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) を作成し、アクションをコールする • は、アクションをコールする新しい JavaScript 関数を定義する • はページが読み込まれると、アクションをコールする 次の表では、すべての標準リストコントローラでサポートされる action メソッドについて説明します。これらの アクションは、action 属性が含まれる Visualforce コンポーネントに関連付けることができます。 アクション 説明 save 新しいレコードを挿入するか、変更された既存のレコードを更新します。この操作 が完了した後、save アクションは、元のページ (わかっている場合) またはホーム ページにユーザを戻します。 quicksave 新しいレコードを挿入するか、変更された既存のレコードを更新します。save ア クションとは異なり、quicksave はユーザを別のページにリダイレクトしません。 list ユーザが filterId を指定していない場合は、そのオブジェクトに対して最近使用 されたリスト検索条件に基づいて、標準リストページの PageReference オブジェク トを返します。 cancel 編集操作を中止します。この操作が完了した後、cancel アクションは、最初にユー ザが編集を呼び出したページにユーザを戻します。 first セットにあるレコードの最初のページを表示します。 last セットにあるレコードの最後のページを表示します。 next セットにあるレコードの次のページを表示します。 previous セットにあるレコードの前のページを表示します。 71 標準リストコントローラ リストコントローラによるページネーション 次の例では、ユーザが、取引先レコードを表示するための検索条件を指定します。ユーザが [Go] をクリックす ると、選択された検索条件を使用して標準リストページが表示されます。 リストコントローラによるページネーション リストコントローラを使用してページにページネーションを追加するには、next および previous アクション を利用します。たとえば、次のマークアップを使用してページを作成したとします。 {!a.name} Previous Next デフォルトでは、リストコントローラはページに 20 レコードを返します。ページごとに表示するレコード数を 制御するには、コントローラ拡張を使用して pageSize を設定します。コントローラ拡張の詳細は、「コント ローラ拡張の作成」 (ページ 79)を参照してください。 メモ: ページネーションを使用する場合、コレクションに変更された行があると例外が発生します。これ には、拡張アクションでコレクションに追加された新しい行も含まれます。この場合のエラーメッセー ジの処理は、標準動作に従って行われ、ページ上に表示できます。たとえば、 ま たは コンポーネントを使用してエラーメッセージをユーザに表示できます。 標準リストコントローラによるリストビューの使用 多くの Salesforce ページに含まれるリストビューを使用して、ページに表示されるレコードを絞り込むことがで きます。たとえば、商談ホームページでは、リストビュードロップダウンから [私の商談] を選択して、自分が 所有する商談のみのリストを表示できます。リストコントローラに関連付けられたページでは、リストビューを 使用することもできます。 たとえば、リストビューを使用して取引先の単純なリストを作成するには、次のマークアップを使用してページ を作成します。 72 標準リストコントローラ 標準リストコントローラによるリストビューの使用 {!a.name} そのページを開くと、次のように表示されます。 このページは、標準取引先コントローラに関連付けられており、 コンポーネントは、 {!listviewoptions} によって入力されます。{!listviewoptions} を評価することにより、ユーザが表示で きるリストビューが得られます。ユーザがドロップダウンリストから値を選択すると、その値はコントローラの filterId プロパティにバインドされます。filterId が変更されると、ページで使用できるレコードが変更さ れるため、 が更新されると、その値を使用して、ページで使用できるレコードのリストが更 新されます。 次のように編集ページでビューリストを使用することもできます。 73 標準リストコントローラ リストコントローラによるレコードの編集 メモ: ユーザがリストビューを変更した場合、コレクションに変更された行があると例外が発生します。 この場合のエラーメッセージの処理は、標準動作に従って行われ、ページ上に表示できます。たとえば、 または コンポーネントを使用してエラーメッセージをユーザ に表示できます。 リストコントローラによるレコードの編集 リストコントローラを使用してレコードのセットを編集することもできます。たとえば、次のマークアップを使 用してページを作成したとします。 次のような、商談の [フェーズ] と [完了予定日] を更新して保存できるページが表示されます。 74 標準リストコントローラ リストコントローラによるレコードの編集 詳細は、「カスタムリストコントローラによるレコードの一括更新」 (ページ 125)を参照してください。 メモ: リストコントローラの save、quicksave、または edit アクションに関連付けられたコマンドボ タンとリンクは、ユーザに適切な権限がない場合は表示されません。同様に、特定のレコードがページ に関連付けられていない場合、edit アクションに関連付けられたコマンドボタンとリンクは表示されま せん。 75 第7章 カスタムコントローラおよびコントローラ拡張 標準コントローラは、標準ページに使用されているものと同一のロジックを含むため、Visualforce ページに必要 なすべての機能を提供できます。たとえば、標準取引先コントローラを使用する場合、Visualforce ページで [保 存] ボタンをクリックした場合、標準の取引先編集ページで [保存] をクリックした場合と同じ動作が行われま す。 ただし、既存の機能の上書き、アプリケーションによるナビゲーションのカスタマイズ、コールアウトまたは Web サービスを使用する場合、またはページの情報にアクセスする方法についてより詳細な制御が必要な場合 は、Apex を使用して、カスタムコントローラまたはコントローラ拡張を記述できます。 • カスタムコントローラおよびコントローラ拡張とは? • カスタムコントローラの作成 • コントローラ拡張の作成 • コントローラメソッド • コントローラクラスのセキュリティ • カスタムコントローラおよびコントローラ拡張の作成に関する考慮事項 • Visualforce ページ内の実行順序 • カスタムコントローラおよびコントローラ拡張のテスト • 入力規則とカスタムコントローラ • transient キーワードの使用 カスタムコントローラおよびコントローラ拡張とは? カスタムコントローラは、標準コントローラを使用せずにページのすべてのロジックを実装する Apex クラスで す。Visualforce ページを完全にシステムモードで実行する場合に、カスタムコントローラを使用します。システ ムモードでは現在のユーザの権限と項目レベルのセキュリティが適用されません。 コントローラ拡張は、標準コントローラまたはカスタムコントローラの機能を拡張する Apex クラスです。次の 場合にコントローラ拡張を使用します。 • 標準コントローラの組み込み機能を使用するが、編集、参照、または削除などの 1 つ以上のアクションを上 書きする。 • 新しいアクションを追加する。 • ユーザ権限が適用される Visualforce ページを作成する。コントローラ拡張クラスはシステムモードで実行さ れますが、コントローラ拡張が標準コントローラを拡張する場合、標準コントローラのロジックは、システ ムモードで実行されません。代わりに、ユーザモードで実行され、現在のユーザの権限、項目レベルのセキュ リティ、および共有ルールが適用されます。 76 カスタムコントローラおよびコントローラ拡張 カスタムコントローラの作成 メモ: カスタムコントローラとコントローラ拡張クラスはシステムモードで実行されるため、ユーザ権限 や項目レベルのセキュリティを無視しますが、クラス定義に with sharing キーワードを使用すること によって、ユーザの組織の共有設定、ロール階層、および共有ルールを使用するかどうかを選択できま す。詳細は、Force.com Apex コード開発者ガイドの「with sharing または without sharing キーワー ドの使用」を参照してください。 カスタムコントローラの作成 カスタムコントローラは、引数をとらないデフォルトのコンストラクタを外部の最上位クラスに使用する Apex クラスです。パラメータを含むカスタムコントローラコンストラクタを作成することはできません。 カスタムコントローラを作成する手順は、次のとおりです。 1. [設定] で、[開発] > [Apex クラス] をクリックします。 2. [新規] をクリックします。 3. [バージョン設定] をクリックして、このクラスで使用する Apex および API のバージョンを指定します。組織 が AppExchange から管理パッケージをインストールした場合、このクラスで使用する各管理パッケージのバー ジョンも指定できます。すべてのバージョンでデフォルト値を使用します。デフォルト値では、Apex および API についても、各管理パッケージについても、クラスを最新バージョンに関連付けます。最新バージョン のパッケージのものとは異なるコンポーネントや機能にアクセスする場合は、管理パッケージの古いバージョ ンを指定することもできます。特定の動作を維持するには、Apex および API の古いバージョンを指定できま す。 4. クラスエディタで、クラスの Apex コードを入力します。1 つのクラスの長さは、最大 1,000,000 文字です。 @isTest を使用して定義したコメント、テストメソッド、またはクラスは含みません。 5. [Save (保存)] をクリックし、変更を保存してクラスの詳細画面に戻るか、[Quick Save (適用)] をクリックし、 変更を保存してクラスの編集を続行します。作成した Apex クラスは、クラスに保存する前に正しくコンパイ ルする必要があります。 次のクラスは、カスタムコントローラの単純な例です。 public class MyController { private final Account account; public MyController() { account = [SELECT Id, Name, Site FROM Account WHERE Id = :ApexPages.currentPage().getParameters().get('id')]; } public Account getAccount() { return account; } public PageReference save() { update account; return null; } } 次の Visualforce マークアップは、上記のカスタムコントローラをページ内で使用する方法を示します。 77 カスタムコントローラおよびコントローラ拡張 カスタムコントローラの作成 You belong to Account Name: カスタムコントローラは、 コンポーネントの controller 属性が使用されているため、ページと 関連付けられています。 標準コントローラおよびコントローラ拡張と同様に、カスタムコントローラのメソッドは、関連付けられたペー ジマークアップで {! } 表記を使って参照できます。上記の例では、getAccount メソッドは タグの value 属性で参照されており、 タグは、action 属性が設定された save メソッ ドを参照しています。 メモ: 他の Apex クラスと同様に、すべてのカスタムコントローラはシステムモードで実行されます。し たがって、現在のユーザの資格情報はコントローラのロジックの実行に使用されていないため、ユーザ の権限と項目レベルのセキュリティは適用されません。 クラスの定義で with sharing キーワードを使用することによって、カスタムコントローラでユーザの 組織の共有設定、ロール階層、および共有ルールを適用するかどうかを選択できます。詳細は、Force.com Apex コード開発者ガイドの「with sharing または without sharing キーワードの使用」を参照して ください。 カスタムコントローラは、新しいレコードを作成する場合にも使用できます。次に例を示します。 public class NewAndExistingController { public Account account { get; private set; } public NewAndExistingController() { Id id = ApexPages.currentPage().getParameters().get('id'); account = (id == null) ? new Account() : [SELECT Name, Phone, Industry FROM Account WHERE Id = :id]; } public PageReference save() { try { upsert(account); } catch(System.DMLException e) { ApexPages.addMessages(e); return null; } // After Save, navigate to the default view page: return (new ApexPages.StandardController(account)).view(); } } 次の Visualforce マークアップは、上記のカスタムコントローラをページ内で使用する方法を示します。 78 カスタムコントローラおよびコントローラ拡張 コントローラ拡張の作成 コントローラ拡張の作成 コントローラ拡張は、ApexPages.StandardController または CustomControllerName 型の単一の引数を取る コンストラクタが含まれる Apex クラスです。CustomControllerName は、拡張するカスタムコントローラの名 前です。 次のクラスは、コントローラ拡張の単純な例です。 public class myControllerExtension { private final Account acct; // The extension constructor initializes the private member // variable acct by using the getRecord method from the standard // controller. public myControllerExtension(ApexPages.StandardController stdController) { this.acct = (Account)stdController.getRecord(); } public String getGreeting() { return 'Hello ' + acct.name + ' (' + acct.id + ')'; } } 次の Visualforce マークアップは、上記のコントローラ拡張をページ内で使用する方法を示します。 {!greeting}

拡張は、 コンポーネントの extensions 属性を使用してページに関連付けられます。 すべてのコントローラメソッドと同様に、ページマークアップで {! } 表記を使用して、コントローラ拡張メソッ ドを参照できます。上記の例では、ページ上部の {!greeting} 式は、コントローラ拡張の getGreeting メソッ ドを参照しています。 この拡張は、Account 標準コントローラと共に機能するため、標準コントローラメソッドも利用できます。たと えば、 タグの value 属性は、標準コントローラ機能を使用して取引先の名前を取得しま す。同様に、 タグは、action 属性のある標準 Account の save メソッドを参照します。 カンマ区切りのリストを使って、単一のページに対し複数のコントローラ拡張を定義できます。これにより、同 じ名前のメソッドを上書きできます。たとえば、次のようなページがあったとします。 79 カスタムコントローラおよびコントローラ拡張 カスタムリストコントローラの作成 さらに、次の拡張があったとします。 public class ExtOne { public ExtOne(ApexPages.StandardController acon) { } public String getFoo() { return 'foo-One'; } } public class ExtTwo { public ExtTwo(ApexPages.StandardController acon) { } public String getFoo() { return 'foo-Two'; } } コンポーネントの値は、foo-One として表示されます。上書きは、一番左の拡張、つまり カンマ区切りリストの最初の拡張で定義されているメソッドによって定義されます。したがって、ExtOne の getFoo メソッドは、ExtTwo のメソッドを上書きします。 メモ: 他の Apex クラスと同様に、コントローラ拡張はシステムモードで実行します。したがって、現在 のユーザの資格情報はコントローラのロジックの実行に使用されていないため、ユーザの権限と項目レ ベルのセキュリティは適用されません。ただし、コントローラ拡張が標準コントローラを拡張する場合、 標準コントローラのロジックはシステムモードで実行されません。代わりに、ユーザモードで実行され ます。このモードでは現在のユーザの権限、項目レベルのセキュリティ、共有ルールが適用されます。 クラスの定義で with sharing キーワードを使用することによって、コントローラ拡張でユーザの組織 の共有設定、ロール階層、および共有ルールを適用するかを選択できます。詳細は、Force.com Apex コー ド開発者ガイドの「with sharing または without sharing キーワードの使用」を参照してください。 カスタムリストコントローラの作成 カスタムリストコントローラは、標準リストコントローラと似ています。カスタムリストコントローラには、レ コードセットの表示や操作を行うために定義した Apex ロジックを実装できます。 たとえば、SOQL クエリに基づいて次のカスタムリストコントローラを作成できます。 public class opportunityList2Con { // ApexPages.StandardSetController must be instantiated // for standard list controllers public ApexPages.StandardSetController setCon { get { if(setCon == null) { setCon = new ApexPages.StandardSetController(Database.getQueryLocator( [SELECT Name, CloseDate FROM Opportunity])); } return setCon; } set; } // Initialize setCon and return a list of records public List getOpportunities() { return (List) setCon.getRecords(); } } 80 カスタムコントローラおよびコントローラ拡張 カスタムリストコントローラの作成 メモ: getRecords() によって返される sObject のリストは、不変です。たとえば、それに対して clear() をコールすることはできません。リストに含まれる sObject に変更を適用することはできますが、リスト そのものに項目を追加したり、リストから項目を削除したりすることはできません。 次の Visualforce マークアップは、上記のカスタムコントローラをページ内で使用する方法を示します。 また、SOQL クエリの一部として反結合および準結合を使用するカスタムリストコントローラを作成することも できます。次のコードは、標準取引先コントローラの拡張として実装されます。 public with sharing class AccountPagination { private final Account acct; // The constructor passes in the standard controller defined // in the markup below public AccountPagination(ApexPages.StandardSetController controller) { this.acct = (Account)controller.getRecord(); } public ApexPages.StandardSetController accountRecords { get { if(accountRecords == null) { accountRecords = new ApexPages.StandardSetController( Database.getQueryLocator([SELECT Name FROM Account WHERE Id NOT IN (SELECT AccountId FROM Opportunity WHERE IsClosed = true)])); } return accountRecords; } private set; } public List getAccountPagination() { return (List) accountRecords.getRecords(); } } これらのレコードを表示するページでは、標準リストコントローラアクションを組み合わせて使用しますが、カ スタムリストコントローラから返されるレコードの反復処理に基づいています。 {!acct.name} Previous Next 81 コントローラメソッド Visualforce マークアップは、次の種別のコントローラ拡張とカスタムコントローラメソッドを使用できます。 • • • action getter setter action メソッド action メソッドは、ユーザがボタンをクリックしたり、ページ内のある領域にマウスポインタを移動したりする などのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメータに {! } 表記を使用することによって、ページマークアップから action メソッドをコールでき ます。 • はアクションをコールするボタンを作成する • はアクションをコールするリンクを作成する • は定期的にアクションをコールする • は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) • を作成し、アクションをコールする は、アクションをコールする新しい JavaScript 関数を定義する • はページが読み込まれると、アクションをコールする たとえば、カスタムコントローラの作成 (ページ 77)のサンプルページでは、 タグの action パラメータによって、コントローラの save メソッドがコールされます。その他の action メソッドの例 は、「action メソッドの定義」 (ページ 109)を参照してください。 getter メソッド getter メソッドはコントローラの値を返します。コントローラによって計算され、ページに表示される各値には、 boolean 変数など、対応する getter メソッドが含まれる必要があります。たとえば、カスタムコントローラの作成 (ページ 77)のサンプルページでは、コントローラに getAccount メソッドが含まれます。このメソッドによっ て、ページのマークアップは、{! } 表記のあるコントローラクラスの account メンバー変数を参照することが できます。 タグの value パラメータは、この表記を使用して取引先にアクセスし、ドット 表記を使用して取引先の名前を表示します。getter メソッドの名前は、getVa iabe にする必要があります。 重要: getter メソッドを羃等にする、つまり副次的影響がないようにすることがベつ 垂だ ベ 。 カスタムコントローラおよびコントローラ拡張 コントローラメソッド ストの setter メソッドを明示的にはコールしませんが、ユーザがコマンドボタンをクリックすると、doSearch action メソッドの前に setter メソッドが実行されます。 Search Text 次のクラスは、上記のページマークアップに使用するコントローラです。 public class theController { String searchText; List results; public String getSearchText() { return searchText; } public void setSearchText(String s) { searchText = s; } public List getResults() { return results; } public PageReference doSearch() { results = (List)[FIND :searchText RETURNING Lead(Name, Email, Phone)][0]; return null; } } getter メソッドは、コントローラから値にアクセスする場合に必ず必要なメソッドですが、値をコントローラに 渡す場合、必ずしも setter メソッドを含める必要はありません。Visualforce コンポーネントが、コントローラに 保存されている sObject にバインドされている場合、sObject が対応する action メソッドによって保存または更新 されるかぎり、sObject 項目はユーザによって変更されると自動的に設定されます。この動作の例は、カスタム コントローラの作成 (ページ 77)のサンプルページにあります。 setter メソッドの名前は、setVa iabe にする必要があります。 83 カスタムコントローラおよびコントローラ拡張 コントローラメソッド 重要: setter メソッドを羃等にする、つまり副次的影響がないようにすることがベストプラクティスです。 たとえば、変数の増分、ログメッセージの書き込み、データベースへの新規レコードの追加を行わない ようにします。Visualforce では、要求の処理の過程でコールされる可能性のある setter メソッドのコール 順序および回数を定義しません。1 つのページリクエストでの setter メソッドのコール回数に関係なく、 同じ結果を生成するように setter メソッドをデザインしてください。 カスタム拡張またはコントローラを使用したデータの取得と設定 Apex メソッドと変数がコントローラ拡張またはカスタムコントローラによって処理される順序は保証されませ ん。このため、コントローラと拡張クラスは、実行している別のメソッドに依存するのではなく、直接そのメ ソッドをコールする必要があります。これは、変数の設定とデータベースのデータへのアクセスに特に当てはま ります。 たとえば、次のカスタムコントローラの最初のメソッド getContactMethod1 は、contact 変数 c がすでに存在す ることを前提としていないため、正しい値を常に返します。一方、2 つ目のメソッド getContactMethod2 は、 正しい値を返すこともありますが、c がまだ設定されていない場合は正しい値を返すとは限りません。 public class conVsBad { Contact c; public Contact getContactMethod1() { if (c == null) c = [SELECT Id, Name FROM Contact LIMIT 1]; return c; } public Contact getContactMethod2() { return c; } } 次のカスタムコントローラにはまったく同じメソッドがあります。ただし、getContactMethod2 は contactMethod1 をコールするため、変数 c は常に設定され、返されるときには正しい値が常に含まれます。 public class conVsGood { Contact c; public Contact getContactMethod1() { if(c == null) c = [SELECT Id, Name FROM Contact LIMIT 1]; return c; } public Contact getContactMethod2() { return getContactMethod1(); } } 次のマークアップでは、これらのコントローラをコールする 2 つのページを示します。Visualforce マークアップ は同じものであり、コントローラの名前のみが変更されています。 getContactMethod2(): {!contactMethod2.name}
getContactMethod1(): {!contactMethod1.name}
getContactMethod2(): {!contactMethod2.name}
getContactMethod1(): {!contactMethod1.name}
84 カスタムコントローラおよびコントローラ拡張 コントローラクラスのセキュリティ コントローラクラスのセキュリティ 他の Apex クラスと同様、ユーザが自分のプロファイルに基づいてメソッドをカスタムコントローラまたはコン トローラ拡張クラスで実行できるかどうかを指定できます。 メモ: 組織に管理パッケージをインストールした場合、セキュリティの設定は、パッケージ内の global と宣言されている Apex クラス、または webService と宣言されたメソッドを含むクラスに対してのみ設 定できます。 ユーザに「Apex 開発」権限がある場合、そのユーザには、個々のクラスのセキュリティ設定に関係な く、関連する組織のすべての Apex クラスへのアクセス権があります。 Apex クラスに対する権限は、最上位でのみ確認されます。たとえば、クラス A がクラス B を呼び出す場合、ユー ザプロファイルにクラス A へのアクセス権のみがあってクラス B へのアクセス権はなくても、ユーザはクラス A のコードを実行することができます。同様に、Visualforce ページでカスタムコンポーネントと関連コントロー ラが併用されている場合は、そのページと関連付けられているコントローラに対してのみセキュリティがチェッ クされます。カスタムコンポーネントと関連付けられているコントローラは、権限に関係なく実行されます。 クラス一覧ページから Apex クラスのセキュリティを設定する手順は、次のとおりです。 1. [設定] で、[開発] > [Apex クラス] をクリックします。 2. 制限するクラス名の横にある [セキュリティ] をクリックします。 3. [選択可能なプロファイル] リストから有効にするプロファイルを選択して [追加] をクリックするか、[有効に されたプロファイル] リストから無効にするプロファイルを選択して [削除] をクリックします。 4. [保存] をクリックします。 クラスの詳細ページから Apex クラスのセキュリティを設定する手順は、次のとおりです。 1. [設定] で、[開発] > [Apex クラス] をクリックします。 2. 制限するクラス名をクリックします。 3. [セキュリティ] をクリックします。 4. [選択可能なプロファイル] リストから有効にするプロファイルを選択して [追加] をクリックするか、[有効に されたプロファイル] リストから無効にするプロファイルを選択して [削除] をクリックします。 5. [保存] をクリックします。 関連リンク Apex および Visualforce 開発のセキュリティのヒント 大量のデータセットを使用した作業 Visualforce カスタムコントローラおよびコントローラ拡張には、Apex ガバナ制限が適用されます。ガバナ制限に ついての詳細は、「実行ガバナと制限について」 (ページ639)を参照してください。また、 および などの Visualforce 反復コンポーネントは、反復を行うコレクションの項目数が最大 1,000 項目に制限されています。 85 カスタムコントローラおよびコントローラ拡張 ページ全体での参照のみモードの設定 Visualforce ページでは、(カスタムレポーティングおよびカスタム分析を行うときなどに) これより大きなデータ のセットの処理または表示が必要になることがありますが、そのデータを変更する必要はありません。Visualforce が開発者のために用意している「参照のみモード」を使用すると、1 つの要求でクエリできる行数の制限を緩和 し、ページ内で反復できるコレクションの項目数に関する制限を引き上げることができます。 参照のみモードは、ページ全体、または特定の制限付きで個別のコンポーネントまたはメソッドに対して指定で きます。 メモ: ページ全体に参照のみモードを指定する場合、大きなデータセットのみを反復処理することができ ます。 関連リンク ページ全体での参照のみモードの設定 コントローラメソッドでの参照のみモードの設定 ページ全体での参照のみモードの設定 ページ全体で参照のみモードを有効にするには、 コンポーネントの readOnly 属性を true に設定 します。 たとえば、次の例は、参照のみモードで処理される単純なページです。

Here is a statistic: {!veryLargeSummaryStat}

このページのコントローラも単純ではありますが、ページに表示する概要統計を計算できる方法を示していま す。 public class SummaryStatsController { public Integer getVeryLargeSummaryStat() { Integer closedOpportunityStats = [SELECT COUNT() FROM Opportunity WHERE Opportunity.IsClosed = true]; return closedOpportunityStats; } } 通常、単一の Visualforce ページ要求のクエリでは 50,000 行を超える行数を取得できないことがあります。参照の みモードでは、この制限が緩和され、最大 1,000,000 行をクエリできます。 readOnly 属性は、より多くの行をクエリできるようにするだけでなく、、 および などのコンポーネントを使用して反復処理できるコレクション内の最大項目数も引き上 げることができます。この制限は、1,000 項目から 10,000 項目に増加しました。次の例は、これを示す単純なコ ントローラとページです。 public class MerchandiseController { public List getAllMerchandise() { List theMerchandise = [SELECT Name, Price__c FROM Merchandise__c LIMIT 10000]; return(theMerchandise); 86 カスタムコントローラおよびコントローラ拡張 コントローラメソッドでの参照のみモードの設定 } }

Here is all the merchandise we have:

Product Price
ページ全体に参照のみモードを使用する Visualforce ページではデータ操作言語 (DML) 操作を使用できませんが、 ページのフォームやその他のユーザインターフェース要素に影響する getter、setter、および action メソッドのコー ル、その他の参照のみクエリの実行などを実行できます。 コントローラメソッドでの参照のみモードの設定 Visualforce コントローラメソッドでは、一部の重要な制限付きで、ページ自体が参照のみモードでなくても Apex ReadOnly アノテーションを使用できます。 @ReadOnly アノテーションを使用した Visualforce コントローラメソッドは、自動的に参照のみモードを使用しま す。ただし、Visualforce コントローラメソッドの @ReadOnly アノテーションの制限のため、参照のみメソッドに も @RemoteAction アノテーションが必要となります。@RemoteAction アノテーションでは、次のメソッドであ ることが必要です。 • global または public • static @ReadOnly アノテーションを使用した参照のみモードの有効化は、トップレベルメソッドのコールで行う必要が あります。トップレベルメソッドのコールに @ReadOnly アノテーションが存在しないと、セカンダリメソッド に @ReadOnly アノテーションが存在する場合でも、クエリされる最大行数に関する通常の制限が要求全体に適 用されます。 コントローラメソッドで @ReadOnly アノテーションを使用すると、Visualforce 式の結果としてレコードの大きな コレクションを取得できます。ただし、反復コンポーネントのコレクションの最大項目数が引き上げられること はありません。より大きな結果のコレクションを反復処理する場合は、ページ全体で参照のみモードを有効にす る必要があります。 関連リンク ページ全体での参照のみモードの設定 カスタムコントローラおよびコントローラ拡張の作成に関する 考慮事項 以下に示すのは、コントローラ拡張およびカスタムコントローラの作成時における考慮事項です。 87 カスタムコントローラおよびコントローラ拡張 • Visualforce ページ内の実行順序 webService として定義されたメソッドがクラスにない限り、カスタム拡張とコントローラクラスおよびコン トローラメソッドは、通常 public として定義されます。クラスに Web サービスメソッドが含まれる場合、 global として定義されている必要があります。 • データベースからデータを返すときは sets、maps、または lists を使用します。こうすることで、コードとデー タベース間の通信回数を削減できるため、コードの効率が高まります。 • Visualforce コントローラ拡張とカスタムコントローラの Apex ガバナ制限は、匿名ブロックまたは WSDL メ ソッドの制限と同じです。ガバナ制限についての詳細は、付録の「実行ガバナと制限について」を参照して ください。 • カスタムコントローラまたはコントローラ拡張を作成する場合、通常はユーザに表示されない機密データが 不注意で公開されないように注意してください。権限を適用するには、クラス定義に with sharing キーワー ドを使用することをお勧めします。また、Web サービスの使用に注意してください。プロファイルによって 最上位のエントリポイントとして確保されていますが、一旦初期化されるとシステムのコンテキストで実行 されます。 • Apex メソッドと変数のインスタンス化の順序は、必ずしも指定されたとおりではありません。詳細は、「カ スタム拡張またはコントローラを使用したデータの取得と設定」 (ページ 84)を参照してください。 • コントローラの「getxxx」メソッドでは、データ操作言語 (DML) の操作を使用できません。たとえば、コン トローラに getName メソッドが含まれている場合、オブジェクトを作成するメソッドで insert または update を使用することはできません。 • コントローラのコンストラクタメソッドでデータ操作言語 (DML) の操作を使用することはできません。 • コントローラ、またはコントローラのコンストラクタでは、「getxxx」または「setxxx」メソッドに @future アノテーションを使用することはできません。 • string 型または integer 型などの Apex のプリミティブデータ型は、値によってコンポーネントのコントローラ に渡されます。 • list や sObject などの Apex の非プリミティブデータ型は、参照によってコンポーネントのコントローラに渡さ れます。つまり、コンポーネントのコントローラによって取引先の名前が変更されると、その変更内容はペー ジのコントローラで使用できるようになります。 • 個人取引先を使用する組織の場合は、次の事項が適用されます。 ◊ カスタムコントローラを使用する取引先レコードの name 項目を コンポーネントを 使用して参照する場合、クエリに isPersonAccount を指定する必要があります。 ◊ 新しい取引先を作成して name を設定すると、レコードは法人取引先になります。新しい取引先を作成し て lastname を設定すると、個人取引先になります。 ◊ ベストプラクティスとして、個人取引先と法人取引先の両方で正しく表示されるカスタム名数式項目を作 成し、Visualforce ページで、標準項目の代わりにその項目を使用します。 ◊ Force.com AppExchange パッケージに Visualforce ページを含める場合は、コントローラまたはコントロー ラ拡張で、個人取引先にのみ存在する項目を明示的に参照することはできません。 Visualforce ページ内の実行順序 ユーザが Visualforce ページを参照すると、ページに関連付けれらたコントローラ、拡張、およびコンポーネント のインスタンスがサーバによって作成されます。これらの要素が実行される順序によって、ユーザに表示される ページの状態が変化することがあります。 Visualforce ページの要素の実行順序を理解するには、はじめに、ページのライフサイクル、つまり、ユーザセッ ションにおいてページがどのように作成されて処分されるのかを理解しておく必要があります。ページのライフ 88 カスタムコントローラおよびコントローラ拡張 Visualforce ページの get 要求の実行順序 サイクルは、ページのコンテンツだけではなく、ページの要求方法によっても決定されます。Visualforce ページ の要求には 2 つの種類があります。 • get 要求 は、ユーザが URL を入力したとき、またはユーザを新しいページに移動するリンクやボタンがクリッ クされたときに発行される最初のページ要求です。 • postback 要求は、[保存] ボタンをクリックし、save アクションをトリガするなど、ユーザの操作によってペー ジの更新が必要になった場合に発行されます。 2 種類の要求の具体的な詳細、ページのライフサイクルを説明した例、および独自のカスタムコントローラおよ びコントローラ拡張を記述するときの実行順序のヒントについては、次を参照してください。 • Visualforce ページの get 要求の実行順序 • Visualforce ページの postback 要求の実行順序 • Visualforce ページの実行順序の例 メモ: Visualforce ページ要求の最大レスポンスサイズは、15 MB 未満である必要があります。 Visualforce ページの get 要求の実行順序 get 要求 は、ユーザが URL を入力したとき、またはユーザを新しいページに移動するリンクやボタンがクリック されたときに発行される最初のページ要求です。次の図は get 要求時の、Visualforce ページとコントローラ拡張 またはカスタムコントローラクラスとのやり取りを示します。 89 カスタムコントローラおよびコントローラ拡張 Visualforce ページの get 要求の実行順序 上の図では、はじめにユーザが URL を入力するか、リンクまたはボタンをクリックするかのいずれかの操作を 行ってページを要求します。この最初のページ要求は get 要求 と呼ばれます。 1. 関連するカスタムコントローラまたはコントローラ拡張クラスのコンストラクタメソッドがコールされ、コ ントローラオブジェクトがインスタンス化されます。 2. ページにカスタムコンポーネントが含まれる場合、そのコンポーネントが作成され、関連するカスタムコン トローラまたはコントローラ拡張のコンストラクタメソッドが実行されます。式を使用して属性がカスタム コンポーネントに設定されている場合、その式はコンストラクタが評価された後に評価されます。 3. ページは、その後、そのページにあるすべてのカスタムコンポーネントのすべての assignTo 属性を実行し ます。assignTo メソッドが実行されると、式が評価され、 コンポーネントの action 属性が 90 カスタムコントローラおよびコントローラ拡張 Visualforce ページの postback 要求の実行順序 評価されます。最後に、プロパティ値を取得または設定するなどのすべての他のメソッドコールが実行され ます。 4. ページに コンポーネントが含まれる場合、ページ要求間でデータベースの状態を維持するため に必要なすべての情報は、暗号化されたビューステートとして保存されます。ビューステートは、ページが 更新されるたびに更新されます。 5. 生成された HTML がブラウザに送信されます。ページに JavaScript などのクライアント側技術が含まれる場 合、ブラウザによって実行されます。 ユーザがページを操作すると、ページは、action、getter、および setter メソッドを実行するための必要に応じて コントローラオブジェクトにアクセスします。 ユーザによって新しい get 要求が発行されると、ビューステートとコントローラオブジェクトは削除されます。 メモ: ユーザは、同じコントローラ、および同じまたは適切なコントローラ拡張のサブセットを使用する ページにリダイレクトされ postback 要求が発行されます。postback 要求が発行されると、ビューステー トが維持されます。 save アクションをトリガする [保存] ボタンをユーザがクリックするなど、ユーザの操作によってページの更新が 必要となる場合、postback 要求 が発行されます。postback 要求の詳細については、Visualforce ページの postback 要 求の実行順序 (ページ 91)を参照してください。 get 要求の具体的な例については、Visualforce ページの実行順序の例 (ページ 93)を参照してください。 Visualforce ページの postback 要求の実行順序 postback 要求は、[保存] ボタンをクリックし、save アクションをトリガするなど、ユーザの操作によってページの 更新が必要になった場合に発行されます。次の図は、postback 要求時の、Visualforce ページとコントローラ拡張 またはカスタムコントローラクラスとのやり取りを示します。 91 カスタムコントローラおよびコントローラ拡張 Visualforce ページの postback 要求の実行順序 1. postback 要求時にビューステートは復号化され、ページの値を更新するための基盤として使用されます。 メモ: immediate 属性が true に設定されたコンポーネントでは、要求のこのフェーズが省略されま す。つまり、アクションは実行されますが、入力に対する検証は実行されず、ページでのデータ変更 は行われません。 2. ビューステートが復号化された後、式が評価され、カスタムコンポーネント用に定義されたコントローラの set メソッドを含む、コントローラとすべてのコントローラ拡張の set メソッドが実行されます。 すべてのメソッドが正常に実行されない限り、これらのメソッドのコールによってデータが更新されること はありません。たとえば、メソッドの 1 つがプロパティを更新し、入力規則や不正なデータ型が原因でその 更新が無効である場合、データは更新されず、ページが再表示されて該当のエラーメッセージが示されます。 92 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例 3. postback 要求をトリガしたアクションが実行されます。アクションが正常に完了すると、データが更新されま す。postback 要求によってユーザが同じページに戻ると、ビューステートが更新されています。 メモ: コンポーネントの action 属性は、postback 要求時には評価されません。get 要求 時にのみ評価されます。 4. 生成された HTML がブラウザに送信されます。 postback 要求でページリダイレクトが指定されており、そのリダイレクト先が、リダイレクト元ページと同じコ ントローラ、およびリダイレクト元ページのコントローラ拡張の正しいサブセットを使用するページである場 合、postback 要求がそのページに対して実行されます。リダイレクト先がそのようなページでない場合、そのペー ジに対して get 要求が実行されます。postback 要求に コンポーネントが含まれる場合、postback 要 求の ID クエリパラメータのみが返されます。 ヒント: pageReference の setRedirect 属性を使用して、postback 要求または get 要求のどちらが実行 されるかを制御できます。setRedirect が true に設定されている場合、get 要求が実行されます。これ を false に設定しても、ターゲットが同じコントローラと正しい拡張のサブセットを使用している場合に のみ postback 要求が実行されるという制限は無視されません。setRedirect を false に設定した場合、 ターゲットがこれらの要件を満たさなければ get 要求が実行されます。 ユーザが別のページにリダイレクトされると、ビューステートとコントローラオブジェクトは削除されます。 postback 要求の具体的な例については、Visualforce ページの実行順序の例 (ページ 93)を参照してください。 Visualforce ページの実行順序の例 次の例では、ユーザが Visualforce ページを操作するときのページのライフサイクルを説明します。例に使用され るページは、取引先に関する情報 (ページの変数の値) を表示し、キー値が false 以外に設定されている場合にユー ザが取引先の詳細を編集できるように設計されています。 この例で使用する Visualforce ページを設定する手順は、次のとおりです。 1. componentController というカスタムコンポーネントのコントローラを作成します。 public class componentController { public String selectedValue { get; set { editMode = (value != null); // Side effect here - don't do this! selectedValue = value; } } public Boolean editMode {get; private set;} } 2. editMode というカスタムコンポーネントを作成します。

Value = {!value}
selectedValue = {!selectedValue}
EditMode = {!EditMode} 93 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例

3. myController というカスタムコントローラを作成します。 public with sharing class myController { private final Account account; public myController() { account = [select id, name, site, NumberOfEmployees, Industry from Account where id = :ApexPages.currentPage().getParameters().get('id')]; } public Account getAccount() { return account; } public PageReference save() { update account; return null; } public PageReference cancel() { return null; } } 4. lifecycle というコントローラ拡張を作成します。 public with sharing class lifecycle { private final Account acct; Integer EmpAdd; public lifecycle(myController controller) { this.acct = (Account)controller.getAccount(); } public String getGreeting() { return acct.name + ' Current Information'; } public void resetEmp() { acct.numberofemployees = 10; update acct; } } 5. setEmps というページを作成します。

94 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例
get 要求の例 1 最初の例では、https://Salesforce_instance/apex/setEmps?id=recordId のフォームの URL を使用して setEmps ページに移動します。URL の Salesforce_instance はインスタンスの名前 (na1 など) で、recordID は組織の取引先レコードの ID (001D000000IRt53 など) です。次のページに似たコンテンツのページが表示され ます。 ライフサイクルを追跡して、なぜページがこのように表示されるのかを確認しましょう。URL を直接入力して ページを要求したため、このページは、postback 要求ではなく、get 要求により生成されています。 1. get 要求では、はじめにカスタムコントローラとコントローラ拡張のコンストラクタメソッドがコールされま す。myController メソッドは、コントローラのコンストラクタで、lifecycle メソッドは、拡張のコンス トラクタです。これらが実行され、2 つのオブジェクトが生成されます。コントローラには account という 変数があります。これは、クエリする取引先オブジェクトを識別するために URL の id パラメータを使用す るクエリによって生成されたものです。拡張には acct という変数があります。これはコントローラの getAccount メソッドをコールして作成されたものです。getAccount メソッドには副次的影響はありませ ん。 95 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例 2. get 要求における次のステップではカスタムコンポーネントが作成され、関連付けられたコントローラまたは コントローラ拡張のコンストラクタメソッドが実行されます。ページには、1 つのカスタムコンポーネントが 含まれます。 このカスタムコンポーネントには、コントローラが関連付けられていますが、このコントローラには明示的 なコンストラクタはありません。明示的なコンストラクタがないすべての Apex オブジェクトと同様に、この オブジェクトは引数をとらない暗黙的な公開コンストラクタを使用して作成されます。カスタムコンポーネ ントの作成の一部として、カスタムコンポーネントの value 属性が設定されます。この場合、式 {!$CurrentPage.parameters.key} の結果と同じなります。URL に key 属性を指定しなかったため、value は null に設定されます。 3. カスタムコンポーネントが作成されたら、カスタムコンポーネントのすべての assignTo 属性が実行されま す。assignTo 属性は、その値を関連付けられたカスタムコンポーネントコントローラのクラス変数に割り当 てる setter メソッドです。editMode カスタムコンポーネントには、assignTo メソッドがあるため、これが 実行されます。assignTo メソッドは、属性の selectedValue を value 属性に設定します。value 属性は null に設定されるため、selectedValue も null に設定されます。 4. get 要求における次のステップでは、 コンポーネントの action 属性、式、および必要な getter メソッドと setter メソッドが評価されます。以下でこれらの手順を順に行いますが、これらの評価の順序は不 確定であり、次に示す順序とは異なる場合があります。 • コンポーネントには、拡張の resetEmp メソッドをコールする action 属性があります。そ のメソッドは、acct オブジェクトの numberofemployees 項目を 10 に設定します。 • ページで評価する式は複数あります。次の 3 つに絞って説明します。 ◊ の title 属性は、ライフサイクル拡張 getGreeting の getter メソッドをコールし ます。これは、「Global Media の最新情報」としてページに表示されます。 ◊ の rendered 属性は、key パラメータの値に基づいて設定されます。ページをコールす るときに key を設定しなかったため、フォームは表示されません。 ◊ Value = {!value}
selectedValue = {!selectedValue}
EditMode = {!EditMode} この式は、カスタムコンポーネントに現れます。value と selectedValue は null に設定されることは 前に説明しましたが、EditMode の値はまだ不明です。EditMode は、componentController の boolean 変数です。value が null であるかどうかに基づいて設定されます。 set { selectedValue = value; // Side effect here - don't do this! editMode = (value != null); } value は null であるため、EditMode は false に設定されます。ただし、EditMode の setter メソッド には副次的影響があります。editMode を設定する作業の一部として、selectedValue を value に設 定しました。value は null であるため、これによる変更はありませんが、この動作によって後の例に 影響が出ます。 • 他の式とメソッドが同様に評価されます。 5. コンポーネントは表示されないため、ビューステートは作成されません。 96 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例 6. get 要求の最後のステップは、HTML をブラウザに送信して、その HTML を表示させることです。 get 要求の例 2 2 つ目の例では、フォーム https://Salesforce_instance/apex/setEmps?id=recordId&key=false の URL を使用して、setEmps ページに移動します。Salesforce_instance はインスタンスの名前 (na1 など) で、 recordID は組織の取引先レコードの ID (001D000000IRt53 など) です。最初の例とは異なり、この例には key=false という 2 つ目のパラメータが含まれます。次のページに似たコンテンツのページが表示されます。 もう一度ライフサイクルを追跡しましょう。このページも、get 要求の結果生成されるページです。 1. get 要求では、はじめにカスタムコントローラとコントローラ拡張のコンストラクタメソッドがコールされま す。myController メソッドは、コントローラのコンストラクタで、lifecycle メソッドは、拡張のコンス トラクタです。これらが実行されて、2 つのオブジェクトが生成されています。コントローラには account という変数があり、これは、クエリする取引先レコードを識別するために URL から得る id パラメータを使 用するクエリによって生成されたものです。拡張には acct という変数があります。これはコントローラの getAccount メソッドをコールして作成されたものです。 2. get 要求における次のステップではカスタムコンポーネントが作成され、関連付けられたコントローラまたは コントローラ拡張のコンストラクタメソッドが実行されます。ページには、1 つのカスタムコンポーネントが 含まれます。 このカスタムコンポーネントにはコンストラクタのない関連コントローラがあるため、コントローラオブジェ クトは、引数をとらない暗黙的な公開コンストラクタを使用して作成されます。カスタムコンポーネントの 作成の一部として、カスタムコンポーネントの value 属性が設定されます。この場合、式 {!$CurrentPage.parameters.key} の結果と同じなります。key 属性を false に指定したため、value は false に設定されます。 3. カスタムコンポーネントが作成されたら、カスタムコンポーネントのすべての assignTo 属性が実行されま す。assignTo メソッドは、属性の selectedValue を value 属性に設定します。value 属性は false に設定 されるため、selectedValue は false に設定されます。 4. get 要求における次のステップでは、 コンポーネントの action 属性、式、および必要な getter メソッドと setter メソッドが評価されます。以下でこれらの手順を順に行いますが、これらの評価の順序は不 確定であり、次に示す順序とは異なる場合があります。 • コンポーネントには、拡張の resetEmp メソッドをコールする action 属性があります。そ のメソッドは、acct オブジェクトの numberofemployees 項目を 10 に設定します。 • ページの式のうち、ここで選択した 3 つの式が評価される方法を確認しましょう。 の title 属性は、ライフサイクル拡張 getGreeting の getter メソッドをコール します。これは、「Global Media の最新情報」としてページに表示されます。 97 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例 の rendered 属性は、key パラメータの値に基づいて設定されます。ページをコールす るときに key を false に設定したため、フォームは表示されません。 Value = {!value}
selectedValue = {!selectedValue}
EditMode = {!EditMode} この式は、カスタムコンポーネントに現れます。value が null ではないため、EditMode は true に 設定されます。この時点で、selectedValue は null に設定されます。ただし、EditMode の setter メ ソッドには副次的影響があります。この場合、副次的影響によって、selectedValue は、カスタム コンポーネントの value 属性に設定されます。value は false に設定されているため、selectedValue は false に設定されます。このことから、メソッドで副次的影響を使用すべきでないことの理由がわ かります。評価順序が異なり、EditMode の setter が評価される前に selectedValue の値が決定され る場合でも、selectedValue は null になります。実行順序は保証されないため、selectedValue の 結果は、このページに次回アクセスしたときに変化する可能性があります。 警告: getter または setter に副次的影響を使用しないでください。 5. コンポーネントは表示されないため、ビューステートは作成されません。 6. get 要求の最後のステップは、HTML をブラウザに送信して、その HTML を表示させることです。 get 要求の例 3 3 つ目の例では、https://Salesforce_instance/apex/setEmps?id=recordId&key=true フォームの URL を 使用して setEmps ページに移動します。Salesforce_instance はインスタンスの名前 (na1 など) で、recordID は組織の取引先レコードの ID (001D000000IRt53 など) です。2 つ目の例とは異なり、この例では key=true が 設定されます。次のページに似たコンテンツのページが表示されます。 もう一度 get 要求のライフサイクルを追跡しましょう。 1. get 要求では、はじめにカスタムコントローラとコントローラ拡張のコンストラクタメソッドがコールされま す。myController メソッドは、コントローラのコンストラクタで、lifecycle メソッドは、拡張のコンス トラクタです。これらが実行されて、2 つのオブジェクトが生成されています。コントローラには account という変数があり、これは、クエリする取引先レコードを識別するために URL から得る id パラメータを使 用するクエリによって生成されたものです。拡張には acct という変数があります。これはコントローラの getAccount メソッドをコールして作成されたものです。 98 カスタムコントローラおよびコントローラ拡張 Visualforce ページの実行順序の例 2. get 要求における次のステップではカスタムコンポーネントが作成され、関連付けられたコントローラまたは コントローラ拡張のコンストラクタメソッドが実行されます。ページには、1 つのカスタムコンポーネントが 含まれます。 このカスタムコンポーネントにはコンストラクタのない関連コントローラがあるため、コントローラオブジェ クトは、引数をとらない暗黙的な公開コンストラクタを使用して作成されます。カスタムコンポーネントの 作成の一部として、カスタムコンポーネントの value 属性が設定されます。この場合、式 {!$CurrentPage.parameters.key} の結果と同じなります。key 属性を true に指定したため、value は true に設定されます。 3. カスタムコンポーネントが作成されたら、カスタムコンポーネントのすべての assignTo 属性が実行されま す。assignTo メソッドは、属性の selectedValue を value 属性に設定します。value 属性は true に設定さ れるため、selectedValue は true に設定されます。 4. get 要求における次のステップでは、 コンポーネントの action 属性、式、および必要な getter メソッドと setter メソッドが評価されます。以下でこれらの手順を順に行いますが、これらの評価の順序は不 確定であり、次に示す順序とは異なる場合があります。 • コンポーネントには、拡張の resetEmp メソッドをコールする action 属性があります。そ のメソッドは、acct オブジェクトの numberofemployees 項目を 10 に設定します。 • ページの式のうち、ここで選択した 3 つの式が評価される方法を確認しましょう。 の title 属性は、ライフサイクル拡張 getGreeting の getter メソッドをコール します。これは、「Global Media の最新情報」としてページに表示されます。 の rendered 属性は、key パラメータの値に基づいて設定されます。ページをコール するときに key を true に設定したため、フォームが表示されます。 Value = {!value}
selectedValue = {!selectedValue}
EditMode = {!EditMode} この式は、カスタムコンポーネントに現れます。value が null ではないため、EditMode は true に 設定されます。以前の例と同様に、selectedValue は null に設定されます。EditMode の setter メ ソッドの副次的影響によって、selectedValue は true に設定されます。 5. コンポーネントが表示されるため、ビューステートが作成されます。 6. get 要求の最後のステップは、HTML をブラウザに送信して、その HTML を表示させることです。 postback 要求の例 最初の 2 つの例とは異なり、3 つ目の例では、編集可能項目のクリック可能なボタンと共に最終ページが表示さ れました。postback 要求がどのように機能するかを理解するために、例 3 の最終ページを使用して、取引先名を 「Pan Galactic Media」、従業員数を「42」、および業種を「その他」に変更します。その後 [保存] をクリックし ます。これにより、postback 要求が開始されます。 1. postback 要求では、はじめにビューステートが復号化されます。ビューステートには、ページを表示するため に必要な情報がすべて含まれます。postback 要求中に操作が失敗した場合、ページをユーザに表示するために ビューステートが使用されます。 2. 次に、すべての式が評価され、コントローラとコントローラ拡張のメソッドが実行されます。 ページの式のうち、ここで選択した 3 つの式が評価される方法を確認しましょう。 99 カスタムコントローラおよびコントローラ拡張 カスタムコントローラおよびコントローラ拡張のテスト の title 属性は、ライフサイクル拡張 getGreeting の getter メソッドをコールし ます。この編集では、取引先名の値を変更しました。したがって、greeting の値は、「Pan Galactic Media の最新情報」に変更されます。 の rendered 属性は、key パラメータの値に基づいて設定されます。key パラメータを変 更していないため、ビューステートの値が使用されます。ビューステートが作成されたときの値は true であったため、この値は true のままであり、フォームが表示されます。 Value = {!value}
selectedValue = {!selectedValue}
EditMode = {!EditMode} これらの値を変更していないため、各式について、ビューステートの値が使用されます。 3. 最後に、postback 要求をトリガした save アクションが評価されます。save アクションは、コントローラの次の メソッドです。 public PageReference save() { update account; return null; } このメソッドによって、レコードは新しいデータで更新されます。このメソッドが失敗する場合 (ユーザにレ コードを更新する権限がない場合、または変更によってトリガされる入力規則がある場合)、エラーメッセー ジとそのエラーの説明と共にページが表示されます。ユーザが入力した値は失われません。これらの値は、 ユーザが [保存] ボタンをクリックしたときの状態に維持されます。エラーが発生しなかった場合、オブジェ クトのデータは更新され、ビューステートが更新されます。また、postback 要求をトリガしたアクションに ページのリダイレクトが含まれていなかったため、ビューステートが更新されます。生成された HTML がブ ラウザに送信されます。 関連リンク 開発モードフッターの使用 カスタムコントローラおよびコントローラ拡張のテスト すべての Apex スクリプトなど、コントローラ拡張やカスタムコントローラに対し、単体テストを実施する必要 があります。単体テストは、コード内の特定の部分が正しく機能していることを確認するクラスメソッドです。 100 カスタムコントローラおよびコントローラ拡張 カスタムコントローラおよびコントローラ拡張のテスト 単体テストのメソッドは引数を取らず、データベースへのデータの送信を行うこともなく、メソッド定義に testMethod キーワードのフラグが立てられます。 コントローラ拡張およびカスタムコントローラクラスの単体テストを記述するときに、テストで使用できるクエ リパラメータを設定できます。たとえば、次のカスタムコントローラとマークアップはコントローラメソッド (ページ 82)の例に基づいていますが、ページの URL にクエリパラメータ ?qp=yyyy が指定されていることを要 求するように拡張されています。次のテストメソッドクラスは、このページの機能を実行します。 public class thecontroller { private private private private private String String String String String firstName; lastName; company; email; qp; public thecontroller() { this.qp = ApexPages.currentPage().getParameters().get('qp'); } public String getFirstName() { return this.firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return this.lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getCompany() { return this.company; } public void setCompany(String company) { this.company = company; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public PageReference save() { PageReference p = null; if (this.qp == null || !'yyyy'.equals(this.qp)) { p = Page.failure; p.getParameters().put('error', 'noParam'); } else { try { Lead newlead = new Lead(LastName=this.lastName, FirstName=this.firstName, Company=this.company, Email=this.email); insert newlead; } catch (Exception e) { p = Page.failure; 101 カスタムコントローラおよびコントローラ拡張 カスタムコントローラおよびコントローラ拡張のテスト p.getParameters().put('error', 'noInsert'); } } if (p == null) { p = Page.success; } p.setRedirect(true); return p; } } コントローラは、成功ページと失敗ページの 2 つのページをコールします。この例では、これらのページのテキ ストは重要ではありません。ただし、テキストが存在することは必要です。 次のマークアップでは、上記のコントローラを使用しています。

Test page for adding leads

This is a test page for adding leads.

First name:

Last name:

Company:

Email address:

次のクラスは、コントローラをテストします。 @isTest public class thecontrollerTests { public static testMethod void testMyController() { PageReference pageRef = Page.success; Test.setCurrentPage(pageRef); thecontroller controller = new thecontroller(); String nextPage = controller.save().getUrl(); // Verify that page fails without parameters System.assertEquals('/apex/failure?error=noParam', nextPage); // Add parameters to page URL ApexPages.currentPage().getParameters().put('qp', 'yyyy'); // Instantiate a new controller with all parameters in the page controller = new thecontroller(); controller.setLastName('lastname'); controller.setFirstName('firstname'); controller.setCompany('acme'); controller.setEmail('firstlast@acme.com'); nextPage = controller.save().getUrl(); // Verify that the success page displays System.assertEquals('/apex/success', nextPage); Lead[] leads = [select id, email from lead where Company = 'acme']; System.assertEquals('firstlast@acme.com', leads[0].email); } } 102 カスタムコントローラおよびコントローラ拡張 入力規則とカスタムコントローラ ヒント: コントローラをテストするときに、次のエラーメッセージが表示される場合があります。 Method does not exist or incorrect signature: Test.setCurrentPage(System.PageReference) このメッセージが表示される場合、Test というクラスを作成しているかを確認してください。作成して いる場合は、そのクラスの名前を変更します。 入力規則とカスタムコントローラ カスタムコントローラを使用する Visualforce ページにユーザがデータを入力し、そのデータが入力規則エラーに なった場合、エラーが Visualforce ページに表示されることがあります。標準コントローラを使用するページと同 様に、入力規則エラーの場所が コンポーネントに関連付けられた項目の場合、エラーはそ こに表示されます。入力規則エラーの場所がページ上部に設定されている場合は、 内の コンポーネントを使用してエラーを表示します。ただし、ページに情報を取得するには、カ スタムコントローラが例外をキャッチする必要があります。 たとえば、次のページがあるとします。 This is your new page for the {!name} controller.
You are viewing the {!account.name} account.

Change Account Name:

Change Number of Locations:

(Try entering a non-numeric character here, then hit save.)



メモ: このページを表示するには、有効な取引先レコードの ID が URL のクエリパラメータとして指定 されている必要があります。たとえば、 http://na3.salesforce.com/apex/myValidationPage?id=001x000xxx3Jsxb です。 次のようなカスタムコントローラを記述する必要があります。 public class MyController { Account account; public PageReference save() { try{ update account; } catch(DmlException ex){ ApexPages.addMessages(ex); } return null; } public String getName() { return 'MyController'; } 103 カスタムコントローラおよびコントローラ拡張 transient キーワードの使用 public Account getAccount() { if(account == null) account = [select id, name, numberoflocations__c from Account where id = :ApexPages.currentPage().getParameters().get('id')]; return account; } } ユーザがページを保存したときに、入力エラーがトリガされると、標準コントローラの場合と同様に、例外が キャッチされ、ページに表示されます。 transient キーワードの使用 transient キーワードは、保存ができず、Visualforce ページのビューステートの一部として送信することもでき ないインスタンス変数の宣言に使用します。次に例を示します。 Transient Integer currentTotal; また、逐次化可能な Apex クラス (つまり、コントローラ、コントローラ拡張、Batchable または Schedulable インターフェースを実装するクラス) で transient キーワードを使用できます。また、逐次化可能なクラスで宣 言する項目の型を定義するクラスで transient を使用できます。 変数を transient として宣言すると、ビューステートのサイズが縮小されます。transient キーワードは、 Visualforce ページでページ要求の間のみ必要な項目でよく使用されます。この項目は、ページのビューステート には含まれず、要求中に何度も再計算するには非常に大きなシステムリソースを使用します。 Apex オブジェクトの中には、自動的に transient と判断されるものもあります。つまり、その値はページのビュー ステートの一部として保存されません。例として次のようなオブジェクトがあります。 • • PageReferences • コレクションが自動的に transient とマーキングされるのは、Savepoints のコレクションなど、コレクションに 含まれているオブジェクトが自動的に transient とマーキングされている場合だけです。 • Schema.getGlobalDescribe などほとんどのオブジェクトがシステムメソッドにより自動的に生成されま XmlStream クラス す。 • JSONParser クラスインスタンス。 また、静的な変数はページのビューステートを使用して転送されません。 次の例には、Visualforce ページとカスタムコントローラの両方が含まれてます。ページが更新されるごとに transient 日付は再作成されるため、[refresh] ボタンをクリックすると、日付が更新されます。非 transient 日付には、ビュー ステートから逐次化されなかった元の値が保持されるため、変わりません。 T1: {!t1}
T2: {!t2}
public class ExampleController { DateTime t1; 104 カスタムコントローラおよびコントローラ拡張 transient キーワードの使用 transient DateTime t2; public String getT1() { if (t1 == null) t1 = System.now(); return '' + t1; } public String getT2() { if (t2 == null) t2 = System.now(); return '' + t2; } } 105 第8章 高度な例 クイックスタートチュートリアルの例は、入門レベルの例として、Visualforce マークアップのみを主に使用して います。高度な例では、Visualforce マークアップのほか、Force.com Apex コードが使用されています。 初めてのカスタムコントローラの作成 これまで、このチュートリアルのすべての例では、標準取引先コントローラを使用して各ページの基盤のロジッ クを定義してきました。Visualforce では、カスタムコントローラを定義して独自のロジックやナビゲーションコ ントロールをページに追加できます。次のトピックでは、カスタムコントローラクラスを作成したり、Visualforce マークアップとやり取りできるクラスメソッドを定義したりするための基本を説明しています。 • カスタムコントローラクラスの作成 • getter メソッドの定義 • action メソッドの定義 • navigation メソッドの定義 • カスタムリストコントローラによるレコードの一括更新 メモ: Salesforce ユーザインターフェースを使用した Apex の追加、編集、または削除は、Developer Edition を使用している組織、Salesforce Enterprise Edition トライアル版を使用している組織、または Sandbox を 使用している組織でのみ行えます。Salesforce の本番組織では、Force.com 移行ツール または Force.com API compileAndTest コールのいずれかを使用してのみ Apex に変更を加えることができます。 カスタムコントローラクラスの作成 カスタムコントローラは、要するに Apex クラスです。たとえば、次のコードは非効率的ですが、有効なコント ローラクラスです。 public class MyController { } コントローラクラスを作成して次の 2 つの方法でページに追加できます。 • コントローラ属性をページに追加し、「クイック修正」を使用して、コントローラクラスをその場で作成し ます。 106 高度な例 getter メソッドの定義 1. ページエディタで、コントローラ属性を タグに追加します。次に例を示します。 This is your new page. 2. クイック修正オプションを使用して、MyController という新しい Apex クラスを自動的に作成します。 • 任意の Apex エディタでコントローラクラスを作成して保存し、ページで参照します。 1. アプリケーションで、[設定] の [開発] > [Apex クラス] をクリックし、[新規] をクリックして新しいクラス を作成します。 2. ページに戻り、上記の例で説明されているとおりに、 タグに controller 属性を追加しま す。 メモ: ページは、一度に 1 つのコントローラのみを参照できます。 タグで standardController 属性と controller 属性の両方を使用することはできません。 有効なカスタムコントローラを参照するページを保存するとただちに、ページエディタの横に 2 つ目の [コント ローラ] エディタタブが表示されます。このエディタでは、ページマークアップとページのロジックを定義する Apex とを切り替えることができます。 図 17 : カスタムコントローラエディタ getter メソッドの定義 Visualforce コントローラクラスに関する主要なタスクの 1 つに、データベースや他の計算値をページマークアッ プに表示する方法を開発者に提供するというタスクがあります。この種の機能を有効にするメソッドは getter メ ソッドと呼ばれ、一般的に getIde ifie と名づけられています。Identifier は、メソッドが返すレコードや プリミティブ値の名前です。 107 高度な例 getter メソッドの定義 たとえば、次のコントローラには、コントローラの名前を文字列として返すための getter メソッドがあります。 public class MyController { public String getName() { return 'MyController'; } } getter メソッドの結果をページに表示するには、get プレフィックスを使用しない getter メソッドの名前を式で 使用します。たとえば、getName メソッドの結果をページマークアップに表示するには、{!name} を使用しま す。 This is your new page for the {!name} controller. 標準取引先コントローラを使用した前述の例では、ページには、{!account.} 式を使用して (id ク エリ文字列パラメータを使用した) URL に指定された、取引先レコードの値が表示されました。これは、標準取 引先コントローラに、指定された取引先レコードを返す getAccount という getter メソッドが含まれるため実行 できました。次のコードを使用して、カスタムコントローラでこの機能を模倣することができます。 public class MyController { public String getName() { return 'MyController'; } public Account getAccount() { return [select id, name from Account where id = :ApexPages.currentPage().getParameters().get('id')]; } } メモ: この例が正しく機能するためには、Visualforce ページを URL の有効な取引先レコードに関連付ける必要 があります。たとえば、001D000000IRt53 が取引先 ID の場合、次の URL を使用します。 https://Sae f ce_i a ce/apex/MyFirstPage?id=001D000000IRt53 getAccount メソッドは、埋め込み SOQL クエリを使用して、ページの URL の id パラメータで指定した取引 先を返します。id にアクセスするために、getAccount メソッドは次のように ApexPages 名前空間を使用しま す。 • まず、currentPage メソッドが現在のページの PageReference インスタンスを返します。PageReference は、クエリ文字列パラメータなど、Visualforce ページへの参照を返します。 • ページ参照に基づいて、getParameters メソッドを使用して、指定されたクエリ文字列パラメータの名前と 値の対応付けを返します。 • 次に、id を指定する get メソッドのコールにより、id パラメータ自体の値を返します。 108 高度な例 action メソッドの定義 MyController コントローラを使用するページは、{!account.name} または {!account.id} 式を使用して、それ ぞれ name または id 項目のいずれかを表示できます。コントローラの SOQL クエリによって返される項目はこ れらの項目のみであるため、ページではこれらの項目のみを使用することができます。 標準取引先コントローラをさらに緻密に模倣するには、 タグに tabStyle 属性を追加して他の取 引先ページと同じスタイルをページに適用できます。ページのマークアップは、次のようになります。 This is your new page for the {!name} controller.
You are viewing the {!account.name} account.
図 18 : カスタムコントローラを使用してページで値を表示する action メソッドの定義 action メソッドは、ユーザがボタンをクリックしたり、ページ内のある領域にマウスポインタを移動したりする などのページイベントが発生すると、ロジックまたはナビゲーションを実行します。次のいずれかのタグの action パラメータに {! } 表記を使用することによって、ページマークアップから action メソッドをコールでき ます。 • はアクションをコールするボタンを作成する • はアクションをコールするリンクを作成する • は定期的にアクションをコールする • は、別の名前つきのコンポーネントにイベント (「onclick」、「onmouseover」など) を作成し、アクションをコールする • は、アクションをコールする新しい JavaScript 関数を定義する • はページが読み込まれると、アクションをコールする 109 高度な例 action メソッドの定義 たとえば、「ページでの入力コンポーネントの使用」 (ページ 27)で説明されているサンプルページでは、コマ ンドボタンは、標準取引先コントローラの save メソッドにバインドされています。MyController カスタムコン トローラを使用するように、前の例を適応させることができます。 You are viewing the {!account.name} account.

Change Account Name:

メモ: このページに取引先データを表示するには、有効な取引先レコードの ID をページの URL のクエ リパラメータとして指定する必要があります。次に例を示します。 https://Sae f ce_i a ce/apex/myPage?id=001x000xxx3Jsxb レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 上記のページを保存すると、Visualforce エディタで「クイック修正」オプションを使用して、MyController クラ スに save メソッドを追加できます。クイック修正リンクをクリックすると、MyController は次のようになりま す。 public class MyController { public PageReference save() { return null; } public String getName() { return 'MyController'; } public Account getAccount() { return [select id, name from Account where id = :ApexPages.currentPage().getParameters().get('id')]; } } クイック修正によって生成される save メソッドは、action メソッドに使用する標準署名を使用します。これは public であり、PageReferemce を返し、引数を含みません。 最終的に、save メソッドの定義は、新しい取引先値を使用してデータベースを更新する必要がありますが、ま ずその前にメンバー変数を定義して、データベースから取得される取引先情報を保存する必要があります。取引 先のメンバー変数がない場合、データベースから取得されるレコードは、その値がページを表示するために使用 された後で保持されないため、ユーザによるレコード更新は保存できません。このメンバー変数を導入するに は、コントローラコードの 2 つの部分を変更する必要があります。 • メンバー変数をクラスに追加する • getAccount が最初のクエリを実行するときにメンバー変数を設定する public class MyController { Account account; 110 高度な例 navigation メソッドの定義 public PageReference save() { return null; } public String getName() { return 'MyController'; } public Account getAccount() { if(account == null) account = [select id, name, site from Account where id = :ApexPages.currentPage().getParameters().get('id')]; return account; } } メンバー変数が適切に配置されたため、save メソッドで行う必要があることはデータベースの更新だけです。 public class MyController { Account account; public PageReference save() { update account; return null; } public String getName() { return 'MyController'; } public Account getAccount() { if(account == null) account = [select id, name, site from Account where id = :ApexPages.currentPage().getParameters().get('id')]; return account; } } save に対するより堅牢なソリューションとしては、さまざまな例外の検出や重複の検索などを行うことが考え られます。ここでは単純な例を示すことを目的としているため、そのような詳細は省略しています。 このページをテストするために、[取引先名を変更] 項目の値を変更して、[新規取引先名を保存] をクリックしま す。標準取引先コントローラの例と同様に、ページは単に新しい取引先名で更新されます。次の例では、save ア クションを拡張して、現在のページを更新する代わりにユーザを別の確認ページに移動します。 メモ: ページが正しく表示されるように、URL に有効な取引先 ID を指定する必要があります。たとえば、 001D000000HRgU6 が取引先 ID である場合、次の URL を使用します。 https://Sae f ce_i a ce/apex/MyFirstPage?id=001D000000HRgU6 navigation メソッドの定義 カスタムコントローラの action メソッドは、データベース更新および他の計算を実行するほか、PageReference オ ブジェクトを返して、ユーザを別のページに移動することができます。 111 高度な例 navigation メソッドの定義 PageReference は、ページのインスタンス化への参照です。多数の属性の 1 つである PageReferences は URL、一 連のクエリパラメータ名および値で構成されます。 カスタムコントローラまたはコントローラ拡張では、次のいずれかの方法で、PageReference を参照またはインス タンス化できます。 • Page.e i i gPageNa e 組織ですでに保存している Visualforce ページの PageReference を参照します。このプラットフォームはこのよ うにページを参照することで、コントローラまたはコントローラ拡張が指定されたページの有無に依存する ことを認識し、コントローラまたは拡張が存在する間はページが削除されないようにします。 • PageReference pageRef = new PageReference(' a iaURL'); Force.com プラットフォームでホストされる任意のページに PageReference を作成します。たとえ ば、'partialURL' を '/apex/HelloWorld' に設定すると、http://mySalesforceInstance/apex/HelloWorld にある Visualforce ページを参照します。同様に、' a iaURL' を '/' + ' ec dID' に設定すると、指定 したレコードの詳細ページを参照します。 この構文は、PageReference はコンパイル時ではなく、実行時に構成されるため、Page.e i i gPageNa e の ページ以外の Visualforce ページの参照にはお推めしません。実行時の参照は、参照整合性システムには使用 できません。したがって、プラットフォームはこのコントローラまたはコントローラ拡張機能が指定された ページの有無に依存することを認識しないため、ユーザによるページの削除を防ぐためにエラーメッセージ を表示しません。 • PageReference pageRef = new PageReference('f URL'); 外部 URL の PageReference を作成します。次に例を示します。 PageReference pageRef = new PageReference('http://www.google.com'); この例では、ユーザが [保存] をクリックした後に、そのユーザを新しい URL にリダイレクトすることを想定し ます。これを行うには、まず次の URL に移動し、クイック修正を使用して mySecondPage という 2つ目のページ を作成します。 https://Sae f ce_i a ce/apex/mySecondPage それから、mySecondPage に次のマークアップを追加します。簡略化のために、チュートリアルの最初の方で定 義した次の標準コントローラベースのページを使用します。 Hello {!$User.FirstName}!

You are viewing the {!account.name} account.

ここで、action メソッドの定義 (ページ 109)で作成した元のページに戻り、取引先 id クエリパラメータを URL に指定していることを確認します。新しく作成した「mySecondPage」ページに PageReference を返すように、コ ントローラの save メソッドを編集します。 public class MyController { Account account; public PageReference save() { 112 高度な例 ウィザードの作成 update account; PageReference secondPage = Page.mySecondPage; secondPage.setRedirect(true); return secondPage; } public String getName() { return 'MyController'; } public Account getAccount() { if(account == null) account = [select id, name, site from Account where id = :ApexPages.currentPage().getParameters().get('id')]; return account; } } 上記のコードでは、PageReference の redirect 属性は true に設定されています。この属性が設定されていない場 合、PageReference はブラウザに返されますが、移動は発生せず、元のページの URL のままになります。移動先 の URL を変更する場合は、redirect 属性を設定する必要があります。 ここでページをテストする場合、[新規取引先名を保存] をクリックすると mySecondPage に移動しますが、デー タのコンテキストは失われるため、{!account.name} で使用できる値はありません。これは、リダイレクトが 発生したときにコントローラがコンテキストの状態をクリアするからです。そのため、PageReference のパラメー タの対応付けで id クエリ文字列パラメータをリセットする必要があります。 public class MyUpdatedController { Account account; public PageReference save() { update account; PageReference secondPage = Page.mySecondPage; secondPage.setRedirect(true); secondPage.getParameters().put('id',account.id); return secondPage; } public String getName() { return 'MyController'; } public Account getAccount() { if(account == null) account = [select id, name, site from Account where id = :ApexPages.currentPage().getParameters().get('id')]; return account; } } ウィザードの作成 ここまで Visualforce マークアップとコントローラの重要な機能について説明してきましたが、この最後の例で は、こうした機能を一緒に使用して 3 ステップから成るカスタムウィザードを作成する方法を説明します。この ウィザードでは、次のようにユーザが商談と同時に、関連する取引先責任者、取引先、および取引先責任者の ロールを作成できます。 • ステップ 1: 取引先と取引先責任者に関連する情報を収集する • ステップ 2: 商談に関連する情報を収集する 113 高度な例 • 商談ウィザードコントローラ ステップ 3: 作成されるレコードを表示し、ユーザが保存またはキャンセルできるようにする このウィザードを実装するには、ウィザードの 3 つのステップのそれぞれに対応する 3 ページと、各ページ間の ナビゲーションの設定とユーザが入力したデータの追跡を行う 1 つのカスタムコントローラを定義します。 重要: 複数の Visualforce ページにまたがって使用されるデータは、最初のページでデータを使用しない場 合でも、最初のページ内で定義する必要があります。たとえば、項目が 3 ステッププロセスの 2 ページ 目と 3 ページ目で必要な場合、1 ページ目にもその項目が含まれている必要があります。項目の rendered 属性を false に設定することで、この項目をユーザに非表示にすることもできます。 これらの各コンポーネントのコードは、下記のセクションに含まれていますが、3 つのページはそれぞれコント ローラを参照し、コントローラは 3 つのページをそれぞれ参照するため、まずその最適な作成手順を理解する必 要があります。やっかいなことは、ページがないとコントローラを作成できませんが、コントローラでページを 参照するにはページが存在している必要があるということです。 この問題を解決するには、最初に完全に空のページを定義し、次にコントローラを作成してから、マークアップ をページに追加します。したがって、ウィザードページとコントローラを作成する最適な手順は次のようになり ます。 1. 1 ページ目の URL https://Sae f ce_i a ce/apex/opptyStep1 に移動し、[Create Page opptyStep1 (ページ opptyStep1 を作成)] をクリックします。 2. ウィザードの他のページである opptyStep2 と opptyStep3 についても、上記のステップを繰り返します。 3. newOpportunityController コントローラを属性としていずれかのページ上の タグに追加し ( など)、次に [Apex controller newOpportunityController (Apex コントローラ newOpportunityController を作成)] をクリックして、コントロー ラを作成します。すべてのコントローラコードを貼り付けて、[Save (保存)] をクリックします。 4. ここで、作成した 4 つのページのエディタに戻り、それらのコードをコピーします。これでウィザードは期 待どおりに機能します。 メモ: 空のページを作成することはできますが、その逆のことはできません。ページがコントローラを参 照するためには、そのコントローラのすべてのメソッドとプロパティが設定されている必要があります。 商談ウィザードコントローラ 次の Apex クラスは、新規顧客商談ウィザードの 3 つのページすべてのコントローラです。 public class newOpportunityController { // These four member variables maintain the state of the wizard. // When users enter data into the wizard, their input is stored // in these variables. Account account; Contact contact; Opportunity opportunity; OpportunityContactRole role; // The next four methods return one of each of the four member // variables. If this is the first time the method is called, // it creates an empty record for the variable. public Account getAccount() { if(account == null) account = new Account(); return account; } 114 高度な例 商談ウィザードコントローラ public Contact getContact() { if(contact == null) contact = new Contact(); return contact; } public Opportunity getOpportunity() { if(opportunity == null) opportunity = new Opportunity(); return opportunity; } public OpportunityContactRole getRole() { if(role == null) role = new OpportunityContactRole(); return role; } // The next three methods control navigation through // the wizard. Each returns a PageReference for one of the three pages // in the wizard. Note that the redirect attribute does not need to // be set on the PageReference because the URL does not need to change // when users move from page to page. public PageReference step1() { return Page.opptyStep1; } public PageReference step2() { return Page.opptyStep2; } public PageReference step3() { return Page.opptyStep3; } // This method cancels the wizard, and returns the user to the // Opportunities tab public PageReference cancel() { PageReference opportunityPage = new ApexPages.StandardController(opportunity).view(); opportunityPage.setRedirect(true); return opportunityPage; } // This method performs the final save for all four objects, and // then navigates the user to the detail page for the new // opportunity. public PageReference save() { // Create the account. Before inserting, copy the contact's // phone number into the account phone number field. account.phone = contact.phone; insert account; // Create the contact. Before inserting, use the id field // that's created once the account is inserted to create // the relationship between the contact and the account. contact.accountId = account.id; insert contact; // Create the opportunity. Before inserting, create // another relationship with the account. opportunity.accountId = account.id; insert opportunity; // Create the junction contact role between the opportunity // and the contact. role.opportunityId = opportunity.id; role.contactId = contact.id; insert role; 115 高度な例 商談ウィザードのステップ 1 // Finally, send the user to the detail page for // the new opportunity. PageReference opptyPage = new ApexPages.StandardController(opportunity).view(); opptyPage.setRedirect(true); return opptyPage; } } 商談ウィザードのステップ 1 次のコードは、ウィザードの 1 ページ目 (opptyStep1) を定義します。このページでは、関連付けられた取引先 責任者と取引先に関するデータをユーザから収集します。 ウィザードの 1 ページ目のマークアップについては、次の点に留意してください。 • タグは、オプションで 子要素を取り込み、コンポーネント のヘッダーとフッターに表示されるボタンを制御できます。 の本文に表示される タグの順序は重要ではありません。ウィザードのこのページでは、 116 高度な例 商談ウィザードのステップ 1 タグに、ページブロック領域のフッターに表示される [次へ] ボタンが含まれま す。 • ウィザードは、[キャンセル] ボタンがクリックされると JavaScript コードを利用してダイアログボックスを表 示し、終了するかどうかをユーザに確認します。この例では、簡略化のためにマークアップに直接 JavaScript を含めていますが、実際には JavaScript コードを静的リソースに配置してそのリソースを代わりに参照するこ とをお勧めします。 • ウィザードのこのページでは、[次へ] ボタンがコントローラの step2 メソッドをコールし、そのメソッドが PageReference をウィザードの次のステップに返します。 コマンドボタンはフォームに表示する必要があります。これは、フォームコンポーネント自体が、新しい PageReference に基づいてページ表示を更新するためです。 • タグは、データのセットを表示用に整理します。テーブルと同様に、 は 1 つ以上の列で構成され、各列は 2 つのセル (1 つは項目の表示ラベル、1 つ は値) に展開されます。 タグの本文に含まれる各コンポーネントは、列数に達す るまで、行内の次のセルに配置されます。列数に達したら、その次のコンポーネントは次の行の最初のセル に配置されます。 などの一部のコンポーネントは、自動的にページブロックセクション列の両方のセルに 一度に展開され、項目の表示ラベルと値の両方に入力されます。たとえば、このページの [取引先責任者情報] 領域では、[名] 項目が最初の列、[姓] 項目が 2 番目の列に入り、[電話] 項目が次の行の最初の列に折り返し ます。 • 前のコードの抜粋に含まれる最初の タグの value 属性は、コントローラの getContact メソッドから返された取引先責任者レコードの firstName 項目にユーザの入力を割り当てます。 ページは次のようになります。 図 19 : 新規顧客商談ウィザードのステップ 1 117 高度な例 商談ウィザードのステップ 2 商談ウィザードのステップ 2 次のコードは、ウィザードの 2 ページ目 (opptyStep2) を定義します。このページでは、商談に関するデータを ユーザから収集します。 フォームに [完了予定日]、[フェーズ]、および [取引先責任者の役割] 項目を配置するマークアップは、他の項目 と同じですが、 タグが各項目のデータ型を調べて表示方法を決定します。たとえば、[完了 予定日] テキストボックスをクリックするとカレンダーが表示され、そこからユーザが日付を選択できます。 ページは次のようになります。 図 20 : 新規顧客商談ウィザードのステップ 2 118 高度な例 商談ウィザードのステップ 3 商談ウィザードのステップ 3 最後のコードブロックは、ウィザードの 3 ページ目 (opptyStep3) を定義します。このページでは、すべての入 力データが表示されます。ユーザは、操作を保存するか、前のステップに戻るかを決定できます。 ウィザードの 3 ページ目では、テキストを タグでページに書き込むだけです。 最後のページは次のようになります。 119 高度な例 高度な Visualforce ダッシュボードコンポーネント 図 21 : 新規顧客商談ウィザードのステップ 3 高度な Visualforce ダッシュボードコンポーネント Visualforce ページは、ダッシュボードコンポーネントとして使用できます。ダッシュボードでは、ソースレポー トから得たデータを、グラフ、ゲージ、テーブル、総計値、または Visualforce ページなど、視覚化されたコン ポーネントとして表示します。コンポーネントは、組織の主要な総計値のスナップショットおよびパフォーマン スの指標を提供します。各ダッシュボードには、最大 20 個のコンポーネントを含めることができます。 標準コントローラを使用する Visualforce ページをダッシュボードで使用することはできません。Visualforce ペー ジをダッシュボードで使用するには、そのページがコントローラを含んでいないか、1 つのカスタムコントロー ラを使用しているか、または StandardSetController クラスにバインドされたページを参照している必要がありま す。Visualforce ページは、これらの要件を満たさない場合、ダッシュボードコンポーネントの [Visualforce ページ] ドロップダウンリストにオプションとして表示されません。 次の例は、ダッシュボード内で使用でき、カスタムリストコントローラを使用する Visualforce ページを示しま す。「Barbara Levy」という名前の取引先責任者に関連付けられたすべてのオープンケースを表示します。 {!contactName}'s Cases このコードは、ページに関連付けられたカスタムリストコントローラを表示します。 public class retrieveCase { public String getContactName() { return 'Babara Levy'; } public List getCases() { 120 高度な例 Visualforce と Google Chart の統合 return [SELECT status, subject FROM Case WHERE Contact.name = 'Babara Levy' AND status != 'Closed' limit 5]; } } 図 22 : ダッシュボードで実行する Visualforce ページのサンプル 関連リンク Visualforce ダッシュボードコンポーネントの作成 Visualforce と Google Chart の統合 Google Chart は、さまざまな視覚効果でデータを動的に表示する方法を提供します。Visualforce と組み合わせる ことによって、Google Chart はダッシュボードを使用するよりも高い柔軟性と配信可能性を提供できます。グラ フは URL を介して生成されるため、画像を使用できるところであれば、視覚化を共有して組み込むことができ ます。 Google Charts API の使用には 2 つの前提条件があります。1 つ目は、データの符号化方法の決定です。Google Charts API には、テキスト、簡易、および拡張という 3 つのデータ符号化タイプがあります。この例では、簡易 符号化のみを使用します。2 つ目は、使用するグラフの種類の決定です。この例では、ユーザは棒グラフと線グ ラフのいずれかを選択します。 カスタムコントローラには、上記の要件に対応する init() と create() という重要な関数が 2 つあります。 • 関数 init() は数値を取り、Google Chart の簡易データエンコードタイプに変換します。詳細は、Google Charts APIドキュメントの「Simple Encoding Data Format」を参照してください。 • 関数 create() は、Google Chart API に要求を行う URL を構成します。 次のコードは、Visualforce ページのコントローラを表します。 /* This class contains the encoding algorithm for use with the Google chartAPI. */ public class GoogleDataEncoding { // Exceptions to handle any erroneous data public class EncodingException extends Exception {} public class UnsupportedEncodingTypeException extends Exception {} /* The encoding map which takes an integer key and returns the respective encoding value as defined by Google. This map is initialized in init() */ private Map encodingMap { get; set; } /* The maximum encoding value supported for the given encoding type. This value is set during init() */ private Integer encodingMax { get; set; } /* The minimum encoding value supported for the given encoding 121 高度な例 Visualforce と Google Chart の統合 type. This value is set during init() */ private Integer encodingMin { get; set; } /* The encoding type according to Google's API. Only SIMPLE is implemented. */ public enum EncodingType { TEXT, SIMPLE, EXTENDED } /* The minimum value to use in the generation of an encoding value. */ public Integer min { get; private set; } /* The maximum value to use in the generation of an encoding value. */ public Integer max { get; private set; } // The encoding type according to the API defined by Google public EncodingType eType { get; private set; } // Corresponds to the data set provided by the page public String dataSet { get; set; } // Corresponds to the type of graph selected on the page public String graph { get; set; } // The URL that renders the Google Chart public String chartURL { get; set; } // Indicates whether the chart should be displayed public Boolean displayChart { get; set; } public GoogleDataEncoding() { min = 0; max = 61; eType = EncodingType.SIMPLE; displayChart = false; init(); } public PageReference create() { String[] dataSetList = dataSet.split(',', 0); String mappedValue = 'chd=s:'; chartURL = 'http://chart.apis.google.com/chart?chs=600x300' + '&chtt=Time+vs|Distance&chxt=x,y,x,y' + '&chxr=0,0,10,1|1,0,65,5' + '&chxl=2:|Seconds|3:|Meters'; if (graph.compareTo('barChart') == 0) { chartURL += '&cht=bvs'; } else if (graph.compareTo('lineChart') == 0) { chartURL += '&cht=ls'; } else { throw new EncodingException('An unsupported chart type' + 'was selected: ' + graph + ' does not exist.'); } for(String dataPoint : dataSetList) { mappedValue += getEncode(Integer.valueOf(dataPoint.trim())); } chartURL += '&' + mappedValue; displayChart = true; return null; 122 高度な例 Visualforce と Google Chart の統合 } /* This method returns the encoding type parameter value that matches the specified encoding type. */ public static String getEncodingDescriptor(EncodingType t) { if(t == EncodingType.TEXT) return 't'; else if(t == EncodingType.SIMPLE) return 's'; else if(t == EncodingType.EXTENDED) return 'e'; else return ''; } /* This method takes a given number within the declared range of the encoding class and encodes it according to the encoding type. If the value provided fall outside of the declared range, an EncodingException is thrown. */ public String getEncode(Integer d) { if(d > max || d < min) { throw new EncodingException('Value provided ' + d + ' was outside the declared min/max range (' + min + '/' + max + ')'); } else { return encodingMap.get(d); } } /* This method initializes the encoding map which is then stored for expected repetitious use to minimize statement invocation. */ private void init() { if(eType == EncodingType.SIMPLE) { encodingMax = 61; encodingMin = 0; encodingMap = new Map(); encodingMap.put(0,'A'); encodingMap.put(1,'B'); encodingMap.put(2,'C'); encodingMap.put(3,'D'); encodingMap.put(4,'E'); encodingMap.put(5,'F'); encodingMap.put(6,'G'); encodingMap.put(7,'H'); encodingMap.put(8,'I'); encodingMap.put(9,'J'); encodingMap.put(10,'K'); encodingMap.put(11,'L'); encodingMap.put(12,'M'); encodingMap.put(13,'N'); encodingMap.put(14,'O'); encodingMap.put(15,'P'); encodingMap.put(16,'Q'); encodingMap.put(17,'R'); encodingMap.put(18,'S'); encodingMap.put(19,'T'); encodingMap.put(20,'U'); encodingMap.put(21,'V'); encodingMap.put(22,'W'); encodingMap.put(23,'X'); encodingMap.put(24,'Y'); encodingMap.put(25,'Z'); encodingMap.put(26,'a'); encodingMap.put(27,'b'); encodingMap.put(28,'c'); encodingMap.put(29,'d'); encodingMap.put(30,'e'); encodingMap.put(31,'f'); encodingMap.put(32,'g'); encodingMap.put(33,'h'); encodingMap.put(34,'i'); 123 高度な例 Visualforce と Google Chart の統合 encodingMap.put(35,'j'); encodingMap.put(36,'k'); encodingMap.put(37,'l'); encodingMap.put(38,'m'); encodingMap.put(39,'n'); encodingMap.put(40,'o'); encodingMap.put(41,'p'); encodingMap.put(42,'q'); encodingMap.put(43,'r'); encodingMap.put(44,'s'); encodingMap.put(45,'t'); encodingMap.put(46,'u'); encodingMap.put(47,'v'); encodingMap.put(48,'w'); encodingMap.put(49,'x'); encodingMap.put(50,'y'); encodingMap.put(51,'z'); encodingMap.put(52,'0'); encodingMap.put(53,'1'); encodingMap.put(54,'2'); encodingMap.put(55,'3'); encodingMap.put(56,'4'); encodingMap.put(57,'5'); encodingMap.put(58,'6'); encodingMap.put(59,'7'); encodingMap.put(60,'8'); encodingMap.put(61,'9'); } } } Visualforce ページには 2 つの入力要素 (グラフの種類とデータセットのそれぞれに 1 つずつ) が必要です。以下 は、この情報を収集するフォームを構成するサンプルページです。

サンプルでは、「1, 1, 2, 3, 5, 8, 13, 21, 34, 55」という数字のシーケンスを入力します。このペー ジは、次のように表示されます。 124 高度な例 カスタムリストコントローラによるレコードの一括更新 カスタムリストコントローラによるレコードの一括更新 一括更新を実行するページを作成するには、StandardSetController クラスに含まれるプロトタイプオブジェクト を使用します。 リストコントローラは、2 つのレコードセットを追跡します。1 つは、条件検索で選択されたすべてのレコード が含まれるプライマリリストで、もう 1 つはユーザが選択したレコードが含まれるセカンダリリストです。セカ ンダリリストは通常、ユーザがチェックボックスをオンにしてレコードを選択できる、標準リストビューページ で設定されます。設定後、ユーザはカスタムリストボタンをクリックしてカスタム一括更新ページに移動できま す。カスタム一括更新ページでは、プロトタイプオブジェクトが使用されて新しい項目値がユーザの選択したレ コードに適用されます。プロトタイプオブジェクトは、ユーザが選択したすべてのレコードを操作します。カス タムコントローラでプロトタイプオブジェクトを取得するには、StandardSetController の getRecord メソッドを 使用します。たとえば、Opportunities の一括更新を有効にするには、その関連付けられたオブジェクトの単数形 (Opportunity) を使用して、選択したすべてのレコードの項目値を設定します。 1. massupdatestages という Visualforce ページを作成します。 2. 次のコントローラを指定します。 public class selectedSizeWorkaround { ApexPages.StandardSetController setCon; public selectedSizeWorkaround(ApexPages.StandardSetController controller) { setCon = controller; } public integer getMySelectedSize() { return setCon.getSelected().size(); } public integer getMyRecordsSize() { return setCon.getRecords().size(); } } 125 高度な例 カスタムリストコントローラによるレコードの一括更新 3. 次のマークアップを指定します。 4. [設定] から、[カスタマイズ] > [商談] > [ボタン、リンク、およびアクション] をクリックします。 5. [新規ボタンまたはリンク] をクリックします。 6. [ボタン表示ラベル] を「フェーズの一括更新」 に設定し、[名前] を「MassUpdateStages」に設定します。 7. [表示の種類] を「リストボタン」に設定し、[チェックボックスの表示 (複数レコード選択用)] がオンになって いることを確認します。[動作] を「サイドバーを持つ既存のウィンドウで表示」に設定し、[内容のソース] を 「Visualforce ページ」に設定します。作成したページの名前をクリックしてこのボタンに関連付けます。 8. [保存] をクリックします。 9. [設定] から、[カスタマイズ] > [商談] > [検索レイアウト] をクリックします。次に、[商談] リストビューの横 にある [編集] をクリックします。 10. [カスタムボタン] の下で、[フェーズの一括更新] ボタンを [選択したボタン] リストに移動します。 11. [保存] をクリックします。 12. [商談] タブをクリックします。変更するいくつかの既存の商談を表示する検索条件を選択するか、作成しま す。 13. 各結果の横にチェックボックスが表示されます。任意の数のチェックボックスをクリックし、[フェーズの一 括更新] ボタンをクリックして、選択したフェーズを目的の値に変更します。 14. [保存] をクリックします。 126 高度な例 カスタムリストコントローラによるレコードの一括更新 この例では、1 つの項目を更新する方法を示していますが、プロトタイプオブジェクトの任意の数の項目を参照 してユーザが選択したレコードに適用できます。プロトタイプオブジェクト内の、ユーザが設定しない項目は、 選択したレコードに影響を与えません。プロトタイプオブジェクトでは、必須かどうかなど、項目のプロパティ が保持されます。たとえば、Opportunity.StageName などの必須項目についてページに入力項目を含めた場 合、ユーザはその項目に値を入力する必要があります。 メモ: ユーザが選択または条件検索したセットのサイズをページが表示または参照するようにしたい場 合、必要なのは selectedSizeWorkaround のみです。こうした表示は一括更新で変更されるセットに関 する情報をユーザに提供するため、役立ちます。 127 第9章 Visualforce によるボタン、リンク、およびタブの上書き Salesforce では、レコードの詳細ページの標準ボタンの機能を上書きできます。さらに、標準またはカスタムオブ ジェクトのタブをクリックすると表示されるタブのホームページも上書きできます。 標準ボタンまたはタブのホームページを上書きする手順は、次のとおりです。 1. 上書きするページに移動します。 • 標準オブジェクトの場合は、[設定] で [カスタマイズ] をクリックし、適切なオブジェクト (タブ) のリンク を選択して、[ボタン、リンク、およびアクション] をクリックします。 • カスタムオブジェクトの場合は、[設定] で [作成] > [オブジェクト] をクリックし、リスト内のいずれかの カスタムオブジェクトを選択します。 上書きするボタンまたはタブのホームページの横にある [編集] をクリックします。 メモ: 行動と ToDo には専用のタブはないため、上書きできるのは標準ボタンと標準リンクのみです。 2. 上書きの種別として [Visualforce ページ] を選択します。 3. ユーザがボタンまたはタブをクリックしたときに実行する Visualforce ページを選択します。 Visualforce ページでボタンを上書きするとき、ボタンが表示されるオブジェクトに対して標準コントローラを 使用する必要があります。たとえば、取引先の [編集] ボタンを上書きするためにページを使用する場合、そ のページのマークアップの タグに属性 standardController="Account" が含まれている必要 があります。 Visualforce ページでタブを上書きすると、コントローラのないタブ、カスタムコントローラのあるページ、ま たはコントローラのないページに対して標準リストコントローラを使用する Visualforce ページのみ選択可能 になります。 Visualforce ページでリストを上書きすると、標準リストコントローラを使用する Visualforce ページのみ選択可 能になります。 Visualforce ページで [新規] ボタンを使用して上書きする場合、[レコードタイプの選択] ページを省略するこ ともできます。選択されている場合、Visualforce ページがすでにレコードタイプを処理していると想定される ため、新しいレコードを作成しても、[レコードタイプの選択] ページに転送されません。 128 Visualforce によるボタン、リンク、およびタブの上書き 標準リストコントローラを使用したタブの上書き ヒント: 上書きとして使用する Visualforce ページに機能を追加する必要がある場合は、コントローラ 拡張を使用します。 4. 必要に応じて、この変更を行う理由をコメントとして入力します。 5. [保存] をクリックします。 上書きによって、ボタンの背後のアクションが制御されるため、ボタンの上書きは、Salesforce 全体に適用さ れます。たとえば、商談の [新規] ボタンを上書きした場合には、そのアクションが利用できるすべての場所 でその代替アクションが有効になります。 • 商談のホームページ • 取引先など、他のオブジェクトにあるすべての商談関連リスト • サイドバーの [新規作成] ドロップダウンリスト • この Salesforce ページのすべてのブラウザブックマーク 上書きを取り消す手順は、次のとおりです。 1. 上書きするページに移動します。 • 標準オブジェクトの場合は、[設定] で [カスタマイズ] をクリックし、適切なオブジェクト (タブ) のリンク を選択して、[ボタン、リンク、およびアクション] をクリックします。 • カスタムオブジェクトの場合は、[設定] で [作成] > [オブジェクト] をクリックし、リスト内のいずれかの カスタムオブジェクトを選択します。 2. 上書きの横にある [編集] をクリックします。 3. [上書きなし (デフォルトの動作)] を選択します。 4. [OK] をクリックします。 標準リストコントローラを使用したタブの上書き 標準リストコントローラを使用するページを使用してタブを上書きすることができます。たとえば、取引先標準 リストコントローラに関連付けられた overrideAccountTab という名前のページを作成するとします。 [取引先] タブを上書きして標準の [取引先] ホームページの代わりにそのページを表示できます。 [取引先] タブを上書きする手順は、次のとおりです。 1. [設定] から、[カスタマイズ] > [取引先] > [ボタン、リンク、およびアクション] をクリックします。 2. [取引先] タブの [編集] をクリックします。 3. [Visualforce ページ] ドロップダウンリストから、overrideAccountTab ページを選択します。 4. [保存] をクリックします。 129 Visualforce によるボタン、リンク、およびタブの上書き Visualforce のカスタムボタンおよびリンクの定義 メモ: 適切なページレベルセキュリティを設定して、このページをすべてのユーザが使用できるようにし てください。 Visualforce のカスタムボタンおよびリンクの定義 カスタムボタンまたはカスタムリンクを作成する前に、ユーザがそのボタンまたはリンクをクリックした際に実 行するアクションを決定します。 1. [設定] で [カスタマイズ] をクリックし、該当するタブまたはユーザリンクを選択してから、[ボタン、リン ク、およびアクション] を選択します。ユーザオブジェクトまたはカスタムホームページでは、カスタムボタ ンを使用できません。 カスタムボタンとカスタムリンクは、ToDo または行動の個々の設定リンクでの活動でのみ使用できます。た だし、[設定] で [カスタマイズ] > [活動] > [活動のボタン] をクリックして、ToDo と行動の両方に適用される ボタンを上書きできます。 カスタムオブジェクトの場合は、[設定] で [作成] > [オブジェクト] をクリックして、カスタムオブジェクトを 選択します。 2. [新規ボタンまたはリンク] をクリックします。 3. 次の属性を入力します。 属性名 説明 表示ラベル カスタムボタンまたはカスタムリンクのユーザページに表示されるテキストです。 名前 差し込み項目からの参照に使用されるボタンまたはリンクに付けられる一意の名前 です。この名前は、アンダースコアと英数字のみを含み、組織内で一意の名前にす る必要があります。最初は文字であること、空白は使用しない、最後にアンダース コアを使用しない、2 つ続けてアンダースコアを使用しないという制約がありま す。 名前空間プレフィックス パッケージコンテキストでは、名前空間プレフィックスとは AppExchange にある 自社パッケージとそのコンテンツを他の開発者のパッケージと区別するための 1 ~ 15 文字の英数字で構成される識別子です。名前空間プレフィックスでは、大文字 小文字は区別されません。たとえば、ABC と abc は一意として認識されません。 名前空間プレフィックスは、すべての Salesforce 組織にわたって必ずグローバルに 一意なものを指定します。名前空間プレフィックスを使用することで、自社の管理 パッケージのみを管理できるようになります。 保護コンポーネント 保護コンポーネントは、登録者の組織で作成されたコンポーネントからリンク付け したり参照したりすることはできません。開発者は、今後のリリースで、インス トールの失敗を心配することなく保護コンポーネントを削除できます。ただし、コ ンポーネントが非保護に設定され、グローバルにリリースされると、開発者は削除 できなくなります。 説明 ボタンまたはリンクを区別するテキスト。システム管理者がボタンとリンクを設定 するときに表示されます。 130 Visualforce によるボタン、リンク、およびタブの上書き Visualforce のカスタムボタンおよびリンクの定義 属性名 説明 表示の種類 ページレイアウトのどこでボタンまたはリンクを使用できるようにするかを決めま す。 詳細ページリンク ページレイアウトの [カスタムリンク] セクションにリンクを追加する場合に 選択します。 詳細ページボタン レコードの詳細ページにカスタムボタンを追加する場合に選択します。詳細 ページボタンは、ページレイアウトの [ボタン] セクションにのみ追加できま す。 リストボタン リストビュー、検索結果レイアウト、または関連リストにカスタムボタンを追 加する場合に選択します。リストボタンは、ページレイアウトの [関連リスト] セクションまたは [リストビュー] レイアウトと [検索結果] レイアウトにのみ 追加できます。 リストボタンの場合、Salesforce は自動的に [チェックボックスの表示 (複数レ コード選択用)] オプションを選択します。このオプションは、リスト内の各レ コードの横にチェックボックスを表示し、リストボタンのアクションへ適用す るレコードをユーザが選択できるようにします。ユーザがレコードを選択する 必要がない場合には、このオプションをオフにします (たとえば、ユーザを別 のページに移動させるボタンなど)。 動作 ボタンまたはリンクをクリックした際の処理を選択します。 適用できる場合は、一部の設定にデフォルト値を使用します。たとえば、新規ウィ ンドウに表示 を選択した場合の新規ウィンドウのデフォルトの高さは 600 ピクセル となります。 内容のソース Visualforce ページを使用するには、「Visualforce ページ」を選択し、ドロップダウ ンリストからページを選択します。ホームページのカスタムリンクとして Visualforce ページを使用することはできません。 4. 終了後、[Save (保存)] をクリックします。 保存後、編集を継続するには、[Quick Save (適用)] をクリックします。 指定された URL を表示するには、[プレビュー] をクリックします。 コンテンツを保存せずに終了するには、[キャンセル] をクリックします。 5. 新しいボタンまたはリンクを表示するように、該当するタブや検索レイアウトのページレイアウトを編集し ます。 ユーザ用のカスタムリンクを追加した場合、そのリンクは、ユーザの詳細ページの [カスタムリンク] セクショ ンに自動的に追加されます。詳細ページボタンはページレイアウトの [ボタン] セクションにのみ追加できま す。 131 Visualforce によるボタン、リンク、およびタブの上書き 標準リストコントローラを使用したカスタムリストボタ ンの追加 6. 必要に応じて、ユーザのブラウザのデフォルト設定とは異なる設定を使用してリンクまたはボタンを開くよ うにするウィンドウのプロパティを設定します。 標準リストコントローラを使用したカスタムリストボタンの追 加 標準ボタンやリンクを上書きすることに加えて、標準リストコントローラを使用するページにリンクするカスタ ムリストボタンを作成することもできます。これらのリストボタンは、オブジェクトのリストページ、検索結 果、および関連リストで使用できます。また、これらのリストボタンを使用すると、選択したレコードのグルー プに対してアクションを実行できます。選択されたレコードのセットを示すには、{!selected} 式を使用しま す。 たとえば、カスタムボタンを商談の関連リストに追加して、選択したレコードの商談フェーズと完了日を編集し て保存できるようにする手順は、次のとおりです。 1. 次の Apex クラスを作成します。 public class tenPageSizeExt { public tenPageSizeExt(ApexPages.StandardSetController controller) { controller.setPageSize(10); } } 2. 次のページを作成し、oppEditStageAndCloseDate をいう名前を付けます。 3. すべてのユーザがそのページを使用できるようにします。 a. [設定] で、[開発] > [ページ] をクリックします。 b. oppEditStageAndCloseDate ページの [セキュリティ] をクリックします。 c. 適切なプロファイルを [有効にされたプロファイル] リストに追加します。 d. [保存] をクリックします。 4. 商談にカスタムボタンを作成します。 132 Visualforce によるボタン、リンク、およびタブの上書き レコードタイプの表示 a. [設定] から、[カスタマイズ] > [商談] > [ボタン、リンク、およびアクション] をクリックします。 b. [新規ボタンまたはリンク] をクリックします。 c. [表示ラベル] を「フェーズと日付の編集」に設定します。 d. [表示の種類] を [リストボタン] に設定します。 e. [内容のソース] を、[Visualforce ページ] に設定します。 f. [コンテンツ] ドロップダウンリストから、[oppEditStageAndCloseDate] を選択します。 g. [保存] をクリックします。 h. ボタンはページレイアウトを更新するまで表示されないことを通知する警告が表示されます。[OK] をク リックします。 5. 取引先ページレイアウトにカスタムボタンを追加します。 a. [設定] から、[カスタマイズ] > [取引先] > [ページレイアウト] をクリックします。 b. 適切なページレイアウトの [編集] をクリックします。 c. [関連リストセクション] で、[商談] をクリックしてから、 をクリックしてプロパティを編集します。 d. [カスタムボタン] セクションで、[利用可能なボタン] リストの [編集のフェーズと日付] を選択して [選択 したボタン] リストに追加します。 e. [OK] をクリックします。 f. [保存] をクリックします。 取引先ページにアクセスすると、[商談] 関連リストに新しいボタンが表示されます。 図 23 : 新規ボタンの例 商談を選択して、[編集のフェーズと日付] をクリックすると、カスタム編集ページが表示されます。 図 24 : カスタム編集ページの例 レコードタイプの表示 Salesforce.com API バージョンが 20.0 以降の Visualforce ページではレコードタイプがサポートされます。レコー ドタイプを使用すると、異なるビジネスプロセス、選択リストの値、およびページレイアウトを、異なるユーザ に提供できます。 [設定] でレコードタイプを作成すると、ユーザ側でそれ以上のアクションを実行しなくても Visualforce でレコー ドタイプのサポートが有効になります。レコードタイプを使用するオブジェクトの Visualforce ページには、ユー ザによる設定が反映されます。レコードタイプ項目には、RecordTypeId という名前が付けられます。 133 Visualforce によるボタン、リンク、およびタブの上書き レコードタイプの表示 ユーザのレコードタイプ定義は、次のように タグの表示に影響を与えます。 • タグが、レコードタイプで条件検索される選択リスト項目を参照している場合: ◊ 表示される コンポーネントには、そのレコードタイプと互換性のあるオプションの みが表示されます。 ◊ コンポーネントが、表示された編集可能な制御項目を持つ連動選択リストにバイン ドされている場合、レコードタイプと制御項目値の両方と互換性のあるオプションのみが表示されます。 • タグがレコードタイプ項目を参照する場合: ◊ ユーザが項目のレコードタイプを変更できるか、新規項目のレコードタイプを選択できる場合、 コンポーネントはドロップダウンリストとして表示されます。それ以外の場合は、 参照のみのテキストして表示されます。 ◊ リストが変更された際のページの更新または条件検索された選択リストの再表示は、開発者の責任で行っ てください。 さらに、 タグのレコードタイプのサポートは、 の動作を参照のみと して実装した場合と同じです。 Visualforce ページで [新規] ボタンを使用して上書きする場合、[レコードタイプの選択] ページを省略することも できます。選択されている場合、Visualforce ページがすでにレコードタイプを処理していると想定されるため、 新しいレコードを作成しても、[レコードタイプの選択] ページに転送されません。 134 第 10 章 静的リソースの使用 静的リソースにより、アーカイブ (.zip や .jar ファイルなど)、画像、スタイルシート、JavaScript、その他のファ イルなど、Visualforce ページ内で参照できるコンテンツをアップロードできます。 [ドキュメント] タブにファイルをアップロードするよりも、静的リソースを利用する方がよい理由は、次のとお りです。 • 関連ファイルを集めたものをディレクトリ階層にパッケージ化し、その階層を .zip や .jar アーカイブとして アップロードできます。 • ドキュメント ID をハードコードする代わりに、$Resource グローバル変数を使用することで、ページマー クアップ内の静的リソースを名前で参照できます。 ヒント: さらに、静的リソースを使用して JavaScript またはカスケードスタイルシート (CSS) を参照する 方が、マークアップをインラインに含めるよりも適しています。静的リソースを使用してこの種のコン テンツを管理すると、すべてのページや共有する一連の JavaScript 機能のデザインに一貫性を持たせるこ とができます。 1 つの静的リソースのサイズは、最大 5 MB、1 組織が持てる静的リソースの合計は最大 250 MB です。 静的リソースの作成 静的リソースを作成する手順は、次のとおりです。 1. [設定] で、[開発] > [静的リソース] をクリックします。 2. [新規静的リソース] をクリックします。 3. [名前] テキストボックスで、Visualforce マークアップ内でリソースの識別に使われるテキストを入力します。 この名前は、アンダースコアと英数字のみを含み、組織内で一意の名前にする必要があります。最初は文字 であること、スペースは使用しない、最後にアンダースコアを使用しない、2 つ続けてアンダースコアを使用 しないという制約があります。 メモ: Visualforce マークアップで静的リソースを参照し、そのリソースの名前を変更すると、Visualforce マークアップが更新されその変更が反映されます。 4. [説明] テキストエリアで、リソースの任意の説明を指定します。 5. [ファイル] テキストボックスの横にある [参照] をクリックして、アップロードするリソースのローカルコピー へ移動します。 1 つの静的リソースのサイズは、最大 5 MB、1 組織が持てる静的リソースの合計は最大 250 MB です。 6. [キャッシュコントロール] を次のように設定します。 135 静的リソースの使用 • Visualforce マークアップでの静的リソースの参照 [非公開] は、Salesforce サーバにキャッシュされた静的リソースデータを他のユーザと共有しないことを 指定します。静的リソースは、現在のユーザのセッションについてのみキャッシュに保存されます。 メモ: 静的リソースのキャッシュ設定は、ゲストユーザのプロファイルが IP 範囲またはログイン 時間に基づいて制限されている Force.com サイトを介してアクセスする場合は、非公開に設定され ます。ゲストユーザプロファイル制限のあるサイトでは、ブラウザ内でのみ静的リソースをキャッ シュします。また、以前は無制限であったサイトに制限が設定されると、Salesforce キャッシュお よび中間キャッシュから静的リソースが解放されるまでに最大 45 日かかる場合があります。 • [公開] は、Salesforce サーバにキャッシュされた静的リソースデータを、読み込み時間を短縮するために 組織の他のユーザと共有することを指定します。 ヘッダー項目定義に関する W3C 仕様には、キャッシュ管理に関するより詳細な技術情報があります。 メモ: この機能は、サイト、つまり、静的なリソースを使用する有効な組織についてのみ有効です。 7. [保存] をクリックします。 警告: WinZip を使用する場合、必ず最新バージョンをインストールしてください。以前のバージョンの WinZip ではデータが失われる可能性があります。 Visualforce マークアップでの静的リソースの参照 Visualforce マークアップで静的リソースを参照する方法は、単独ファイルを参照するのか、またはアーカイブ (zip ファイルや .jar ファイルなど) に含まれるファイルを参照するのかによって異なります。 • 単独ファイルを参照するには、$Resource.< e ce_ a e> を差し込み項目として使用します。 は、リソースをアップロードしたときに指定した名前です。次に例を示します。 または • アーカイブ内のファイルを参照するには、URLFOR 関数を使用します。最初のパラメータには、そのアーカイ ブをアップロードしたときに指定した静的リソース名を、第 2 パラメータには、アーカイブ内での目的ファ イルへのパスを指定します。たとえば、次のとおりです。次に例を示します。 または 136 静的リソースの使用 • Visualforce マークアップでの静的リソースの参照 静的リソースアーカイブのファイルの相対パスを使用して、アーカイブ内の別のコンテンツを使用できます。 たとえば、styles.css という CSS ファイルに、次のようなスタイルがあるとします。 table { background-image: img/testimage.gif } Visualforce ページでその CSS を使用する場合、CSS ファイルが画像を検出できるようにする必要があります。 そのためには、styles.css や img/testimage.gif を含む zip ファイルなどのアーカイブを作成します。パ ス構造がアーカイブ内に保持されるようにします。そして、アーカイブファイルを静的リソース 「style_resources」としてアップロードします。ページに、次のコンポーネントを追加します。 静的リソースにはスタイルと画像が両方含まれているため、スタイルシートの相対パスが解決し、画像が表 示されます。 • カスタムコントローラでは、 タグを使用して静的リソースのコンテンツを動的に参照でき ます。最初に、カスタムコントローラを作成します。 global class MyController { public String getImageName() { return 'Picture.gif';//this is the name of the image } } 次に、 タグで getImageName メソッドを参照します。 zip ファイル内で画像の名前が変わる場合は、getImageName で返された値を変更できます。 137 第 11 章 カスタムコンポーネントの作成と使用 Salesforce には、Visualforce ページの作成に使用できる標準の組み込みコンポーネント ( お よび など) のライブラリがあります。ユーザ独自のカスタムコンポーネントを作成して、こ のライブラリに追加することもできます。この章では、カスタムコンポーネントの概要と作成方法を説明しま す。 • カスタムコンポーネントとは? • カスタムコンポーネントのマークアップ • Visualforce ページでのカスタムコンポーネントの使用 • カスタムコンポーネントの属性 • カスタムコンポーネントコントローラ • カスタムコンポーネントの定義 カスタムコンポーネントとは? メソッドでコードをカプセル化すると、プログラムでそのメソッドを複数回利用できるのと同様に、カスタムコ ンポーネントで共通のデザインパターンをカプセル化することにより 1 つ以上の Visualforce ページでそのコン ポーネントを複数回利用することができます。 たとえば、Visualforce ページを使用してフォトアルバムを作成するとします。アルバム内のそれぞれの写真の境 界線は独自の色になっており、その下にはテキストキャプションが表示されます。アルバム内のすべての写真を 表示する場合に Visualforce マークアップを繰り返すのではなく、画像、境界線の色、およびキャプションを配し た singlePhoto という名前のカスタムコンポーネントを定義し、これらの属性を使用してページ上に画像を表 示できます。一度定義すると、組織内のすべての Visualforce ページで、 などの標準コンポーネントと同じように、singlePhoto カスタムコンポーネントを活用 できます。 開発者がマークアップを再利用できるページテンプレートとは異なり、カスタムコンポーネントは、次の理由で ページテンプレートよりも強力であり、柔軟性に優れています。 • カスタムコンポーネントにより、開発者は、各コンポーネントに渡せる属性を定義できます。属性の値によっ て、最終ページでのマークアップの表示方法と、コンポーネントのそのインスタンスに対して実行されるコ ントローラベースのロジックを変更できます。この動作は、テンプレートのものとは異なります。テンプレー トでは、テンプレートを使用するページからテンプレートの定義自体に情報を渡す方法がありません。 138 カスタムコンポーネントの作成と使用 • カスタムコンポーネントの定義 カスタムコンポーネントの説明は、標準コンポーネントの説明と並んで、アプリケーションのコンポーネン トの参照ダイアログに表示されます。一方、テンプレートの説明は、ページとして定義されているために、 Salesforce の [設定] 領域からしか参照できません。 関連リンク カスタムコンポーネントの定義 Visualforce ページでのカスタムコンポーネントの使用 カスタムコンポーネントの定義 Visualforce ページで使用するカスタムコンポーネントを定義する手順は、次のとおりです。 1. Salesforce の [設定] で、[開発] > [コンポーネント] をクリックします。 2. [新規] をクリックします。 3. [表示ラベル] テキストボックスに、設定ツールでカスタムコンポーネントの識別に使用するテキストを入力 します。 4. [オブジェクト名] テキストボックスに、Visualforce マークアップ内でカスタムコンポーネントを識別するテキ ストを入力します。この名前は、アンダースコアと英数字のみを含み、組織内で一意の名前にする必要があ ります。最初は文字であること、スペースは使用しない、最後にアンダースコアを使用しない、2 つ続けてア ンダースコアを使用しないという制約があります。 5. [説明] テキストボックスに、カスタムコンポーネント説明を入力します。この説明は、[保存] をクリックす るとすぐに、他の標準コンポーネントの説明と共にコンポーネントの参照に表示されます。 6. [内容] テキストボックスに、カスタムコンポーネント定義用の Visualforce マークアップを入力します。1 つ のコンポーネントに、最大 1 MB のテキスト、約 1,000,000 文字を入れることができます。 7. [Version Settings (バージョン設定)] をクリックして、Visualforce のバージョンとこのコンポーネントで使用す る API を指定します。また、組織にインストールされている管理パッケージのバージョンを指定できます。 8. [保存] をクリックし、変更を保存してカスタムコンポーネントの詳細画面を参照するか、[適用] をクリック し、変更を保存してコンポーネントの編集を続行します。コンポーネントを保存するには、Visualforce マーク アップが有効になっている必要があります。 メモ: カスタムコンポーネントは、Visualforce の開発モードで、Visualforce ページマークアップにまだ存 在しないカスタムコンポーネントへの参照を追加することによって作成することもできます。マークアッ プを保存すると、コンポーネントに指定した名前に基づいて (指定の属性を含む) 新規のコンポーネント 定義を作成するためのクイック修正リンクが表示されます。 たとえば、myNewComponent というカスタムコンポーネントがまだ定義されていない場合に、既存のペー ジマークアップに を挿入して [保存] をクリックする と、クイック修正によって myNewComponent という名前の新規カスタムコンポーネントを定義できます。 このコンポーネントのデフォルト定義は次のとおりです。

Congratulations

This is your new Component: mynewcomponent
139 カスタムコンポーネントの作成と使用 カスタムコンポーネントのマークアップ この定義は、[設定] で [開発] > [コンポーネント] をクリックしてから myNewComponent カスタムコン ポーネントの横にある [編集] をクリックして編集できます。 コンポーネントが作成されたら、http://mySalesforceInstance/apexcomponent/nameOfNewComponent でこ れを参照できます。mySalesforceInstance の値は Salesforce インスタンスのホスト名 (na3.salesforce.com など)、nameOfNewComponent は、カスタムコンポーネント定義の [名前] 項目の値です。 コンポーネントは、一見 Visualforce ページのように表示されます。そのため、コンポーネントが属性またはコン ポーネントタグ本体のコンテンツに依存している場合は、この URL から予測と違う結果が生じる場合がありま す。より正確にカスタムコンポーネントをテストするには、コンポーネントを Visualforce ページに追加してから ページを表示してください。 カスタムコンポーネントのマークアップ カスタムコンポーネントのすべてのマークアップは タグ内で定義されます。このタグはカ スタムコンポーネントの定義の最上位のタグである必要があります。次に例を示します。 他の Visualforce ページと同様に、マークアップは Visualforce と HTML タグの組み合わせを使用することができ ます。 さらに複雑な例では、カスタムコンポーネントを使用して、複数の Visualforce ページで使用するフォームを作成 できます。recordDisplay という新しいカスタムコンポーネントを作成して、次のコードをコピーします。 次に、displayRecords というページを作成して、次のコードを使用します。 この例が正しく機能するためには、Visualforce ページを URL の有効な取引先レコードに関連付ける必要があり ます。たとえば、001D000000IRt53 が取引先 ID の場合、次の URL を使用します。 https://Sae f ce_i a ce/apex/displayAccount?id=001D000000IRt53 ID として渡された取引先の詳細を含むページが表示されます。 140 カスタムコンポーネントの作成と使用 Visualforce ページでのカスタムコンポーネントの使用 ここで、displayRecords のコードを次のサンプルで置き換えます。 同様に、ページを更新する前に取引先責任者の ID を渡します。取引先責任者の情報が表示されたページが表示 されます。 カスタムコンポーネントの属性には、 コンポーネントの使用についての詳細が含まれます。 Visualforce ページでのカスタムコンポーネントの使用 タグの本文は、コンポーネントを含むと必ず標準の Visualforce ページに追加されるマーク アップです。たとえば、次の Visualforce ページは カスタムコンポーネントのマークアップ (ページ 140) (次の例で は、コンポーネントは myComponent という名前で保存されています) で定義されているコンポーネントを使用し ます。 This is my page.
出力は次のようになります。 This is my page. This is my custom component. Visualforce ページでカスタムコンポーネントを使用するには、コンポーネントが定義された名前空間をコンポー ネント名のプレフィックスとして付ける必要があります。たとえば、myNS という名前空間で myComponent とい う名前のコンポーネントがで定義されている場合は、そのコンポーネントを として Visualforce ページで参照できます。 便利な点は、関連付けられているページとして同じ名前空間で定義されているコンポーネントも c 名前空間プレ フィックスを使用できることです。これにより、上記のサンプルのページとコンポーネントが同じ名前空間で定 義される場合、コンポーネントを として参照できます。 カスタムコンポーネントにコンテンツを挿入する場合は、 タグを使用します。 関連リンク カスタムコンポーネントとは? カスタムコンポーネントの定義 カスタムコンポーネントのバージョン設定の管理 Visualforce ページまたはカスタムコンポーネントに Salesforce API および Visualforce のバージョンを設定する手順 は、次のとおりです。 1. Visualforce ページまたはコンポーネントを編集して、[バージョン設定] をクリックします。 141 カスタムコンポーネントの作成と使用 カスタムコンポーネントの属性 メモ: [設定] の [開発] からページまたはカスタムコンポーネントを編集する場合にのみ、ページまた はカスタムコンポーネントのバージョン設定にアクセスできます。[開発モード] で編集する場合は、 バージョン設定にアクセスできません。 2. Salesforce API の[バージョン]を選択します。このバージョンは、ページまたはコンポーネントで使用する Visualforce のバージョンも示します。 3. [保存] をクリックします。 関連リンク Visualforce のバージョン設定方法 Visualforce ページとコンポーネントのパッケージバージョン設定の管理 カスタムコンポーネントの属性 標準の Visualforce マークアップ以外に、 タグの本文でも、Visualforce ページで使用するとき にカスタムコンポーネントに渡すことができる属性を指定できます。このような属性の値は、その後、コンポー ネントやコンポーネントのコントローラ内 (該当する場合) で直接使用できます。 属性は タグで定義されます。たとえば、次のカスタムコンポーネントの定義では、value および borderColor という名前の 2 つの必須属性を指定します。これらの属性の値は、次の標準の {! } とい う Visualforce の式言語構文を使用してカスタムコンポーネントの定義で参照されます。

次のマークアップで Visualforce ページにこのコンポーネントを使用します。 タグには、name、description、および type 属性の値が必要です。 • name 属性は Visualforce ページでカスタム属性を参照できる方法を定義します。属性の name は、コンポーン ネント内で一意にする必要があります。 • description 属性は、カスタムコンポーネントが保存されたらコンポーネントの参照ライブラリに表示され る属性のヘルプテキストを定義します。このカスタムコンポーネントは、使用可能な標準コンポーネントも 含む参照ライブラリにリストされます。 • type 属性は属性の Apex データ型を定義します。type 属性は次のデータ型のみを値として使用できます。 ◊ string、integer、または boolean などのプリミティブデータ型 ◊ Account などの sObject、My_Custom_Object__c、または汎用型の SObject 142 カスタムコンポーネントの作成と使用 カスタムコンポーネントコントローラ ◊ String[]、Contact[] などの配列表記を使用して指定する一次元リスト ◊ type="map" を使用して指定する対応付け。対応付けの特定のデータ型を指定する必要はありません。 ◊ カスタム Apex クラス その他の 属性についての詳細は、apex:attribute (ページ 302)を参照してください。 デフォルトのカスタムコンポーネントの属性 カスタムコンポーネントには、必ず 2 つの属性が生成されます。これらの属性をコンポーネント定義に含める必 要はありません。 id ページの他のコンポーネントがカスタムコンポーネントを参照できるようにする識別子。 rendered カスタムコンポーネントをページに表示するかどうかを指定する boolean 値。指定されていない場合、この 値はデフォルトの true に設定されます。 カスタムコンポーネントコントローラ 標準の Visualforce ページと同様に、カスタムコンポーネントを Apex で記述されたコントローラに関連付けるこ とができます。この関連付けは、コンポーネントの controller 属性をカスタムコントローラに設定して行いま す。コントローラを使用すると、関連付けられているページにコンポーネントのマークアップを返す前に追加の ロジックを実行できます。 コントローラでのカスタムコンポーネントの属性へのアクセス 関連付けられているカスタムコンポーネントコントローラでカスタムコンポーネントの属性の値にアクセスする 手順は、次のとおりです。 1. 属性の値を格納するカスタムコンポーネントコントローラのプロパティを定義します。 2. プロパティの getter メソッドと setter メソッドを定義します。次に例を示します。 public class myComponentController { public String controllerValue; public void setControllerValue (String s) { controllerValue = s.toUpperCase(); } public String getControllerValue() { return controllerValue; } } setter が値を変更していることに注目してください。 3. コンポーネント定義の タグで、assignTo 属性を使用して定義したばかりのクラス変数 に属性をバインドします。次に例を示します。 143 カスタムコンポーネントの作成と使用 カスタムコンポーネントコントローラ

componentValue is "{!componentValue}"
controllerValue is "{!controllerValue}"

Notice that the controllerValue has been upper cased using an Apex method.
assignTo 属性を使用する場合は、getter メソッドおよび setter メソッドまたは get 値および set 値を含むプ ロパティを定義する必要があります。 4. ページにコンポーネントを追加します。次に例を示します。 ページの出力は次のようになります。 大文字で表示されるように Apex コントローラメソッドが controllerValue を変更している点に注目してくだ さい。 144 第 12 章 動的 Visualforce バインド 動的 Visualforce バインドとは、レコードに関する情報を表示する際に必ずしも表示する項目を指定しない汎用的 な Visualforce ページを記述する方法です。つまり、ページ上の項目はコンパイル時ではなく実行時に決定されま す。これにより、開発者は 1 ページだけ設計して、さまざまな利用者に対し、権限や設定に応じて異なる表示に することができます。動的バインドは、わずかなコーディングで登録者ごとに固有のデータを表示できるため、 管理パッケージに含まれる Visualforce ページで使用すると便利です。 動的 Visualforce バインドは、標準オブジェクトとカスタムオブジェクトでサポートされます。動的バインドは、 一般的に次のフォームを取ります。 efe e ce[e e i ] 構成要素について説明します。 • reference は、sObject、Apex クラス、グローバル変数のいずれかに評価されます。 • expression は、項目名または関連オブジェクト名である文字列に評価されます。関連オブジェクトが返され ると、項目または追加の関連オブジェクトを再帰的に選択するのに使用できます。 動的バインドは、数式が有効な場所であればどこででも使用できます。次のようなページで使用します。 {! efe e ce[e e i ]} 必要に応じて、fieldname を動的式全体の最後に追加できます。動的式が sObject に解決されると、fieldname はそのオブジェクトの特定の項目を参照します。reference が Apex クラスの場合、項目は public または global である必要があります。次に例を示します。 {!myContact['Account'][fied a e]} 動的 Visualforce ページは、ページ上のオブジェクトに標準コントローラを使用し、追加のカスタマイズはコント ローラ拡張で実装するように設計する必要があります。 Apex Schema.SobjectType メソッドを使用して動的参照、特に、オブジェクトの項目にアクセスする動的参照 の情報を取得できます。たとえば、Schema.SobjectType.Account.fields.getMap() は、Account 項目の名前 のマップを、Apex コントローラと拡張が認識できる形式で返します。 重要: 静的参照は、ページを保存したときに有効かどうかチェックされ、参照が無効の場合はページを保 存できなくなります。動的参照は、その性質上、実行時にのみチェックできます。ページを表示すると きにそのページに無効な動的参照が含まれていると、ページはエラーになります。有効なカスタム項目 またはグローバル変数への参照を作成できますが、その項目またはグローバル値が後で削除されると、 ページは次回表示時にエラーになります。 145 動的 Visualforce バインド 標準オブジェクトでの動的参照の使用 リレーションの定義 reference と expression は両方とも、評価結果がオブジェクトリレーションになるような複合式にすること ができます。たとえば、Object1__c というオブジェクトに別のオブジェクト Object2__c へのリレーションがある とします。2 つのオブジェクト間のリレーションの名前は、Relationship__r となります。 Object2__c に myField という項目がある場合、次の動的キャストルックアップはすべて同じ項目への参照を返し ます。 Object1__c.Object2__c['myField'] Object1__c['Object2__c.myField'] Object1__c['Object2__c']['myField'] Object1__c.Relationship__r[myField] Object1__c[Relationship__r.myField] Object1__c[Relationship__r][myField] • • • • • • 関連リンク グローバル変数への動的参照 グローバル変数 標準オブジェクトでの動的参照の使用 アクセスする項目の既知のセットを使用して単純で再利用可能なページを構築するには、動的 Visualforce バイン ドを使用します。このアプローチには、どの項目がユーザの処理対象となるのかを容易にカスタマイズできると いう利点があります。 次の 2 つの例は、説明のために意図的に簡略化されています。動的 Visualforce を十分に活用した高度な例は、 「ユーザがカスタマイズ可能なページでの動的参照の使用」を参照してください。 単純な動的フォーム 次の例は、動的参照を使用する Visualforce ページを構築する最も簡単な方法を示します。 最初に、表示する項目の「動的な」リストを提供するコントローラ拡張を作成します。 public class DynamicAccountFieldsLister { public DynamicAccountFieldsLister(ApexPages.StandardController controller) { controller.addFields(editableFields); } public List editableFields { get { if (editableFields == null) { editableFields = new List(); editableFields.add('Industry'); editableFields.add('AnnualRevenue'); editableFields.add('BillingCity'); } return editableFields ; } private set; } } 146 動的 Visualforce バインド 標準オブジェクトでの動的参照の使用 次に、上記のコントローラ拡張を使用する DynamicAccountEditor というページを作成します。
この例では次のようなことが行われます。 • • • • DynamicAccountFieldsLister コントローラ拡張は、editableFields という文字列のリストを作成しま す。各文字列は、Account オブジェクト内の項目名に対応付けられます。 editableFields リストはハードコードされていますが、項目はクエリや計算から特定したり、カスタム設 定から読み取ったりすることが可能です。ハードコードされていない場合は、より動的な操作が提供されま す。動的参照の利点は、このようなことが可能であることです。 DynamicAccountEditor マークアップは、 タグを使用して editableFields から返された 文字列をループ処理します。 タグは、Account の項目名を表す f 反復要素を参照して、editableFields 内の各項目 を表示します。動的参照 {!Account[f]} が、実際に値をページに表示します。 標準コントローラによる動的参照の項目の読み込み Visualforce は、ページの StandardController (または StandardSetController) で実行される SOQL クエリ を自動的に最適化し、ページで実際に使用される項目のみを読み込みます。オブジェクトと項目への静的参照を 含む Visualforce ページを作成する場合、項目とオブジェクトは前もって知っておく必要があります。ページを保 存するときに、Visualforce はどのオブジェクトと項目を SOQL クエリに追加する必要があるかを判別して保存で きます。この SOQL クエリを、後でページが要求されたときに StandardController が実行します。 動的参照は実行時に、StandardController が SOQL クエリを実行した後に評価されます。動的参照でのみ使 用される項目は、自動的には読み込まれません。動的参照が後で評価されたとき、その項目は存在しないデータ として解決され、結果的に SOQL エラーになります。読み込み対象の項目と関連オブジェクトがわかるように、 コントローラに追加情報を指定する必要があります。 ページコントローラの addFields() メソッドを使用して読み込む追加項目のリストを渡すことで、 StandardController クエリにいくつでも項目を追加できます。前述の例では、これはコントローラ拡張のコン ストラクタで次のように実行されます。 public DynamicAccountFieldsLister(ApexPages.StandardController controller) { controller.addFields(editableFields); } コンストラクタは、ページマークアップが使用するプロパティと同じプロパティ editableFields を使用して、 コンストラクタが読み込む項目のリストに項目を追加します。 147 動的 Visualforce バインド 標準オブジェクトでの動的参照の使用 これは、コントローラ拡張のインスタンス化時に読み込むすべての項目のリストがわかるページに適していま す。項目のリストが、要求処理における後の時点まで判別できない場合は、コントローラで reset() をコール し、項目を追加できます。これにより、コントローラは修正されたクエリを送信することになります。この技法 の例は、ユーザがカスタマイズ可能なページでの動的参照の使用を参照してください。 メモ: コントローラへの項目追加が必要になるのは、StandardController または StandardSetController にデフォルトクエリを使用する場合のみです。コントローラまたはコントロー ラ拡張が独自の SOQL クエリを実行する場合、addFields() の使用は不要で、効果がありません。 これらのメソッドの詳細は、StandardController のドキュメントを参照してください。 関連オブジェクトへの動的参照 この例では、ケースレコードの Visualforce ページを作成し、特定の項目を編集可能にします。表示される項目の 一部は関連オブジェクトのもので、動的参照を使用してリレーションをトラバースする方法を示します。 最初に、DynamicCaseLoader という Apex コントローラ拡張を作成します。 public class DynamicCaseLoader { public final Case caseDetails { get; private set; } // SOQL query loads the case, with Case fields and related Contact fields public DynamicCaseLoader(ApexPages.StandardController controller) { String qid = ApexPages.currentPage().getParameters().get('id'); String theQuery = 'SELECT Id, ' + joinList(caseFieldList, ', ') + ' FROM Case WHERE Id = :qid'; this.caseDetails = Database.query(theQuery); } // A list of fields to show on the Visualforce page public List caseFieldList { get { if (caseFieldList == null) { caseFieldList = new List(); caseFieldList.add('CaseNumber'); caseFieldList.add('Origin'); caseFieldList.add('Status'); caseFieldList.add('Contact.Name'); // related field caseFieldList.add('Contact.Email'); // related field caseFieldList.add('Contact.Phone'); // related field } return caseFieldList; } private set; } // Join an Apex list of fields into a SELECT fields list string private static String joinList(List theList, String separator) { if (theList == null) { return null; } if (separator == null) { separator = ''; } String joined = ''; Boolean firstItem = true; for (String item : theList) { if(null != item) { if(firstItem){ firstItem = false; } else { 148 動的 Visualforce バインド 標準オブジェクトでの動的参照の使用 joined += separator; } joined += item; } } return joined; } } 対応するページ DynamicCaseEditor はこの拡張を使用して特定のケースとそれに関連付けられた取引先責任者 に関する情報を取得します。

{!cf}




このページに、id クエリパラメータとして指定された、有効なケースレコードの ID を使用してアクセスしま す。たとえば、https://Salesforce_instance/apex/DynamicCaseEditor?id=500D0000003ZtPy です。ペー ジに次のようなフォームが表示されます。 この例では、次の点に留意してください。 • コントローラ拡張では、オブジェクトを表示できるようにコンストラクタが独自の SOQL クエリを実行しま す。これは、ページの StandardController がデフォルトでは関連項目を読み込まないためですが、カスタ マイズした SOQL クエリが必要になる使用事例は数多くあります。クエリの結果は、プロパティ caseFieldList によってページで使用できるようになります。コンストラクタでクエリを実行するための要 件はありません。プロパティの get メソッドに簡単に追加できます。 • SOQL クエリは読み込む項目を指定するため、単純な動的フォームでは必要だった addFields() を使用する 必要はありません。 SOQL クエリは実行時に作成されます。ユーティリティメソッドが項目名のリストを SOQL SELECT ステー トメントでの使用に適した文字列に変換します。 • 149 動的 Visualforce バインド • 標準オブジェクトでの動的参照の使用 マークアップでは、フォーム項目は、 を使用する項目名を反復処理し、項目名変数 cf を動 的参照で使用して項目値を取得することで表示されます。各項目は、 の 2 つのコンポーネントで記述される可能性があります。これらのタグ上の表示属性が、 2 つのどちらを実際に表示するかを制御します。項目名が文字列「Contact」を含む場合、情報は タグに表示され、含まない場合は に表示されます。 ユーザがカスタマイズ可能なページでの動的参照の使用 Visualforce 動的バインドの最大の利点は、オブジェクトでどの項目が使用可能かを知らなくてもページを作成で きることです。次の例はこの機能を示しています。すべてのオブジェクトで必須の Name 項目を除き、Account オブジェクトの項目を一切 知らずにカスタマイズできる取引先のリストが表示されます。これは、 Schema.SobjectType.Account.fields.getMap() を使用してオブジェクトに存在する項目のリストを取得し、 Visualforce 動的参照を使用することで可能になります。 この例で示す機能は単純です。メインリストビューには最初、取引先名のみが表示されますが、ユーザは[リス トをカスタマイズ] ボタンを使用して、リストに追加する項目を選択できます。ユーザが設定を保存すると、リ ストビューに戻り、動的に生成された Visualforce ページの追加の列にそれらの項目が表示されます。 メモ: 項目を知らずにページを作成することは、項目セットによる動的参照 (ページ 159)を使用する方法 でも可能です。 最初に、DynamicCustomizableListHandler というコントローラ拡張を作成します。 public class DynamicCustomizableListHandler { // Resources we need to hold on to across requests private ApexPages.StandardSetController controller; private PageReference savePage; // This private private private is the state for the list "app" Set unSelectedNames = new Set(); Set selectedNames = new Set(); Set inaccessibleNames = new Set(); public DynamicCustomizableListHandler(ApexPages.StandardSetController controller) { this.controller = controller; loadFieldsWithVisibility(); } // Initial load of the fields lists private void loadFieldsWithVisibility() { Map fields = Schema.SobjectType.Account.fields.getMap(); for (String s : fields.keySet()) { if (s != 'Name') { // name is always displayed unSelectedNames.add(s); } if (!fields.get(s).getDescribe().isAccessible()) { inaccessibleNames.add(s); } } } // The fields to show in the list // This is what we generate the dynamic references from public List getDisplayFields() { List displayFields = new List(selectedNames); displayFields.sort(); return displayFields; } // Nav: go to customize screen 150 public PageReference customize() { savePage = ApexPages.currentPage(); return Page.CustomizeDynamicList; } // Nav: return to list view public PageReference show() { // This forces a re-query with the new fields list controller.reset(); controller.addFields(getDisplayFields()); return savePage; } // Create the select options for the two select lists on the page public List getSelectedOptions() { return selectOptionsFromSet(selectedNames); } public List getUnSelectedOptions() { return selectOptionsFromSet(unSelectedNames); } private List selectOptionsFromSet(Set opts) { List optionsList = new List(opts); optionsList.sort(); List options = new List(); for (String s : optionsList) { options.add(new SelectOption(s, decorateName(s), inaccessibleNames.contains(s))); } return options; } private String decorateName(String s) { return inaccessibleNames.contains(s) ? '*' + s : s; } // These properties receive the customization form postback data // Each time the [<<] or [>>] button is clicked, these get the contents // of the respective selection lists from the form public transient List selected { get; set; } public transient List unselected { get; set; } // Handle the actual button clicks. Page gets updated via a // rerender on the form public void doAdd() { moveFields(selected, selectedNames, unSelectedNames); } public void doRemove() { moveFields(unselected, unSelectedNames, selectedNames); } private void moveFields(List items, Set moveTo, Set removeFrom) { for (String s: items) { if( ! inaccessibleNames.contains(s)) { moveTo.add(s); removeFrom.remove(s); } } } } メモ: クラスを保存すると、Visualforce ページの欠落に関するプロンプトが表示される場合があります。 これは、customize() メソッドでのページ参照が原因です。[クイック修正] リンクをクリックしてペー ジを作成します。コード内の後の個所にあるブロックから Visualforce マークアップが貼り付けられます。 動的 Visualforce バインド • • • 標準オブジェクトでの動的参照の使用 標準コントローラメソッドの addFields() および reset() が show() メソッドで使用されます。このメソッ ドにより、リストビューに戻ります。これらが必要なのは、表示する項目のリストが変更された可能性があ り、表示用のデータを読み込むクエリを再実行する必要があるためです。 2 つの action メソッド customize() と show() がリストビューからカスタマイズフォームに移動し、再び戻 ります。 navigation action メソッド後に行われることはすべて、カスタマイズフォーム関連の処理です。これらのメソッ ドは、コメントに注記されているように、大きく 2 つのグループに分けられます。最初のグループは、カス タマイズフォームで使用される List リストを提供し、2 つ目のグループは項目をリスト間 で移動する 2 つのボタンを処理します。 ここで、次のマークアップで DynamicCustomizableList という Visualforce ページを作成します。

このページには、組織内の取引先のリストが表示されます。上部の は、取引先用に定義さ れたビューの標準ドロップダウンリストを提供します。これらは、標準 Salesforce 取引先ページでユーザに表示 されるのと同じビューです。このビューウィジェットでは、StandardSetController で提供されるメソッドを 使用します。 2 つ目の には、 で追加された列が含まれる が保 持されます。繰り返しコンポーネントのすべての列は、取引先項目 {!acct[f]} への動的参照を使用して、ユー ザがカスタム選択した項目を表示します。 このミニアプリケーションの最後の部分はカスタマイズフォームです。CustomizeDynamicList というページ を作成します。このページは、コントローラ拡張の作成時にすでに作成されている場合があります。次に貼り付 けます。 152 動的 Visualforce バインド 標準オブジェクトでの動的参照の使用

Note: Fields marked * are inaccessible to your account

この単純な設定ページには、2 つのリストが表示されます。ユーザは、左側の使用可能な項目のリストから、右 側の表示する項目のリストに項目を移動します。[これらの項目を表示]をクリックすると、リスト自体に戻りま す。 このマークアップでは、次の点に留意してください。 • • • このページは、取引先が表示されていなくても、リストビューと同じ標準コントローラを使用します。これ は、表示する項目のリストが含まれるビューステートを維持するために必要です。このフォームでユーザの 設定がカスタム設定のような永続的なものに保存された場合、この操作は不要になります。 最初のリストは、getUnSelectedOptions() メソッドをコールすることで入力されます。フォームが (2 つの コンポーネントのいずれかを経由して) 送信されると、フォーム送信時に選択され たリストの値が selected プロパティに保存されます。対応するコードが、もう一方のリストを処理します。 これらの移動する項目の「デルタ」リストは、クリックされたボタンに応じて doAdd() または doRemove() メソッドで処理されます。 コントローラ拡張とこれらのページを作成し、組織内の /apex/DynamicCustomizableList に移動すると、次 に似たシーケンスが表示されます。 1. デフォルト状態のカスタマイズ可能なリストに取引先名項目のみが表示されます。 153 動的 Visualforce バインド カスタムオブジェクトおよびパッケージでの動的参照の 使用 [リストをカスタマイズ] をクリックします。 2. 表示設定画面が表示されます。 一部の項目を右側のリストに移動し、[これらの項目を表示] をクリックします。 3. カスタマイズされたリストビューが表示されます。 カスタムオブジェクトおよびパッケージでの動的参照の使用 パッケージ開発者は動的 Visualforce バインドを使用して、ユーザがアクセスできる項目のみをリストできます。 これが必要になるのは、オブジェクトの項目を表示する Visualforce ページを含む管理パッケージを開発する場合 などです。パッケージ開発者は登録者がアクセスできる項目がわからないため、動的ページを定義して登録者ご とに表示を変えることができます。次の例は、Visualforce ページを使用するページレイアウトと一緒にパッケー ジされたカスタムオブジェクトを使用して、異なる登録ユーザに同じページを表示する方法を示します。 1. Book という名前で次の項目とデータ型を持つカスタムオブジェクトを作成します。 • • • • • Title: Text(255) Author: Text(255) ISBN: Text(13) Price: Currency(4, 2) Publisher: Text(255) 154 動的 Visualforce バインド カスタムオブジェクトおよびパッケージでの動的参照の 使用 デフォルトでは、新規カスタムオブジェクトを作成すると、そのオブジェクトのレイアウトが作成されます。 このレイアウトを Book Layout と呼びます。 2. レイアウトを変更し、上記のカスタム項目が表示されて、作成者、最終更新者、所有者、名前などの標準項 目が削除されるようにします。 3. 新規カスタムオブジェクトタブを作成します。オブジェクトを Book に、タブスタイルを Books に設定しま す。 4. [Book] タブに切り替えて、Book オブジェクトをいくつか作成します。このチュートリアルでは、項目内の データは実際には関係ありません。 5. 次のコードで bookExtension という名前のコントローラ拡張を作成します。 public with sharing class bookExtension { private ApexPages.StandardController controller; private Set bookFields = new Set(); public bookExtension (ApexPages.StandardController controller) { this.controller = controller; Map fields = Schema.SobjectType.Book__c.fields.getMap(); for (String s : fields.keySet()) { // Only include accessible fields if (fields.get(s).getDescribe().isAccessible() && fields.get(s).getDescribe().isCustom()) { bookFields.add(s); } } } public List availableFields { get { controller.reset(); controller.addFields(new List(bookFields)); return new List(bookFields); } } } 6. このコントローラ拡張を使用して Book オブジェクトの値を表示する、booksView という名前の Visualforce ページを作成します。




155 動的 Visualforce バインド Apex 対応付けとリストの参照 7. コントローラ拡張はパッケージ化されるため、Apex クラスのテストを作成する必要があります。手始めに次 の基本的なコードで bookExtensionTest という名前の Apex クラスを作成します。 public with sharing class bookExtension { private ApexPages.StandardController controller; private Set bookFields = new Set(); public bookExtension (ApexPages.StandardController controller) { this.controller = controller; Map fields = Schema.SobjectType.Book__c.fields.getMap(); for (String s : fields.keySet()) { // Only include accessible fields if (fields.get(s).getDescribe().isAccessible() && fields.get(s).getDescribe().isCustom()) { bookFields.add(s); } } controller.addFields(new List(bookFields)); } public List availableFields { get { controller.reset(); controller.addFields(new List(bookFields)); return new List(bookFields); } } } メモ: この Apex テストは、あくまでもサンプルです。パッケージに含めるテストを作成する場合は、 肯定的な結果と否定的な結果を含む、すべての動作を検証してください。 8. bookBundle という名前のパッケージを作成し、カスタムオブジェクト、Visualforce ページ、 bookExtensionTest Apex クラスを追加します。その他の参照される要素は自動的に含められます。 9. bookBundle パッケージを登録者組織にインストールします。 10. パッケージをインストールしたら、[設定] で [作成] > [オブジェクト] をクリックし、[本] をクリックします。 Rating という新しい項目を追加します。 11. 新規 Book オブジェクトを作成します。ここでも、レコードの値は実際には関係ありません。 12. URL にパッケージ名前空間とブック ID を追加したものを使用して、booksView ページに移動します。たと えば、GBOOK が名前空間で、a00D0000008e7t4 がブック ID の場合、最終的な URL は https://Salesforce_instance/apex/GBOOK__booksView?id=001D000000CDt53 になります。 登録者組織からページが表示されると、ページにはパッケージ化された Book 項目のすべてと、新しく作成され た Rating 項目が含まれます。異なるユーザおよび組織は引き続き必要な項目を追加でき、動的 Visualforce ページ は、適宜調整されて表示されます。 Apex 対応付けとリストの参照 動的バインドを使用する Visualforce ページは、マークアップ内の Apex Map および List データ型を参照できま す。 156 動的 Visualforce バインド Apex 対応付けとリストの参照 たとえば、Apex List が次のように定義されている場合、 public List people { get { return new List{'Winston', 'Julia', 'Brien'}; } set; } public List iter { get { return new List{0, 1, 2}; } set; } Visualforce ページでは次のようにアクセスできます。
同様に、次の Apex Map があるとします。 public Map directors { get { return new Map { 'Kieslowski' => 'Poland', 'del Toro' => 'Mexico', 'Gondry' => 'France' }; } set; } Visualforce ページは、次のように値を表示できます。 -
組織のカスタムオブジェクトに含まれていないデータを使用してフォームを作成するには、 タグのリストと対応付けの動的参照を使用します。Apex コントローラに一連のインスタンス変数を作成したり、 そのフォームデータのためだけにカスタムオブジェクトを作成したりするより、単一の対応付けを使用するほう が、かなり作業を簡略化できる場合があります。 カスタムコントローラで処理するフォームデータを格納する対応付けを使用する Visualforce ページを次に示しま す。 :
フォームで使用する単純なコントローラを次に示します。 public class ListsMapsController { public Map inputFields { get; set; } public ListsMapsController() { inputFields = new Map { 'firstName' => 'Jonny', 'lastName' => 'Appleseed', 'age' => '42' }; } public PageReference submitFieldData() { doSomethingInterestingWithInput(); return null; } public void doSomethingInterestingWithInput() { inputFields.put('age', (Integer.valueOf(inputFields.get('age')) + 10).format()); } } Map には、sObject または sObject 項目の参照を含めることができます。これらの項目を更新するには、入力項目 の項目名を参照します。 public with sharing class MapAccCont { Map mapToAccount = new Map(); public MapAccCont() { Integer i = 0; for (Account a : [SELECT Id, Name FROM Account LIMIT 10]) { mapToAccount.put(i, a); i++; } } public Map getMapToAccount() { return mapToAccount; } } 未解決の動的参照 動的参照が解決しない場合、実行時に次の問題が発生する可能性があります。 • 特定のキーに対応付けられた値がない場合、Visualforce ページはエラーメッセージを返します。たとえば、次 のコントローラがあるとします。 public class ToolController { public Map toolMap { get; set; } 158 動的 Visualforce バインド public String myKey 項目セットの使用 { get; set; } public ToolController() { Map toolsMap = new Map(); toolsMap.put('Stapler', 'Keeps things organized'); } } このページでは実行時にエラーが発生します。 • キーが null の場合、Visualforce ページは空の文字列を表示します。たとえば、上記と同じコントローラを使 用すると、このページは空白を表示します。 項目セットの使用 メモ: このリリースには、項目セットのベータバージョンが含まれています。本番品質ではありますが、 既知の制限があります。 動的バインドを使用して Visualforce ページに項目セットを表示することができます。項目セットとは、項目をグ ループ化したものです。たとえば、ユーザの名、ミドルネーム、姓、肩書を示す項目を 1 つの項目セットにして 持つことができます。そのページを管理パッケージに追加すると、システム管理者は項目セット内の項目の追 加、削除、並び替えを行って、コードを変更せずに Visualforce ページ上に表示する項目を変更できます。項目 セットは、API バージョン 21.0 以降の Visualforce ページに使用できます。1 ページで最大 50 個の項目セットを 参照できます。 Visualforce での項目セットの使用 項目セットを Visualforce で直接参照するには、$ObjectType グローバル変数をキーワード FieldSets と組み合 わせます。たとえば、Contact オブジェクトに 3 つの項目を表示する properNames という項目セットがある場 合、Visualforce ページは次の反復によって項目データを参照できます。
次の項目セット内の項目の特殊なプロパティを使用して、項目の表示ラベルやデータ型など、追加情報を表示す るように選択することもできます。 プロパティ名 説明 DBRequired オブジェクトでその項目が必須かどうか 159 動的 Visualforce バインド 項目セットの使用 プロパティ名 説明 FieldPath 項目の範囲情報のリスト Label 項目の UI 表示ラベル Required 項目セットでその項目が必須かどうか Type 項目のデータ型 たとえば、properNames の項目の表示ラベルとデータ型には次のようにアクセスできます。 Name Label Data Type この Visualforce ページが管理パッケージに追加され、配布された場合、登録者は properNames 項目セットを編 集できます。Visualforce ページを生成するロジックは変わりませんが、表示は各登録者の実装に応じて異なりま す。管理パッケージの項目セットを参照するには、項目セットの先頭に組織の名前空間を追加する必要がありま す。上記のマークアップを使用すると、properNames が Spectre という組織のものである場合、項目セットは次 のように参照されます。 {!$ObjectType.Contact.FieldSets.Spectre__properNames} Apex での項目セットの使用 Visualforce ページで標準コントローラを使用するときには、項目セットの項目は自動的に読み込まれます。カス タムコントローラを使用する場合、ページの SOQL クエリに必須項目を追加する必要があります。Apex は、項 目セットとそれが含む項目を検出できる、Schema.FieldSet と Schema.FieldSetMember の 2 つの Schema オ ブジェクトを提供します。これら 2 つのシステムクラスについての詳細は、『Force.com Apex コード開発者ガイ ド』の「FieldSet クラス」を参照してください。 サンプル: Visualforce ページへの項目セットの表示 このサンプルでは、Schema.FieldSet および Schema.FieldSetMember メソッドを使用して、Merchandise カス タムオブジェクトの Dimensions 項目セットに含まれるすべての項目を動的に取得します。取得した項目のリス トを使用して、これらの項目を表示に使用できるようにする SOQL クエリを作成します。Visualforce ページは、 MerchandiseDetails クラスをコントローラとして使用します。 public class MerchandiseDetails { public Merchandise__c merch { get; set; } public MerchandiseDetails() { this.merch = getMerchandise(); } public List getFields() { 160 動的 Visualforce バインド 項目セットの使用 return SObjectType.Merchandise__c.FieldSets.Dimensions.getFields(); } private Merchandise__c getMerchandise() { String query = 'SELECT '; for(Schema.FieldSetMember f : this.getFields()) { query += f.getFieldPath() + ', '; } query += 'Id, Name FROM Merchandise__c LIMIT 1'; return Database.query(query); } } 上記のコントローラを使用する Visualforce ページは単純です。 上記のマークアップは、フォーム上の項目を必須項目として示す必要があるかどうかを判定するために使用する 数式です。項目セット内の項目は、項目セット定義または項目自体の定義によって必須にすることができます。 この数式では両方を処理します。 項目セットの考慮事項 項目セットに追加された項目は、次の 2 つのカテゴリのいずれかに入れることができます。 • 項目が [項目セットで使用可能] とマークされている場合、項目は項目セット内に存在しますが、開発者はパッ ケージ化された Visualforce ページ上でそれを表示していません。システム管理者は、その項目を [利用可] 列 から [項目セットで] 列に移動することによって、その項目セットをリリースした後、表示できます。 • 項目が [項目セットで] とマークされている場合、開発者はデフォルトで、パッケージ化された Visualforce ペー ジ上でその項目を表示しています。システム管理者は、項目を [項目セットで] 列から削除して項目セットを リリースした後、ページから項目を削除できます。 開発者が、表示される項目をリストする順序によって、Visualforce ページ上での表示順序が決まります。 パッケージ開発者は、次のベストプラクティスに留意してください。 • • インストール済みの項目セットを持つ登録者は、ページに含めなかった項目を追加できます。項目セットの 反復から一部の項目を条件に応じて除外することはできないため、項目セットによって表示される項目がす べてのデータ型で使用できることを確認してください。 項目セットには必須ではない項目のみを追加することをお勧めします。これにより、登録者が項目セットの すべての項目を削除した場合でも、その項目セットを使用する Visualforce は正常に機能します。 161 動的 Visualforce バインド グローバル変数への動的参照 メモ: 項目セットは、API バージョン 21.0 以降の Visualforce ページに使用できます。 関連リンク $ObjectType で使用できるオブジェクトスキーマ詳細 グローバル変数への動的参照 Visualforce ページでは、動的バインドを使用してマークアップ内のグローバル変数を参照できます。グローバル 変数を使用すると、データに関する現在のユーザ、組織、およびスキーマ詳細にアクセスできます。グローバル 変数の一覧は、付録「グローバル変数、関数、および式の演算子」を参照してください。 グローバル変数の参照は、sObjects や Apex クラスの参照と同じで、次のような同じ基本パターンを使用します。 reference はグローバル変数です。 efe e ce[e e i ] 関連リンク グローバル変数 $Resource を使用した静的リソースへの動的参照 静的リソースへの動的参照は、テーマその他の表示設定をサポートする場合に非常に便利です。 $Resource グローバル変数を使用して静的リソースを参照するには、式 {! $Resource[StaticResourceName] } で静的リソースの名前を指定します。たとえば、静的リソースとしてアップロードされる画像の名前を返す getCustomLogo メソッドの場合は、静的リソースを の ように参照します。 次の例では、2 つの異なる表示テーマの切り替え方法を示します。最初に、次のコードで ThemeHandler という 名前のコントローラ拡張を作成します。 public class ThemeHandler { public ThemeHandler(ApexPages.StandardController controller) { } public static Set getAvailableThemes() { // You must have at least one uploaded static resource // or this code will fail. List their names here. return(new Set {'Theme_Color', 'Theme_BW'}); } public static List getThemeOptions() { List themeOptions = new List(); for(String themeName : getAvailableThemes()) { themeOptions.add(new SelectOption(themeName, themeName)); } return themeOptions; } public String selectedTheme { 162 動的 Visualforce バインド $Resource を使用した静的リソースへの動的参照 get { if(null == selectedTheme) { // Ensure we always have a theme List themeList = new List(); themeList.addAll(getAvailableThemes()); selectedTheme = themeList[0]; } return selectedTheme; } set { if(getAvailableThemes().contains(value)) { selectedTheme = value; } } } } このクラスに関する注意: • コントローラ拡張にはデフォルトのコンストラクタがないため、コンストラクタは空です。 • アップロードした静的リソースファイルテーマの名前を getAvailableThemes メソッドに追加します。静的 リソース、特に複数のファイルを含む zip アーカイブの作成とアップロードの詳細は、静的リソースの使用 (ページ 135)を参照してください。 • 最後の 2 つのメソッドでは、テーマの一覧と Visualforce フォームコンポーネントで使用するように選択され たテーマが提供されます。 ここで、このコントローラ拡張を使用する Visualforce ページを作成します。

Theme Viewer

You can select a theme to use while browsing this site.

This is a Sub-Heading

This is standard body copy. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque neque arcu, pellentesque in vehicula vitae, dictum id dolor. Cras viverra consequat neque eu gravida. Morbi hendrerit lobortis mauris, id sollicitudin dui rhoncus nec.

163
このマークアップについては、次の点に留意してください。 • ページでは標準取引先コントローラを使用しますが、取引先は関係ありません。コントローラ拡張を使用す るには、コントローラを指定する必要があります。 • 最初の には、テーマ選択ウィジェットが含まれます。 を使用して選択メニューを変更すると、 全体が再表示されます。これは、 タグが、更新された selectedTheme を動的参照のために取得できるようにするもので す。 • ここで選択したテーマ設定は、コントローラのビューステートにのみ保持されますが、これに代えてカスタ ム設定に保存し、永続的にすることが簡単に行えます。 • テーマごとのグラフィックとスタイルアセットが含まれる各 zip ファイルの構造と内容は一貫している必要が あります。つまり、各テーマの zip ファイルには images/logo.png が存在する必要があります。 このページの 動的 Visualforce バインド $Action を使用した action メソッドへの動的参照 その例を次に示します。コントローラ拡張は、システムをクエリして、ユーザがアクセスできるすべてのカスタ ムオブジェクトの名前を取得し、そのリストを、新規レコードを作成するためのリンクと一緒に表示します。最 初に、DynamicActionsHandler という名前でコントローラ拡張を作成します。 public with sharing class DynamicActionsHandler { public List customObjectDetails { get; private set; } public DynamicActionsHandler(ApexPages.StandardController cont) { this.loadCustomObjects(); } public void loadCustomObjects() { List cObjects = new List(); // Schema.getGlobalDescribe() returns lightweight tokens with minimal metadata Map gd = Schema.getGlobalDescribe(); for(String obj : gd.keySet()) { if(obj.endsWith('__c')) { // Get the full metadata details only for custom items Schema.DescribeSObjectResult objD = gd.get(obj).getDescribe(); if( ! objD.isCustomSetting()) { // Save details for custom objects, not custom settings CustomObjectDetails objDetails = new CustomObjectDetails( obj, objD.getLabel(), objD.isCreateable()); cObjects.add(objDetails); } } } cObjects.sort(); this.customObjectDetails = cObjects; } public class CustomObjectDetails implements Comparable { public String nameStr { get; set; } public String labelStr { get; set; } public Boolean creatable { get; set; } public CustomObjectDetails(String aName, String aLabel, Boolean isCreatable) { this.nameStr = aName; this.labelStr = aLabel; this.creatable = isCreatable; } public Integer compareTo(Object objToCompare) { CustomObjectDetails cod = (CustomObjectDetails)objToCompare; return(this.nameStr.compareTo(cod.nameStr)); } } } この拡張では、次の点に留意してください。 • loadCustomObjects メソッドは Apex スキーマメソッドを使用して、使用可能なカスタムオブジェクトに関 するメタデータ情報を取得します。Schema.getGlobalDescribe メソッドは、使用可能なオブジェクトとカ スタム設定に関する小さいメタデータセットを取得するための軽量の操作です。メソッドは、コレクション をスキャンして名前の末尾が「__c」(カスタムオブジェクトまたは設定であることを示す) の項目を探します。 これらの項目は、getDescribe を使用してより詳細に調査され、選択したメタデータがカスタムオブジェク ト用に保存されます。 • if(obj.endsWith('__c')) を使用して、項目がカスタムオブジェクトであるかどうかをテストするのは、 「ハッキング」のように感じられるかもしれませんが、もう 1 つの選択肢である obj.getDescribe().isCustom() コールにはコストがかかり、getDescribe へのコール数にガバナ制限が 165 動的 Visualforce バインド $ObjectType を使用したスキーマ詳細への動的参照 あります。大量のオブジェクトが含まれている可能性があるリストに対しては、「__c」文字列のスキャンを 最初に行うのが効率的です。 • このメタデータは、内部クラス CustomObjectDetails に保存されます。このクラスは、保存すべき項目の 単純な構造化されたコンテナとして機能します。 • CustomObjectDetails には Comparable インターフェースが実装されており、各オブジェクトの属性 (この場 合はカスタムオブジェクト名) でカスタムオブジェクト詳細のリストを並び替えることができます。 ここで、次のマークアップで Visualforce ページを作成します。
Custom Object Actions [Create]
[List]
特定のレコードが割り当てられていないページで使用できる便利なアクションは、New と List の 2 つのみです。 レコードをクエリするページで、$Action グローバル変数は、View、Clone、Edit、Delete などのメソッドを 提供します。特定の標準オブジェクトには、データ型に適した追加のアクションがあります。 関連リンク $Action $Action グローバル変数の有効な値 $ObjectType を使用したスキーマ詳細への動的参照 $ObjectType グローバル変数を使用すると、組織のオブジェクトに関するさまざまなスキーマ情報にアクセス できます。たとえば、オブジェクトの項目の名前、表示ラベル、データ型の参照に使用します。 $ObjectType は、「深い」グローバル変数であり、次のような「二重に動的」な参照に使用することができま す。 $ObjectType[sObjectName].fields[fieldName].Type 次の例では、動的グローバル変数を使用して一般的なオブジェクトビューアを提供します。最初に、 DynamicObjectHandler という名前で新しいコントローラ (拡張ではない) を作成します。 public class DynamicObjectHandler { // This class acts as a controller for the DynamicObjectViewer component 166 動的 Visualforce バインド $ObjectType を使用したスキーマ詳細への動的参照 private String objType; private List accessibleFields; public sObject obj { get; set { setObjectType(value); discoverAccessibleFields(value); obj = reloadObjectWithAllFieldData(); } } // The sObject type as a string public String getObjectType() { return(this.objType); } public String setObjectType(sObject newObj) { this.objType = newObj.getSObjectType().getDescribe().getName(); return(this.objType); } // List of accessible fields on the sObject public List getAccessibleFields() { return(this.accessibleFields); } private void discoverAccessibleFields(sObject newObj) { this.accessibleFields = new List(); Map fields = newObj.getSObjectType().getDescribe().fields.getMap(); for (String s : fields.keySet()) { if ((s != 'Name') && (fields.get(s).getDescribe().isAccessible())) { this.accessibleFields.add(s); } } } private sObject reloadObjectWithAllFieldData() { String qid = ApexPages.currentPage().getParameters().get('id'); String theQuery = 'SELECT ' + joinList(getAccessibleFields(), ', ') + ' FROM ' + getObjectType() + ' WHERE Id = :qid'; return(Database.query(theQuery)); } // Join an Apex List of fields into a SELECT fields list string private static String joinList(List theList, String separator) { if (theList == null) { return null; } if (separator == null) { separator = ''; } String joined = ''; Boolean firstItem = true; for (String item : theList) { if(null != item) { if(firstItem){ firstItem = false; } else { joined += separator; } joined += item; } } return joined; } } このコントローラでは、次の点に留意してください。 167 動的 Visualforce バインド $ObjectType を使用したスキーマ詳細への動的参照 • Visualforce コンポーネントはコントローラ拡張を使用できません。代わりに、このクラスはコントローラとし て記述されます。コンストラクタは定義されないため、このクラスではデフォルトのコンストラクタが使用 されます。 • オブジェクトのメタデータを収集するには、コントローラでオブジェクトを把握している必要があります。 Visualforce コンストラクタは引数を取れないため、インスタンス化時に目的のオブジェクトを知る方法があり ません。代わりに、公開プロパティ obj を設定することで、メタデータ検出がトリガされます。 • このクラスでは複数のメソッドが、前の例より若干異なる方法でシステムスキーマ検出メソッドを使用して います。 次の例は、オブジェクトに関するスキーマ情報と、クエリされるレコードの特定の値を表示する Visualforce コン ポーネントです。次のコードを使用し、DynamicObjectViewer という名前で新規 Visualforce コンポーネントを 作成します。 Label API Name Type Value 次の点を確認してください。 • このコンポーネントを使用するページでは、レコードを検索する必要があります。これを行うには、そのオ ブジェクトに標準コントローラを使用し、URL でレコードの Id を指定します。たとえば、 https:///apex/DynamicContactPage?id=003D000000Q5GHE です。 168 動的 Visualforce バインド $ObjectType を使用したスキーマ詳細への動的参照 • 選択したレコードはすぐにコンポーネントの obj 属性に渡されます。このパラメータは、すべてのオブジェ クトメタデータ検出に使用されます。 • この 3 つの二重に動的な参照が、$ObjectType[objectType].fields[f] で開始し、各項目のメタデータを 表示するのに対し、通常の動的参照は項目の実際の値を表示します。 • データ値の場合、値は、より自然な {!rec[f]} (コンポーネントへのパラメータ) ではなく {!obj[f]} で、 コントローラ内で getter メソッドが使用されます。その理由は単純で、obj 属性はすべての項目のデータを読 み込むように更新されていますが、rec は標準コントローラで読み込まれたときと同じ状態のままであり、 読み込まれるのが Id 項目のみであるためです。 最後に、新しいコンポーネントを使用して、任意の数の単純な Visualforce ページを作成できます。このページ は、コンポーネントを使用して、次の 2 つのページのようなレコード詳細およびスキーマ情報ページを表示しま す。 関連リンク $ObjectType $ObjectType で使用できる項目スキーマ詳細 $ObjectType で使用できるオブジェクトスキーマ詳細 169 第 13 章 動的 Visualforce コンポーネント Visualforce の基本的な目的は、静的なマークアップベースの言語として、開発者が Salesforce のデザインとマッチ したユーザインターフェースを作成できるようにすることです。ただし、場合によってはプログラムでページを 作成することが必要になります。通常、これは標準マークアップでは難しいか不可能な、複雑なユーザインター フェース動作を実現する場合です。 動的 Visualforce コンポーネントは、ユーザの権限やアクション、ユーザまたは組織の設定、表示されているデー タなどのさまざまな状態に応じて、コンポーネントツリーのコンテンツや配置が異なる Visualforce ページを作成 する方法を提供します。動的 Visualforce コンポーネントは、標準マークアップを使用する代わりに、Apex で設 計されています。 動的 Visualforce コンポーネントは、次のように Apex で定義されています。 Component.C e _ a e ace.C e _ a e たとえば、 は Component.Apex.DataTable になります。 メモ: 標準コンポーネントの参照には、すべての有効な Visualforce コンポーネントの動的な表現が含まれ ます。 Apex で動的に表現される Visualforce コンポーネントは通常のクラスとして動作します。標準 Visualforce コンポー ネントに存在する各属性は、get メソッドや set メソッドによる対応する Apex 表現でプロパティとして利用でき ます。たとえば、 コンポーネントの value 属性を次のように操作できるとします。 Component.Apex.OutputText outText = new Component.Apex.OutputText(); outText.value = 'Some dynamic output text.'; 次のような状況では、動的 Visualforce コンポーネントの使用を検討してください。 • 複雑な制御ロジック内で動的 Visualforce コンポーネントを使用し、同等の標準 Visualforce では作成が難しい か不可能なコンポーネントの組み合わせを作ることができます。たとえば、標準 Visualforce コンポーネント では、通常、コンポーネントの表示は rendered 属性とグローバル IF() 式関数を使用して制御します。Apex で制御ロジックを記述することで、より自然なメカニズムを使用して動的にコンポーネントを表示すること ができます。 • 特定の項目を持つオブジェクトを反復処理することがわかっているが、具体的にどのオブジェクトかわから ない場合、動的 Visualforce コンポーネントでは、汎用的な sObject 参照を使用してオブジェクトの表示を「プ ラグイン」できます。詳細は、「関連リストの使用例」 (ページ 174)を参照してください。 警告: 動的 Visualforce コンポーネントは、組織の新規 Visualforce ページを作成するための主要な手段にす ることを目的としたものではありません。既存の Visualforce ページを動的な手法で記述し直さないでく 170 動的 Visualforce コンポーネント 動的コンポーネントの制限 ださい。標準 Visualforce コンポーネントは、ほとんどの使用事例に適しており、推奨されています。動 的 Visualforce コンポーネントを使用するのは、ユーザの状態またはアクションに応じてページを自動的 に変化させる必要があり、静的なマークアップにコード化するのが難しい場合のみに限定してください。 動的コンポーネントの制限 Visualforce の機能には動的な状況では意味のないものがあるため、コンポーネントの中には動的に使用できない ものがあります。このセクションでは、動的 Visualforce コンポーネントの制限について説明します。 • 次の標準 Visualforce コンポーネントに対応する動的な表現は、Apex には含まれません。 ◊ ◊ ◊ ◊ ◊ ◊ ◊ ◊ ◊ ◊ • • • 動的 Visualforce コンポーネントが特定の sObject 項目を参照し、その項目が後で削除された場合、その項目参 照用の Apex コードはコンパイルされますがページは表示時にエラーになります。また、$Setup や $Label などのグローバル変数への参照を作成することはできますが、参照される項目を削除すると同様に失敗しま す。このようなページが引き続き予期したとおりに動作することを確認してください。 動的な Visualforce ページと式では、静的ページよりも厳格に属性型がチェックされます。 動的コンポーネントには、「パススルー」HTML 属性を設定できません。 動的コンポーネントの作成と表示 メモ: このセクションの例は、説明のために意図的に簡略化されています。動的 Visualforce コンポーネン トを活用した例の詳細は、「関連リストの使用例」 (ページ 174)を参照してください。 ページ上の 2 つの部分に動的 Visualforce コンポーネントを埋め込むことができます。 1. ページの任意の場所に タグを追加する。このタグは、動的コンポーネントのプ レースホルダとして機能します。 2. コントローラまたはコントローラ拡張内の動的 Visualforce コンポーネントを開発する。 タグには、componentValue という必須属性が 1 つあります。この属性は、動的コ ンポーネントを返す Apex メソッドの名前を受け入れます。たとえば、送信フォームの期限が過ぎたら、異なる セクションヘッダーのタイトルを動的に生成したい場合、次のマークアップとコントローラコードを使用しま す。 171 動的 Visualforce コンポーネント 動的コンポーネントの作成と表示 public class DynamicComponentExample { public DynamicComponentExample(ApexPages.StandardController con) { } public Component.Apex.SectionHeader getHeaderWithDueDateCheck() { date dueDate = date.newInstance(2011, 7, 4); boolean overdue = date.today().daysBetween(dueDate) < 0; Component.Apex.SectionHeader sectionHeader = new Component.Apex.SectionHeader(); if (overdue) { sectionHeader.title = 'This Form Was Due On ' + dueDate.format() + '!'; return sectionHeader; } else { sectionHeader.title = 'Form Submission'; return sectionHeader; } } } 1 ページに複数の コンポーネントを含めることができます。 各動的コンポーネントには、一連の共通メソッドおよびプロパティへのアクセス権があります。この一覧を確認 するには、『Apex 開発者ガイド』の「コンポーネントクラス」の章を参照してください。 動的カスタムコンポーネント カスタムコンポーネントを動的に使用すると、標準 Visualforce コンポーネントとまったく同じ動作をします。名 前空間がカスタムコンポーネントの名前空間に変わるだけです。カスタムコンポーネントは、c 名前空間にある ため、次のように動的に作成することができます。 Component.c.MyCustomComponent myDy = new Component.c.MyCustomComponent(); 独自のコンポーネントの利便性のために、次のように名前空間を除外できます。 Component.MyCustomComponent myDy = new Component.MyCustomComponent(); サードパーティがパッケージで提供するコンポーネントを使用する場合は、パッケージプロバイダの名前空間を 使用します。 Component.TheirName.UsefulComponent usefulC = new Component.TheirName.UsefulComponent(); コンストラクタを使用して属性を渡す プロパティを使用してコンポーネントの属性を設定する代わりに、コンストラクタを使用して 1 つ以上の属性の リストを渡すことができます。 Component.Apex.DataList dynDataList = new Component.Apex.DataList(id='myDataList', rendered=true); 属性がコンストラクタに定義されていない場合、コンポーネントのデフォルト値がその属性に使用されます。 プロパティを介してではなく、コンストラクタに属性を定義する必要があるコンポーネントが 2 つあります。 • レコードの Chatter 情報とコントロールを表示する場合、Component.Apex.Detail で、showChatter=true がそのコンストラクタに渡されている必要があります。それ以外の場合、この属性は常に false になります。 172 動的 Visualforce コンポーネント • 動的コンポーネントの作成と表示 ユーザが一度に複数のオプションを選択できるようにする場合は、Component.Apex.SelectList で、 multiSelect=true がそのコンストラクタに渡されている必要があります。それ以外の場合、この値は常に false になります。 これらの値は、string ではなく boolean です。これらを単一引用符で囲む必要はありません。 警告: 属性名が Apex キーワードと一致する場合は、クラスコンストラクタを使用して属性を渡すことは できません。たとえば、List は予約キーワードであるため、Component.Apex.RelatedList はコンスト ラクタを使用して list を渡すことはできません。同様に、for もキーワードであるため、 Component.Apex.OutputLabel は for 属性をコンストラクタ内に定義できません。 式および任意の HTML の定義 式の言語ステートメントを expressions プロパティを使用して追加できます。式のステートメントを渡すには、 プロパティ名の前に expressions を付加します。静的マークアップと同様に、式は {! } 構文でラップする必 要があります。次に例を示します。 Component.Apex.Detail detail = new Component.Apex.Detail(); detail.expressions.subject = '{!Account.ownerId}'; detail.relatedList = false; detail.title = false; 有効な式には、標準オブジェクトやカスタムオブジェクトの項目を参照する式などがあります。次の例のように グローバル変数と関数も使用できます。 Component.Apex.OutputText head1 = new Component.Apex.OutputText(); head1.expressions.value = '{!IF(CONTAINS($User.FirstName, "John"), "Hello John", "Hey, you!")}'; 式で値を渡すのは、それをサポートする属性でのみ有効です。expressions プロパティ以外で {! } を使用する と、式ではなく文字として解釈されます。 プレーン HTML を含めるには、Component.Apex.OutputText の escape プロパティを false に設定します。 Component.Apex.OutputText head1 = new Component.Apex.OutputText(); head1.escape = false; head1.value = '

This header contains HTML

'; facet の定義 式を定義する方法と同様に、facet は動的コンポーネントが使用できる特殊なプロパティとして機能します。次に 例を示します。 Component.Apex.DataTable myTable = new Component.Apex.DataTable(var='item'); myDT.expressions.value = '{!items}'; ApexPages.Component.OutputText header = new Component.Apex.OutputText(value='This is My Header'); myDT.facets.header = header; facet についての詳細は、「コンポーネント facet の使用のためのベストプラクティス」 (ページ 282)を参照してく ださい。 子ノードの定義 childComponents プロパティを使用して、子ノードを動的 Visualforce コンポーネントに追加できます。 childComponents プロパティは Component.Apex オブジェクトのリストへの参照として機能します。 173 動的 Visualforce コンポーネント 関連リストの使用例 次の例では、childComponents を使用して子入力ノードで を構築する方法を示します。 public Component.Apex.PageBlock getDynamicForm() { Component.Apex.PageBlock dynPageBlock = new Component.Apex.PageBlock(); // Create an input field for Account Name Component.Apex.InputField theNameField = new Component.Apex.InputField(); theNameField.expressions.value = '{!Account.Name}'; theNameField.id = 'theName'; Component.Apex.OutputLabel theNameLabel = new Component.Apex.OutputLabel(); theNameLabel.value = 'Rename Account?'; theNameLabel.for = 'theName'; // Create an input field for Account Number Component.Apex.InputField theAccountNumberField = new Component.Apex.InputField(); theAccountNumberField.expressions.value = '{!Account.AccountNumber}'; theAccountNumberField.id = 'theAccountNumber'; Component.Apex.OutputLabel theAccountNumberLabel = new Component.Apex.OutputLabel(); theAccountNumberLabel.value = 'Change Account #?'; theAccountNumberLabel.for = 'theAccountNumber'; // Create a button to submit the form Component.Apex.CommandButton saveButton = new Component.Apex.CommandButton(); saveButton.value = 'Save'; saveButton.expressions.action = '{!Save}'; // Assemble the form components dynPageBlock.childComponents.add(theNameLabel); dynPageBlock.childComponents.add(theNameField); dynPageBlock.childComponents.add(theAccountNumberLabel); dynPageBlock.childComponents.add(theAccountNumberField); dynPageBlock.childComponents.add(saveButton); return dynPageBlock; } マークアップが次のように定義されている場合: このマークアップは次の静的マークアップに相当します。 同等の静的マークアップでの要素の順序は、動的コンポーネントが getDynamicForm メソッドの Apex コードで 宣言された順序ではなく、childComponents に追加された順序です。 関連リストの使用例 動的 Visualforce コンポーネントの使用は、参照するオブジェクトの種別がわからない場合に最適です。一方、動 的 Visualforce バインドの使用は、アクセスする項目がわからない場合に最適です。 174 動的 Visualforce コンポーネント 関連リストの使用例 動的 Visualforce を使用するための次のシナリオでは、アクセスする必要がある既知の項目セットを使用して単純 で再利用可能なページを構築します。ページとそのカスタムオブジェクトは、未管理パッケージに配置され、同 じ組織全体に配布されます。 最初に、Classroom という名前のカスタムオブジェクトを作成します。次の図のように、2 つのオブジェクトを作 成し、それぞれに Science 101 および Math 201 という名前を付けます。 次に、さらに 2 つのカスタムオブジェクトを作成して、それぞれに Student および Teacher という名前を付けま す。各オブジェクトの作成が完了したら、次の手順を実行します。 1. [カスタム項目 & リレーション] の下にある [新規] をクリックします。 2. [主従関係] を選択し、[次へ] をクリックします。 3. ドロップダウンリストで [教室] を選択し、[次へ] をクリックします。 4. 続いて [次へ] をクリックし、すべてのデフォルト値を変更せずに残します。 次のオブジェクトと照合リレーションを作成します。 • Johnny Walker という名前の新規 Student と Mister Pibb という名前の新規 Teacher の両方を Science 101 に割り当てます。 • 別の Boont Amber という名前の新規 Student と Doctor Pepper という名前の Teacher の両方を Math 201 に割り当てます。 次に、DynamicClassroomList という名前で新規 Apex ページを作成し、次のコードを貼り付けます。 public class DynamicClassroomList { private private private private ApexPages.StandardSetController controller; PageReference savePage; Set unSelectedNames; Set selectedNames; public List selected { get; set; } public List unselected { get; set; } public String objId { get; set; } public List displayObjs { get; private set; } boolean idIsSet = false; public DynamicClassroomList() { init(); } public DynamicClassroomList(ApexPages.StandardSetController con) { this.controller = con; init(); } private void init() { 175 動的 Visualforce コンポーネント 関連リストの使用例 savePage = null; unSelectedNames = new Set(); selectedNames = new Set(); if (idIsSet) { ApexPages.CurrentPage().getParameters().put('id', objId); idIsSet = false; } } public PageReference show() { savePage = Page.dynVFClassroom; savePage.getParameters().put('id', objId); return savePage; } public List displayObjsList { get { List options = new List(); List classrooms = [SELECT id, name FROM Classroom__c]; for (Classroom__c c: classrooms) { options.add(new SelectOption(c.id, c.name)); } return options; } } public PageReference customize() { savePage = ApexPages.CurrentPage(); savePage.getParameters().put('id', objId); return Page.dynamicclassroomlist; } // The methods below are for constructing the select list public List selectedOptions { get { List sorted = new List(selectedNames); sorted.sort(); List options = new List(); for (String s: sorted) { options.add(new SelectOption(s, s)); } return options; } } public List unSelectedOptions { get { Schema.DescribeSObjectResult R = Classroom__c.SObjectType.getDescribe(); List C = R.getChildRelationships(); List options = new List(); for (Schema.ChildRelationship cr: C) { String relName = cr.getRelationshipName(); // We're only interested in custom relationships if (relName != null && relName.contains('__r')) { options.add(new SelectOption(relName, relName)); } } return options; } } public void doSelect() { for (String s: selected) { 176 動的 Visualforce コンポーネント 関連リストの使用例 selectedNames.add(s); unselectedNames.remove(s); } } public void doUnSelect() { for (String s: unselected) { unSelectedNames.add(s); selectedNames.remove(s); } } public Component.Apex.OutputPanel getClassroomRelatedLists() { Component.Apex.OutputPanel dynOutPanel= new Component.Apex.OutputPanel(); for(String id: selectedNames) { Component.Apex.RelatedList dynRelList = new Component.Apex.RelatedList(); dynRelList.list = id; dynOutPanel.childComponents.add(dynRelList); } return dynOutPanel; } } 保存しようとすると、Visualforce ページが存在しないというメッセージが表示される場合があります。リンクを クリックしてページを作成すると、その後にあるコードブロックが入力されます。 次に、dynVFClassroom という名前で Visualforce ページを作成し、次のコードを貼り付けます。 最後に、DynamicClassroomList という名前のページを作成します。このチュートリアルを最初から実行して いる場合は、コントローラ拡張を構築したときにこのページをすでに作成しているはずです。次のコードを貼り 付けます。


これは、表示するオブジェクトリレーションを選択するオプションをユーザに表示するページです。「selected」 リストと「unselected」リストへの入力は、動的な方法で行われます。 コントローラ拡張とこれらのページを作成したら、組織の /apex/dynVFClassroom に移動します。次のような シーケンスが表示されます。 178 動的 Visualforce コンポーネント 関連リストの使用例 179 第 14 章 Visualforce とメールの統合 Visualforce を使用して、取引先責任者、リード、またはその他の受信者にメールを送信できます。Visualforce の 機能を利用して Salesforce レコードを反復処理する、再利用可能なメールテンプレートを作成することもできま す。方法は、次のトピックの説明を参照してください。 • Visualforce を使用したメールの送信 • Visualforce メールテンプレート Visualforce を使用したメールの送信 メッセージを配信するカスタムコントローラを作成すると、Visualforce を使用してメールを送信できます。Apex Messaging.SingleEmailMessage クラスが、Salesforce で使用可能な送信メール機能を処理します。 Visualforce でメールを送信するときに使用可能な多くの機能については、次のトピックで説明しています。 • メッセージクラスを使用したカスタムコントローラの作成 • メール添付ファイルの作成 メッセージクラスを使用したカスタムコントローラの作成 Apex Messaging 名前空間を使用するカスタムコントローラには、少なくともメールの件名、本文、および受信 者が必要です。また、件名と本文を記入し、メールを配信するためのフォームとして機能するページが必要で す。 sendEmailPage という新規ページを作成し、次のコードを使用します。

Fill out the fields below to test how you might send an email to a user.


Name {!contact.Name} Email {!contact.Email} 180 Visualforce とメールの統合 メッセージクラスを使用したカスタムコントローラの作 成

:


:



ページマークアップでは、取引先 ID はページの URL から取得されます。この例が正しく機能するためには、 Visualforce ページを URL の有効な取引先レコードに関連付ける必要があります。たとえば、001D000000IRt53 が取引先 ID の場合、次の URL を使用します。 https://Sae f ce_i a ce/apex/sendEmailPage?id=001D000000IRt53 レコードの ID の取得についての詳細は、Visualforce での項目値の表示 (ページ 20)を参照してください。 次のコードは、Messaging.SingleEmailMessage クラスを実装する sendEmail というコントローラを作成し て、取引先に関連する取引先責任者を受信者として使用します。 public class sendEmail { public String subject { get; set; } public String body { get; set; } private final Account account; // Create a constructor that populates the Account object public sendEmail() { account = [select Name, (SELECT Contact.Name, Contact.Email FROM Account.Contacts) from Account where id = :ApexPages.currentPage().getParameters().get('id')]; } public Account getAccount() { return account; } public PageReference send() { // Define the email Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); String addresses; if (account.Contacts[0].Email != null) { addresses = account.Contacts[0].Email; // Loop through the whole list of contacts and their emails for (Integer i = 1; i < account.Contacts.size(); i++) { if (account.Contacts[i].Email != null) { addresses += ':' + account.Contacts[i].Email; } } } String[] toAddresses = addresses.split(':', 0); // Sets the paramaters of the email email.setSubject( subject ); email.setToAddresses( toAddresses ); email.setPlainTextBody( body ); // Sends the email Messaging.SendEmailResult [] r = 181 Visualforce とメールの統合 メール添付ファイルの作成 Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email}); return null; } } コントローラでは、次の点に留意してください。 • メールの件名と本文は、別の Visualforce ページで設定され、コントローラに渡されます。 • メールを送信するメソッドは send() と呼ばれます。この名前は、メールを送信する Visualforce ボタンのアク ション名と一致する必要があります。 • メールの受信者、つまり、toAddresses[] に保存されているメールアドレスは、関連付けられた取引先で使 用可能な取引先責任者のアドレスから作成されます。取引先責任者、リード、またはその他のレコードから 受信者のリストをコンパイルするとき、すべてのレコードをループ処理してメールアドレスがレコードごと に定義されているか確認することをお勧めします。取引先 ID がページの URL から取得されます。 図 25 : sendEmailPage のフォーム例 メール添付ファイルの作成 メールに添付ファイルを追加する場合、必要なのはカスタムコントローラに数行のコードを追加することだけで す。メール添付ファイルのファイルの種類は Blob です。添付ファイルを作成するには、Apex 182 Visualforce とメールの統合 メール添付ファイルの作成 Messaging.EmailFileAttachment クラスを使用する必要があります。ファイル名と EmailFileAttachment オブジェクトの内容の両方を定義する必要があります。 PDF 添付ファイルの追加 次の例は、PDF として表示される Visualforce ページへの PageReference をメール添付ファイルに変換する方法 を示します。最初に、attachmentPDF というページを作成します。

Account Details

メモ: PDF 添付ファイルでの使用が推奨されるコンポーネントの詳細は、「PDF を表示するためのベス トプラクティス」 (ページ 285)を参照してください。 次に、カスタムコントローラの send() メソッドで EmailFileAttachment オブジェクトを作成します。次の例 は、Messaging.sendEmail のコールよりも前に配置する必要があります。 // Reference the attachment page, pass in the account ID PageReference pdf = Page.attachmentPDF; pdf.getParameters().put('id',(String)account.id); pdf.setRedirect(true); // Take the PDF content Blob b = pdf.getContent(); // Create the email attachment Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment(); efa.setFileName('attachment.pdf'); efa.setBody(b); SingleEmailMessage オブジェクトの名前が email の場合、添付ファイルを次のように関連付けます。 email.setFileAttachments(new Messaging.EmailFileAttachment[] {efa}); カスタムコンポーネントの添付ファイルとしての定義 カスタムコンポーネントを作成して Visualforce メールフォームで使用し、メールの PDF を表示することで、ユー ザは送信しようとしている内容のプレビューを表示できます。 183 Visualforce とメールの統合 メール添付ファイルの作成 次のマークアップは、メールの添付ファイルを表す、attachment という名前のカスタムコンポーネントを定義 します。

Account Details

attachmentPDF ページを次のように置き換えます。 次に、前の sendEmailPage の下部に表示するカスタムコンポーネントを追加します。 添付ファイルとプレビューの両方を変更する場合、attachment カスタムコンポーネントを変更するのは、どち らか一方の場所のみで済みます。 例: 添付ファイル付きメールの送信 次の例では、前の sendEmail の例に、Visualforce ページを添付ファイルとして追加するカスタムコンポーネント が加えられています。最初に、コントローラが次の処理を行います。 public class sendEmail { public String subject { get; set; } public String body { get; set; } private final Account account; // Create a constructor that populates the Account object public sendEmail() { account = [SELECT Name, (SELECT Contact.Name, Contact.Email FROM Account.Contacts) FROM Account WHERE Id = :ApexPages.currentPage().getParameters().get('id')]; } public Account getAccount() { return account; } 184 Visualforce とメールの統合 メール添付ファイルの作成 public PageReference send() { // Define the email Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); // Reference the attachment page and pass in the account ID PageReference pdf = Page.attachmentPDF; pdf.getParameters().put('id',(String)account.id); pdf.setRedirect(true); // Take the PDF content Blob b = pdf.getContent(); // Create the email attachment Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment(); efa.setFileName('attachment.pdf'); efa.setBody(b); String addresses; if (account.Contacts[0].Email != null) { addresses = account.Contacts[0].Email; // Loop through the whole list of contacts and their emails for (Integer i = 1; i < account.Contacts.size(); i++) { if (account.Contacts[i].Email != null) { addresses += ':' + account.Contacts[i].Email; } } } String[] toAddresses = addresses.split(':', 0); // Sets the paramaters of the email email.setSubject( subject ); email.setToAddresses( toAddresses ); email.setPlainTextBody( body ); email.setFileAttachments(new Messaging.EmailFileAttachment[] {efa}); // Sends the email Messaging.SendEmailResult [] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email}); return null; } } 次に、Visualforce ページがメールを送信します。

Fill out the fields below to test how you might send an email to a user.

Name {!contact.Name} Email {!contact.Email}

:


185 Visualforce とメールの統合 Visualforce メールテンプレート :


Visualforce メールテンプレート 開発者と管理者は Visualforce を使用してメールテンプレートを作成できます。標準 HTML メールテンプレート と比べて、Visualforce を使用する利点は、Visualforce では、受信者に送信するデータに対して高度な操作を実行 できることです。 Visualforce メールテンプレートは標準 Visualforce コンポーネントを使用しますが、作成方法が異なります。 Visualforce メールテンプレートは常に、messaging 名前空間で始まるコンポーネントを使用します。その他に、 次の操作を実行できます。 • すべての Visualforce メールテンプレートは 1 つの タグ内に含まれている必要 があります。これは、1 つの タグ内に定義される通常の Visualforce ページと似ています。 • タグには、単一の タグか、単一の タグのいずれかを含める必要があります。 • 複数の標準 Visualforce コンポーネントを 内で使用することはできません。こ れには、、およびすべての関連する pageBlock コンポーネント、さら に などのすべての入力コンポーネントが含まれます。これらのコンポーネントを使用する Visualforce メールテンプレートを保存しようとすると、エラーメッセージが表示されます。 詳細は、次のトピックを参照してください。 • Visualforce メールテンプレートの作成 • Visualforce メールテンプレートでのカスタムスタイルシートの使用 • ファイルの添付 • Visualforce メールテンプレート内でのカスタムコントローラの使用 Visualforce メールテンプレートの作成 Visualforce メールテンプレートを作成する手順は、次のとおりです。 1. 次のいずれかの操作を実行します。 • 公開テンプレートを編集する権限がある場合は、[設定] で [コミュニケーションテンプレート] > [メールテ ンプレート] をクリックします。 • 公開テンプレートを編集する権限がない場合は、任意の Salesforce ページ上部で、名前の横にある下向き 矢印をクリックします。名前の下にあるメニューで、[設定] または [私の設定] のどちらか表示されるほう を選択します。次に、ページの左側で [メール] > [私のテンプレート] をクリックします。 186 Visualforce とメールの統合 Visualforce メールテンプレートの作成 2. [新規テンプレート] をクリックします。 3. Visualforce を選択し、[次へ] をクリックします。 Visualforce メールテンプレートを使用して一括メール送信はできません。 4. テンプレートを保存するフォルダを選択します。 5. ユーザがメールを送信するときにこのテンプレートを使用できるようにするには、[有効] チェックボックス をオンにします。 6. [メールテンプレート名]を入力します。 7. 必要に応じて、[テンプレートの一意の名前] を変更します。この名前は、Force.com API の使用時にコンポー ネントを参照するために使用される一意の名前です。管理パッケージでは、この一意の名前により、パッケー ジのインストール時に名前が競合することを防ぎます。この名前は、アンダースコアと英数字のみを含み、 組織内で一意の名前にする必要があります。最初は文字であること、スペースは使用しない、最後にアンダー スコアを使用しない、2 つ続けてアンダースコアを使用しないという制約があります。[テンプレートの一意の 名前] 項目を使用すると、開発者は管理パッケージで特定のコンポーネント名を変更できます。この変更は、 登録者の組織に反映されます。 8. [文字コード] 設定を選択し、テンプレートの文字セットを指定します。 9. テンプレートの [説明] を入力します。テンプレートの名前と説明は、内部的にのみ使用されます。 10. [メール件名] にテンプレートの件名を入力します。 11. [受信者種別] ドロップダウンリストで、メールテンプレートを受け取る受信者の種別を選択します。 12. [関連先種別] ドロップダウンリストで、テンプレートが差し込み項目データを取得するオブジェクトを必要 に応じて選択します。 13. [保存] をクリックします。 14. [メールテンプレートの表示] ページで、[テンプレートを編集] をクリックします。 15. [テンプレートの編集] をクリックし、Visualforce メールテンプレートのマークアップテキストを入力します。 メモ: 画像を含める場合は、サーバ上にある画像のコピーを参照できるように [ドキュメント] タブに アップロードすることをお勧めします。次に例を示します。
Case NumberOrigin Creator EmailStatus
{!cx.CaseNumber} {!cx.Origin} {!cx.Contact.email} {!cx.Status}

For more detailed information login to Salesforce.com
このマークアップでは、次の点に留意してください。 • 属性 recipientType と relatedToType は、メールテンプレートのコントローラとして機能します。これら を使用して、他の標準コントローラで使用できるものと同じ差し込み項目にアクセスできます。recipientType 属性は、メールの受信者を表します。relatedToType 属性は、メールに関連付けるレコードを表します。 • コンポーネントには、Visualforce マークアップと HTML を両方とも含めるこ とができます。 コンポーネントには、Visualforce マークアップとプレー ンテキストのみを含めることができます。 • 受信者または関連オブジェクトの言語に基づいて Visualforce メールテンプレートを翻訳するには、 タグの language 属性を使用します (有効な値は、「en-US」などの Salesforce 188 Visualforce とメールの統合 Visualforce メールテンプレートでのカスタムスタイル シートの使用 サポート言語キー)。言語属性は、メールテンプレートの recipientType および relatedToType 属性の差込 項目を受け取ります。差し込み項目で使用するカスタム言語項目を作成します。メールテンプレートの翻訳 には、トランスレーションワークベンチが必要です。この例では、差し込み項目を使用して、メールを受信 する取引先責任者の language 属性を取得します。 関連リンク Visualforce メールテンプレートでのカスタムスタイルシートの使用 Visualforce メールテンプレートでのカスタムスタイルシートの使用 デフォルトでは、Visualforce メールテンプレートは、他の Salesforce コンポーネントの標準のデザインを必ず使用 します。ただし、自分のスタイルシートを定義してこれらのスタイルを拡張したり、上書きしたりすることがで きます。 他の Visualforce ページとは異なり、Visualforce メールテンプレートでは、参照されているページスタイルまたは 静的リソースを使用することはできません。CSS はメールテンプレートのプレビューペインでは表示されるよう に見えますが、メール受信者にはプレビューペインと同じようには表示されません。

Dear {!recipient.name},

189 Visualforce とメールの統合 Visualforce メールテンプレートでのカスタムスタイル シートの使用
Case NumberOrigin Creator EmailStatus
{!cx.CaseNumber} {!cx.Origin} {!cx.Contact.email} {!cx.Status}
図 26 : 表示されている Visualforce メールテンプレートの例 カスタムコンポーネントの Visualforce スタイルシートの定義 Visualforce メールテンプレートの外部スタイルシートを参照することはできませんが、他の場所で参照できるカ スタムコンポーネント内にスタイル定義を配置できます。たとえば、前の例を変更して、EmailStyle という名 前のコンポーネントにスタイル情報を配置できます。 その結果、Visualforce メールテンプレートで、そのコンポーネントのみを参照できます。

Dear {!recipient.name},

...
メモ: Visualforce メールテンプレート内で使用される タグには global のアクセスレ ベルが必要です。 ファイルの添付 Visualforce メールテンプレートに添付ファイルを追加することができます。各添付ファイルは、1 つの コンポーネント内にカプセル化する必要があります。 内 のコードでは、HTML と Visualforce タグを組み合わせることができます。 前の例は、データを反復処理してメール受信者に表示することで、Visualforce メールテンプレートを作成する方 法を示しています。次の例は、データを添付ファイルとして表示するようにそのマークアップを変更する方法を 示しています。

Dear {!recipient.name},

Attached is a list of cases related to {!relatedTo.name}.

For more detailed information login to Salesforce.com
191 Visualforce とメールの統合 ファイルの添付
Case Number: {!cx.CaseNumber} Origin: {!cx.Origin} Creator Email: {!cx.Contact.email} Case Number: {!cx.Status}
このマークアップは、添付データファイルとして、書式設定なしでメールに表示されます。次のいずれかのオプ ションを使用すると、データをより読みやすい形式で表示できます。 • ファイル名の変更 • renderAs 属性の変更 • スタイルと画像の追加 ファイル名の変更 タグには、添付されたファイルの名前を定義する filename という属性があります。 わかりやすい名前を定義することをお勧めしますが、必ずしもそのようにする必要はありません。未定義のまま にしておくと、Salesforce が名前を生成します。 拡張子のないファイル名は、デフォルトでテキストファイルになります。添付ファイルは CSV として表示でき ます。 {!cx.CaseNumber} {!cx.Origin} {!cx.Contact.email} {!cx.Status} データを HTML ファイルとして表示することもできます。
Case NumberOrigin Creator EmailStatus
{!cx.CaseNumber} {!cx.Origin} {!cx.Contact.email} {!cx.Status}
192 Visualforce とメールの統合 ファイルの添付 コンポーネントごとに定義できるファイル名は 1 つのみですが、メールには複数の ファイルを添付できます。 renderAs 属性の変更 他の Visualforce ページと同様に、 コンポーネントの renderAs 属性を PDF に設定す ると、添付ファイルが PDF として表示されます。次に例を示します。

You can display your {!relatedTo.name} cases as a PDF:

Case NumberOrigin Creator EmailStatus
{!cx.CaseNumber} {!cx.Origin} {!cx.Contact.email} {!cx.Status}
リリースする前に、表示されるページのフォーマットを確認してください。renderAs を使用する場合、次の点 に留意してください。 • • • • • サポートされている表示サービスは PDF のみです。 Visualforce ページを PDF として表示する機能は、印刷用にデザインされ、最適化されたページのためのもの です。 印刷用の書式設定が容易ではないか、入力やボタンなどのフォーム要素が含まれる標準コンポーネント、ま たは書式設定に JavaScript が必要なコンポーネントは使用しないでください。これには、フォーム要素が必要 なコンポーネントなどが含まれますが、これに限定されません。 PDF 表示では、JavaScript で表示されるコンテンツはサポートされていません。 PDF でページのすべてのテキスト (特に日本語などのマルチバイト文字やアクセント記号付きの国際文字) が 表示されない場合は、CSS のフォントを調整してそれに対応するフォントを使用します。次に例を示します。 これはサンプルページです。
This is a sample page: API version 28.0
193 Visualforce とメールの統合 Visualforce メールテンプレート内でのカスタムコント ローラの使用 • • • 選択したフォントは、Visualforce PDF 表示サービスで使用できる必要があります。現在、マルチバイト文字 を含む拡張文字でサポートされているフォントは「Arial Unicode MS」のみです。 PDF 作成時の最大応答サイズは、PDF として表示される前で 15 MB 未満です。これは Visualforce 要求の標 準制限です。 生成される PDF の最大ファイルサイズは、60 MB です。 生成された PDF に含まれるすべての画像の最大合計サイズは 30 MB です。 PDF 表示では、data: URI スキーム形式で符号化された画像はサポートされていません。 • 次のコンポーネントは、PDFとして表示するときに 2 バイトのフォントをサポートしません。 • ◊ PDF として表示するページでこのようなコンポーネントを使用することはお勧めしません。 スタイルと画像の追加 添付ファイルでは、スタイルシートを使用してデータの表示方法を変更することもできます。スタイルは、 Visualforce メールテンプレートと同じ方法 (インラインコードとして、またはカスタムコンポーネントを使用し て) で、添付ファイルに関連付けられています。 PDF として表示される添付ファイルは、$Resourceグローバル変数を使用して静的リソースを参照できます。こ れにより、PDF の本文内の画像またはスタイルシートを参照できます。 たとえば、次の添付ファイルでは PDF にロゴが含まれます。 ... この添付ファイルは、静的リソースとして保存したスタイルシートを参照します。 ... 警告: リモートサーバの静的リソースを参照すると、PDF 添付ファイルの表示に時間がかかる場合があ ります。Apex トリガで PDF 添付ファイルを作成する場合、リモートリソースは参照できません。参照 すると例外になります。 Visualforce メールテンプレート内でのカスタムコントローラの使用 Visualforce メールテンプレートでは、高度にカスタマイズされたコンテンツを表示するためにカスタムコントロー ラを活用できます。このためには、そのカスタムコントローラを使用する Visualforce メールテンプレートにカス タムコンポーネントを含めます。 194 Visualforce とメールの統合 Visualforce メールテンプレート内でのカスタムコント ローラの使用 たとえば、メールテンプレートで「Smith」という語で始まるすべての取引先のリストを表示するとします。こ のためには、まず、SOSL コールを使用するカスタムコントローラを作成して、「Smith」で始まる取引先のリ ストを返します。 public class findSmithAccounts { private final List accounts; public findSmithAccounts() { accounts = [select Name from Account where Name LIKE 'Smith_%']; } public List getSmithAccounts() { return accounts; } } 次に、このコントローラを使用する smithAccounts というカスタムコンポーネントを作成します。 Account Name {!s_account.Name} ヒント: Visualforce メールテンプレートで使用されているすべてのカスタムコンポーネントには global の access レベルが必要です。 最後に、smithAccounts コンポーネントを含む Visualforce メールテンプレートを作成します。

As you requested, here's a list of all our Smith accounts:

Hope this helps with the {!relatedToType}.

emailTemplate コンポーネントには relatedToType 属性が必要ですが、この例ではこの属性は有効ではありま せん。この属性には、カスタムコンポーネントで使用されているオブジェクトとは異なるオブジェクト値をこの 属性が取ることができるということを示す目的でのみ、"Opportunity" という値が設定されています。 メモ: メールテンプレートで標準コントローラを使用する場合は、共有設定が適用されます。ユーザオブ ジェクトの組織の共有設定が [非公開] に設定されており、Visualforce メールテンプレートで名前やメー ルアドレスなどのユーザ情報にアクセスする必要がある場合は、without sharing キーワードを使用し てカスタムコンポーネントまたはカスタムコントローラを使用できます。 ユーザオブジェクトの共有についての詳細は、Salesforce オンラインヘルプの「ユーザ共有の概要」を参 照してください。 195 第 15 章 Visualforce Charting Visualforce Charting は、単純で直観的な方法で Visualforce ページおよびカスタムコンポーネントにグラフを作成 することができるコンポーネントのコレクションです。 Visualforce Charting とは? Visualforce Charting では、SOQL クエリから直接作成するデータセットに基づいて、または独自の Apex コード でデータセットを作成することで、カスタマイズされたビジネスグラフを簡単に作成する方法を提供します。個 別のデータ系列を組み合わせて設定することにより、組織にとって有用な方法でデータを表示するグラフを作成 できます。 Visualforce グラフは、JavaScript を使用してクライアント側に表示されます。この機能により、アニメーション効 果が設定されたグラフや視覚的に魅力的なグラフを作成できます。また、グラフのデータを非同期に読み込み/ 再読み込みすることで、反応が早いと感じさせるページを作成できます。 Visualforce Charting を使用する理由は? 標準の Salesforce グラフおよびダッシュボードでは不十分な場合や、組織にとってより有用になるようにグラフ とデータテーブルを組み合わせるカスタムページを作成する場合は、Visualforce Charting を使用します。 Visualforce Charting に代わる機能 Salesforce では、さまざまなビジネスグラフをサポートする多数のダッシュボードおよびレポートを提供していま す。Visualforce または Apex でのプログラミングが不要なため、これらのグラフをさらに簡単に作成およびカス タマイズできます。組み込みのグラフ作成およびレポート作成についての詳細は、Salesforce オンラインヘルプの Salesforce ヘルプの 「ダッシュボードを使用した洞察の共有」を参照してください。 Visualforce Charting は柔軟性に富むだけでなく、簡単に使用できるように設計されています。ビジネスグラフィッ クスで一般的に使用されるさまざまな棒グラフ、折れ線グラフ、面グラフ、円グラフの他に、より専門的なグラ フ作成用にレーダーグラフ、ゲージグラフ、散布図を提供します。他のタイプのグラフが必要であったり、ユー ザまたはページとの高度な対話機能を追加する場合は、代わりに JavaScript Charting ライブラリの使用を検討す ることをお勧めします。このライブラリを使用すると作業量が増加しますが、より多くのカスタマイズを行うこ とができます。例として、「Visualforce と Google Chart の統合」 (ページ 121)を参照してください。Visualforce で の JavaScript ライブラリの使用方法についての詳細は、Visualforce ページでの JavaScript の使用 (ページ 264)を参照 してください。 Visualforce Charting の制限および考慮事項 このセクションでは、Visualforce Charting の考慮事項および既知の制限をリストします。 196 Visualforce Charting のしくみ Visualforce Charting • Visualforce のグラフは SVG (Scalable Vector Graphics) をサポートするブラウザでのみ表示されます。詳細は、 「WC3 SVG Working Group」を参照してください。 • Visualforce Charting では JavaScript を使用してグラフを描画します。Visualforce のグラフは PDF として表示さ れるページでは表示されません。 • メールクライアントは、通常、メッセージでの JavaScript の実行をサポートしません。メールメッセージまた はメールテンプレートでは Visualforce Charting を使用しないでください。 • Visualforce Charting は、JavaScript コンソールにエラーおよびメッセージを送信します。開発時は、Firebug な どの JavaScript のデバッグツールを有効な状態に保ってください。 • 動的 (Apex で生成される) グラフコンポーネントは、現在、サポートされていません。 Visualforce Charting のしくみ Visualforce グラフは、一連のグラフコンポーネントを使用して定義され、その後コンポーネントはそのグラフで グラフ化するデータソースにリンクされます。 Visualforce でグラフを作成するには、次の操作を実行します。 1. グラフデータをクエリ、計算、およびラップして、ブラウザに送信する Apex メソッドを記述する。 2. Visualforce Charting コンポーネントを使用してグラフを定義する。 グラフを含むページの読み込み時に、グラフデータがグラフコンポーネントにバインドされ、グラフを描画する JavaScript が生成されます。JavaScript を実行すると、グラフがブラウザ内で描画されます。 単純なグラフ作成の例 Visualforce グラフでは、少なくとも 1 つのデータ系列コンポーネントを囲むグラフコンテナコンポーネントを作 成する必要があります。必要に応じて、追加の系列コンポーネント、グラフの軸、および凡例、グラフのラベル およびデータポイントのツールチップなどのラベルコンポーネントを追加できます。 次は単純な円グラフとこの円グラフを作成するマークアップです。 197 グラフデータの提供 Visualforce Charting コンポーネントは、グラフコンテナを定義し、そのコンポーネントをデータソース、getPieData() コントローラメソッドにバインドします。 は、返されるデータにアクセスしたり、各データ ポイントのラベル付けおよびサイズ設定をしたりするラベル項目およびデータ項目を記述します。 関連付けられているコントローラを次に示します。 public class PieChartController { public List getPieData() { List data = new List(); data.add(new PieWedgeData('Jan', 30)); data.add(new PieWedgeData('Feb', 15)); data.add(new PieWedgeData('Mar', 10)); data.add(new PieWedgeData('Apr', 20)); data.add(new PieWedgeData('May', 20)); data.add(new PieWedgeData('Jun', 5)); return data; } // Wrapper class public class PieWedgeData { public String name { get; set; } public Integer data { get; set; } public PieWedgeData(String name, Integer data) { this.name = name; this.data = data; } } } このコントローラは、意図的に単純にしています。通常、データを収集するには 1 つ以上の SOQL クエリを発 行します。 この例が示す重要なポイントを次に示します。 • getPieData() メソッドは、ラッパーとして使用される内部クラス PieWedgeData という単純なオブジェクト のリストを返す。リストの各要素は、データポイントの作成に使用されます。 • PieWedgeData クラスは単なるプロパティのセットであるが、基本的には、name=value ストアとして使用さ れる。 • グラフ系列コンポーネント では、系列内の各ポイントの決定に使用する PieWedgeData クラスのプロパティを定義する。この単純な例には不明確な部分はありませんが、複数の系列および軸を含 むグラフでは、この規則により、1 つの List オブジェクトでデータセット全体を効率的に返すことができま す。 グラフデータの提供 Visualforce グラフは、 コンポーネントのデータ属性を使用してそのデータのソースにバインドさ れます。 データは次の複数の方法で提供できます。 • コントローラメソッド参照を表す式 • JavaScript 関数を表す文字列 198 コントローラメソッドを使用したグラフデータの提供 Visualforce Charting JavaScript 配列を表す文字列 • 関連リンク コントローラメソッドを使用したグラフデータの提供 JavaScript 関数を使用したグラフデータの提供 JavaScript 配列を使用したグラフデータの提供 グラフデータの形式 コントローラメソッドを使用したグラフデータの提供 グラフにデータを提供する最も簡単な方法は、コントローラメソッドを参照する Visualforce 式を使用することで す。 data 属性でコントローラを参照するだけですみます。 サーバ側では、単純なグラフ作成の例 (ページ 197)にあるような独自の Apex ラッパーオブジェクト、sObject、ま たは AggregateResult オブジェクトにすることができるオブジェクトのリストを返すコントローラメソッドを 記述します。このメソッドは、サーバ側で評価され、結果が JSON に逐次化されます。クライアントでは、 がこれらの結果を直接使用するため、結果をさらに処理することはできません。 以下は、sObject を使用してこの技法を説明するための Opportunities (商談) のリストおよびその金額の棒グラフ を返す単純なコントローラです。 public class OppsController { // Get a set of Opportunities public ApexPages.StandardSetController setCon { get { if(setCon == null) { setCon = new ApexPages.StandardSetController(Database.getQueryLocator( [SELECT name, type, amount, closedate FROM Opportunity])); setCon.setPageSize(5); } return setCon; } set; } public List getOpportunities() { return (List) setCon.getRecords(); } } 199 JavaScript 関数を使用したグラフデータの提供 Visualforce Charting この例に関する 2 つの重要な注意事項を次に示します。 • Visualforce グラフコンポーネントは、単純なグラフ作成の例 (ページ 197)で使用される単純なデータオブジェ クトと同じ方法で、Opportunity sObject のリストのデータ属性にアクセスする。 • データ属性として使用されるオブジェクト項目名では JavaScript では大文字と小文字が区別されるが、Apex および Visualforce の項目名では区別されない。軸およびデータ系列コンポーネントの fields 属性、xField 属性、およびyField 属性の正確な項目名を使用するように注意してください。正確な項目を使用しない場合 は、グラフが作成されず、エラーメッセージも表示されません。 関連リンク グラフデータの形式 を使用したグラフデータの更新 JavaScript 関数を使用したグラフデータの提供 JavaScript Remoting を使用してデータにアクセスする場合、または外部 (Salesforce 以外) データソースにアクセス する場合、データを提供する JavaScript 関数の名前を コンポーネントに指定します。JavaScript 関 数は、Visualforce ページで定義またはリンクされている必要があります。 この関数では、結果を に渡す前に結果を操作したり、その他のユーザインターフェースまたは ページの更新を実行したりできます。 JavaScript 関数はパラメータとしてコールバック関数を取り、関数のデータ結果オブジェクトを使用してコール バックを呼び出します。最も単純で有効な JavaScript 関数は次のようになります。 200 JavaScript 配列を使用したグラフデータの提供 Visualforce Charting このグラフをサポートするには、単純なグラフ作成の例 (ページ 197)で定義されている PieChartController ク ラスに次のコントローラメソッドを追加します。 @RemoteAction public static List getRemotePieData() { List data = new List(); data.add(new PieWedgeData('Jan', 30)); data.add(new PieWedgeData('Feb', 15)); data.add(new PieWedgeData('Mar', 10)); data.add(new PieWedgeData('Apr', 20)); data.add(new PieWedgeData('May', 20)); data.add(new PieWedgeData('Jun', 5)); return data; } 関連リンク グラフデータの形式 Apex コントローラの JavaScript Remoting JavaScript Remoting を使用したグラフデータの更新 JavaScript 配列を使用したグラフデータの提供 ページの独自の JavaScript コードで JavaScript 配列を作成して、その配列の名前を に提供すること により、Salesforce 以外のデータソースで Visualforce Charting を使用できます。 次の単純なコードは、この手法を示しています。 この手法を使用すると、データを Salesforce 以外のソースから取得する場合、サーバ側の Apex コードは一切必要 ないことがあります。 関連リンク グラフデータの形式 グラフデータの形式 Visualforce グラフに提供されるデータは、特定の要件を満たしている必要があります。データ収集のどの要素に も、そのデータソースにバインドされている コンポーネント階層で参照されているすべての項目 を含める必要があります。すべての項目が提供されない場合、クライアント側の JavaScript エラーが発生します。 これは、Firebug などの JavaScript コンソールで参照できます。 201 Visualforce Charting を使用した複雑なグラフの作成 Visualforce Charting Apex メソッドで提供されるグラフデータは一定のオブジェクトのリストである必要があります。これらのオブ ジェクトは、単純なラッパー、sObject、または AggregateResult オブジェクトの場合があります。データ項目 は、公開メンバー変数またはプロパティとしてアクセス可能にできます。 JavaScript メソッドで提供されるグラフデータは配列の JavaScript 配列である必要があります。各内部配列は、レ コードまたはデータポイントを表します。データ項目は、名前: 値ペアとしてアクセス可能にできます。例につ いては、「JavaScript 配列を使用したグラフデータの提供」 (ページ 201)を参照してください。 関連リンク JavaScript 配列を使用したグラフデータの提供 Visualforce Charting を使用した複雑なグラフの作成 Visualforce Charting を使用して、さまざまなグラフコンポーネントから、関連データの複数のセットを表す複雑 なグラフを作成します。最終的に、非常に洗練された注目を集めるグラフを作成できます。 グラフコントローラ このトピックの後半の例では、次のコントローラを使用します。このコントローラは、単純なグラフ作成の例の コントローラを少し拡張したものです。リモート JavaScript 呼び出しでコールできる、より多くのデータおよび メソッドが含まれます。 public class ChartController { // Return a list of data points for a chart public List getData() { return ChartController.getChartData(); } // Make the chart data available via JavaScript remoting @RemoteAction public static List getRemoteData() { return ChartController.getChartData(); } // The actual chart data; needs to be static to be // called by a @RemoteAction method public static List getChartData() { List data = new List(); data.add(new Data('Jan', 30, 90, 55)); data.add(new Data('Feb', 44, 15, 65)); data.add(new Data('Mar', 25, 32, 75)); data.add(new Data('Apr', 74, 28, 85)); data.add(new Data('May', 65, 51, 95)); data.add(new Data('Jun', 33, 45, 99)); data.add(new Data('Jul', 92, 82, 30)); data.add(new Data('Aug', 87, 73, 45)); data.add(new Data('Sep', 34, 65, 55)); data.add(new Data('Oct', 78, 66, 56)); data.add(new Data('Nov', 80, 67, 53)); data.add(new Data('Dec', 17, 70, 70)); return data; } // Wrapper class public class Data { public String name { public Integer data1 public Integer data2 public Integer data3 get; set; } { get; set; } { get; set; } { get; set; } 202 Visualforce Charting を使用した複雑なグラフの作成 Visualforce Charting public Data(String name, Integer data1, Integer data2, Integer data3) { this.name = name; this.data1 = data1; this.data2 = data2; this.data3 = data3; } } } メモ: @RemoteAction メソッドはこのトピックのグラフの例では使用されませんが、サーバ側メソッド および JavaScript Remoting メソッドの両方のデータ生成メソッドを再利用する方法を示します。 単純な折れ線グラフの作成 次は、1 暦年で「成立した商談」というデータセットの 3 つのデータ系列の 1 つをグラフ化した単純な折れ線グ ラフです。 この例では、次の点を確認してください。 • • • • 折れ線グラフおよび棒グラフでは、グラフの X 軸と Y 軸を定義する必要がある。 縦軸はグラフの左側に定義され、その月に成立した商談の金額を示す。 横軸はグラフの下部に定義され、暦年の月を表す。 実際の折れ線グラフ、 コンポーネントは特定の軸にバインドされる。 • グラフの各線の差別化に使用できるいくつかのマーカー属性がある。 2 番目のデータ系列の追加 同じ測定単位を使用する 2 番目のデータ系列は簡単に追加できます。ここでは、「不成立の商談」データセット を 2 番目の折れ線系列として追加します。 203 Visualforce Charting を使用した複雑なグラフの作成 Visualforce Charting 重要なのは、data1 項目および data2 項目の両方がそのコンポーネントの項目属性によって縦の にバインドされている方法を確認することです。これにより、グラフ作成エンジンが軸の適切な目盛りと刻みの マークを特定できます。 2 番目の軸を使用した棒グラフの系列を追加 他の単位でグラフを作成するもう 1 つのデータ系列を追加するには、2 番目の縦軸を追加する必要があります。 次に、データ系列「月別収益」が棒グラフとして追加された例を示します。 204 Visualforce Charting を使用した複雑なグラフの作成 Visualforce Charting 次の点を確認してください。 • • • 新しい測定単位を使用するデータ系統を追加するには、グラフの右側に 2 番目の縦軸を追加する必要がある。 グラフの各境界に 1 つ、最大 4 つの異なる軸を設定できる。 棒グラフは縦方向に設定され、右の軸にバインドされている。横棒グラフは上軸または下軸にバインドされ ている。 凡例、ラベル、およびグラフのヒントの追加 グラフの凡例、系列ラベルを追加したり、グラフのラベルを確実に読むことができるようにすることで、グラフ を分かりやすくすることができます。 205 更新されたデータによるグラフの更新 Visualforce Charting これらの追加については、次の点を確認してください。 • データ系列コンポーネントの順序が、グラフを描画する際のグラフ要素のレイヤを決定する。前の例では、 棒グラフは前面に配置されていました。この例では、2 つの コンポーネントの前に コンポーネントがあるため、棒グラフが背面に配置されています。 • コンポーネントは、左、右、上、または下の 4 つのどの位置にも配置できる。凡例はグラフ • の境界線内に配置されます。この例では、凡例によってグラフ自体の横幅が圧縮されています。 データ系列のコンポーネント title 属性を使用して凡例タイトルを追加する。 • グラフの下軸のラベルを回転させるために、 コンポーネントはこのコンポーネントが影 響する コンポーネントで囲まれている。 • コンポーネントにより、このコンポーネントを囲む系列の各データポイントの詳細を示 すロールオーバーツールのヒントを有効にできる。 関連リンク Visualforce Charting のしくみ 更新されたデータによるグラフの更新 新規または更新されたデータでグラフを再描画するには、 コンポーネントを使用する か、JavaScript Remoting と独自の JavaScript コードを使用します。 では、Visualforce のみを使用してグラフを更新します。JavaScript Remoting では、JavaScript コードを作成する必要がありますが、柔軟性が向上し、より円滑に更新できます。 を使用したグラフデータの更新 ユーザのアクションに応じて Visualforce グラフを更新するには、 コンポーネントを、 グラフのデータに影響する Visualforce ユーザインターフェース要素に追加します。 JavaScript Remoting を使用したグラフデータの更新 Visualforce グラフは、カスタム JavaScript を使用して、定期的に、またはユーザのアクションに応じて更新しま す。JavaScript コードを使用すると、複雑なユーザ活動やタイマーイベントに対応できます。また、 JavaScript Remotingを使用して、新しいグラフデータを必要なときにいつでも取得できます。 を使用したグラフデータの更新 ユーザのアクションに応じて Visualforce グラフを更新するには、 コンポーネントを、 グラフのデータに影響する Visualforce ユーザインターフェース要素に追加します。 次のマークアップでは、グラフの横にあるメニューから新しい年を選択して更新可能な円グラフを表示します。 206 を使用したグラフデータの更新 Visualforce Charting このマークアップでは、グラフの data 属性を Visualforce 式 {!pieData} に設定することで、グラフコンポーネ ントをそのデータソースに添付します。式は、getPieData() コントローラメソッドをコールし、コントローラ メソッドからデータが返されます。グラフは、theChart という id 属性を持つ でラップ されます。 コンポーネントは、グラフの更新が必要な場合に、ページのコントローラに新しい年を返送する ために使用されます。 タグは、グラフで使用可能な年を表示し、子 タグは、メニューが変わると常にフォームを送信します。グラフの の id である theChart は、reRender 属性で、ページ全体を再読み込みするのではなく、更新をグラフのみに 制限するために使用されます。さらに、 コンポーネントは、グラフの更新中に状況メッ セージを提供します。短いテキストメッセージをアニメーショングラフィックやテキスト効果で簡単に置き換え ることができます。 PieChartRemoteController このページのコントローラは、「単純なグラフ作成の例」 (ページ 197)で使用されている円グラフコントローラ を拡張したものです。 public class PieChartRemoteController { // The year to be charted public String chartYear { get { if (chartYear == Null) chartYear = '2013'; return chartYear; } set; } // Years available to be charted, for public static List getChartYearOptions() { List years = new List(); years.add(new SelectOption('2013','2013')); years.add(new SelectOption('2012','2012')); years.add(new SelectOption('2011','2011')); years.add(new SelectOption('2010','2010')); return years; } public List getPieData() { // Visualforce expressions can't pass parameters, so get from property return PieChartRemoteController.generatePieData(this.chartYear); } @RemoteAction 207 JavaScript Remoting を使用したグラフデータの更新 Visualforce Charting public static List getRemotePieData(String year) { // Remoting calls can send parameters with the call return PieChartRemoteController.generatePieData(year); } // Private data "generator" private static List generatePieData(String year) { List data = new List(); if(year.equals('2013')) { // These numbers are absolute quantities, not percentages // The chart component will calculate the percentages data.add(new PieWedgeData('Jan', 30)); data.add(new PieWedgeData('Feb', 15)); data.add(new PieWedgeData('Mar', 10)); data.add(new PieWedgeData('Apr', 20)); data.add(new PieWedgeData('May', 20)); data.add(new PieWedgeData('Jun', 5)); } else { data.add(new PieWedgeData('Jan', 20)); data.add(new PieWedgeData('Feb', 35)); data.add(new PieWedgeData('Mar', 30)); data.add(new PieWedgeData('Apr', 40)); data.add(new PieWedgeData('May', 5)); data.add(new PieWedgeData('Jun', 10)); } return data; } // Wrapper class public class PieWedgeData { public String name { get; set; } public Integer data { get; set; } public PieWedgeData(String name, Integer data) { this.name = name; this.data = data; } } } このコントローラは、Visualforce グラフへのデータ提供に 2 つの異なる方法をサポートしています。 • Visualforce 式 {!pieData} を使用してインスタンスメソッド getPieData() をコールする • @RemoteAction 静的メソッド getRemotePieData() を JavaScript メソッドからコールして JavaScript Remoting を使用する 関連リンク JavaScript Remoting を使用したグラフデータの更新 コントローラメソッドを使用したグラフデータの提供 apex:actionSupport apex:actionStatus JavaScript Remoting を使用したグラフデータの更新 Visualforce グラフは、カスタム JavaScript を使用して、定期的に、またはユーザのアクションに応じて更新しま す。JavaScript コードを使用すると、複雑なユーザ活動やタイマーイベントに対応できます。また、 JavaScript Remotingを使用して、新しいグラフデータを必要なときにいつでも取得できます。 208 JavaScript Remoting を使用したグラフデータの更新 Visualforce Charting 次のマークアップでは、グラフの横にあるメニューから新しい年を選択して更新可能な円グラフを表示します。
209 JavaScript Remoting を使用したグラフデータの更新 Visualforce Charting このマークアップでは、グラフの data 属性を JavaScript 関数 retrieveChartData の名前に設定することで、グ ラフコンポーネントをデータソースに添付します。データはこの関数から返されます。関数の名前は文字列とし て指定します。 静的 HTML メニューの onChange 属性が、メニューが変更されたときには常に JavaScript 関数 refreshRemoteChart() を コールします。さらに 2 つの静的 HTML 要素として、ID を持つ タグが 2 つあります。 タグは、 ページ読み込み時は空で、JavaScript 経由で更新されると必要に応じて状況とエラーメッセージを表示します。 Visualforce マークアップの前にある 2 つの JavaScript 関数は、Visualforce グラフと、データを提供する @RemoteAction コントローラメソッドをつなぎます。関数とグラフコンポーネントの間には 3 つのリンクがあ ります。 1. グラフコンポーネントの data 属性は、最初の JavaScript 関数の名前である「retrieveChartData」に設定されま す。これにより、グラフコンポーネントに、その JavaScript 関数を使用してデータを読み込むように指示しま す。グラフコンポーネントは、グラフが最初に作成されてデータが初期読み込みされるときに retrieveChartData() を 1 回だけ直接呼び出します。 2. 再読み込みは、2 つ目の JavaScript 関数 refreshRemoteChart() がコールされると行われます。これが、 theYear メニューからの 2 つ目のリンクです。年メニューが変更されると、refreshRemoteChart() が呼び 出され、そこから retrieveChartData() 関数が再呼び出しされて新しいデータのセットが読み込まれます。 3. refreshRemoteChart() が retrieveChartData() を呼び出すと、コールバックとして匿名関数が提供さ れ、この匿名関数が @RemoteAction コールで返された結果を処理します。このコールバックが、 RemotingPieChart.reload(data) をコールしてグラフを更新します。グラフ自体は name 属性を設定して 指定した RemotingPieChart であり、reload() は、作成された Visualforce グラフで使用可能な JavaScript 関 数で、新しいデータを受け入れてグラフを再描画します。 この図は、ページのさまざまなコンポーネント間のリンクを示しています。 210 JavaScript Remoting を使用したグラフデータの更新 Visualforce Charting グラフの初期読み込みシーケンスは単純です。RemotePieChart という が retrieveChartData() をコールして初期データを取得し、retrieveChartData() はデータを取得すると RemotePieChart.show() を コールします。こうしてグラフが表示されます。 更新はもっと複雑です。新しい年が theYear メニューから選択されると、メニューの onChange イベントが起 動され、refreshRemoteChart() 関数をコールします。次に refreshRemoteChart() が retrieveChartData() 関数をコールし、@RemoteAction が新しいデータを返すと、retrieveChartData() が (refreshRemoteChart() で提供されるコールバック経由で) RemotePieChart.reload() をコールします。こうしてグラフが更新されま す。 その他に、いくつか注意点があります。 • は hidden="true" 属性を使用して、表示するデータが揃う前にグラフが表示されないように します。グラフデータが読み込まれたら、retrieveChartData() 関数が RemotingPieChart.show() をコー ルしてグラフを表示します。これと RemotingPieChart.reload() によって、 を使 用して表示する場合よりもはるかに滑らかなグラフアニメーションを表示できます。 • refreshRemoteData() 関数は、retrieveChartData() をコールしてデータの更新を試みる前に、 statusElement HTML を「loading… (読み込み中)」メッセージに設定し、データが返されてグラフ が更新されたら、匿名コールバック関数が空の文字列に設定してメッセージを非表示にします。基本的に同 じ効果を得るために を使用する場合よりも作業が若干多くなります。同じ手法を使 用して「busy (処理中)」アニメーションやグラフィックを簡単に表示できます。 PieChartRemoteController このページのコントローラは、単純なグラフ作成の例 (ページ 197)で使用されている円グラフコントローラを拡 張したものです。 public class PieChartRemoteController { // The year to be charted public String chartYear { get { if (chartYear == Null) chartYear = '2013'; return chartYear; } set; } // Years available to be charted, for public static List getChartYearOptions() { List years = new List(); years.add(new SelectOption('2013','2013')); years.add(new SelectOption('2012','2012')); years.add(new SelectOption('2011','2011')); years.add(new SelectOption('2010','2010')); return years; } public List getPieData() { // Visualforce expressions can't pass parameters, so get from property return PieChartRemoteController.generatePieData(this.chartYear); } @RemoteAction public static List getRemotePieData(String year) { // Remoting calls can send parameters with the call return PieChartRemoteController.generatePieData(year); } // Private data "generator" 211 グラフの外観の制御 Visualforce Charting private static List generatePieData(String year) { List data = new List(); if(year.equals('2013')) { // These numbers are absolute quantities, not percentages // The chart component will calculate the percentages data.add(new PieWedgeData('Jan', 30)); data.add(new PieWedgeData('Feb', 15)); data.add(new PieWedgeData('Mar', 10)); data.add(new PieWedgeData('Apr', 20)); data.add(new PieWedgeData('May', 20)); data.add(new PieWedgeData('Jun', 5)); } else { data.add(new PieWedgeData('Jan', 20)); data.add(new PieWedgeData('Feb', 35)); data.add(new PieWedgeData('Mar', 30)); data.add(new PieWedgeData('Apr', 40)); data.add(new PieWedgeData('May', 5)); data.add(new PieWedgeData('Jun', 10)); } return data; } // Wrapper class public class PieWedgeData { public String name { get; set; } public Integer data { get; set; } public PieWedgeData(String name, Integer data) { this.name = name; this.data = data; } } } このコントローラは、Visualforce グラフへのデータ提供に 2 つの異なる方法をサポートしています。 • Visualforce 式 {!pieData} を使用してインスタンスメソッド getPieData() をコールする • @RemoteAction 静的メソッド getRemotePieData() を JavaScript メソッドからコールして JavaScript Remoting を使用する 関連リンク を使用したグラフデータの更新 JavaScript 関数を使用したグラフデータの提供 Apex コントローラの JavaScript Remoting グラフの外観の制御 Visualforce のグラフは、高度なカスタマイズが可能です。さまざまな種類のデータ系列を組み合わせたり、グラ フの要素の色を制御したり、マーカーや線などのデザインを制御したりできます。 次の事項をカスタマイズできます。 • データ系列要素の線と塗りつぶしの色 • 塗りつぶしの色と線の不透明度 • データポイントのマーカーの形状と色 • 結線の太さ 212 グラフの色 Visualforce Charting • データ要素の強調表示 • 軸の目盛りとグリッド線のスタイル • 凡例、ラベル、およびロールオーバー表示されるツールチップ形式のアノテーション この制御が可能なコンポーネントおよび属性の多くについては、「標準コンポーネントの参照」で説明します。 属性とコンポーネントを組み合わせる必要がある効果もあります。これらについてはこのドキュメントでさらに 詳しく説明します。 グラフの色 デフォルトでは、視覚的に一貫したダッシュボードを作成できるように、グラフの色は組み込みのレポート作成 および分析グラフの色と同じになります。独自の配色を作成する場合、ほとんどのグラフ要素の色をカスタマイ ズできます。 データ系列要素 (棒、円グラフの系列など) を描画する一連の色の定義を指定するには、colorSet 属性を使用し ます。グラフのすべてのデータ系列に使用する色を指定するには、 を設定しま す。データ系列コンポーネントに colorSet を設定すると、その系列のみに色が指定されます。 colorSet は HTML スタイルの 16 進数の色定義をカンマで区切ったリストの文字列です。たとえば、 colorSet="#0A224E,#BF381A,#A0D8F1,#E9AF32,#E07628" です。色は順に使用されます。リストの最後に達 すると、再び最初の色から開始されます。 円グラフの系列の色にカスタム配色を使用している例を次に示します。 グラフ全体の背景色を設定するには、background 属性を使用します。 colorSet は を除くすべてのデータ系列コンポーネントに使用できます。colorSet の詳 細および他のグラフ要素の色を設定するオプションについては、特定のデータ系列コンポーネントのセクション で説明します。 213 グラフのレイアウトとアノテーション Visualforce Charting グラフのレイアウトとアノテーション わかりやすいグラフを作成するには、凡例、有意義な軸範囲とラベル、データ要素のヒントまたはラベルを追加 します。 デフォルトでは、すべてのグラフに凡例が表示されます。デフォルトの凡例を非表示にするには、 に設定します。凡例の配置と凡例項目の間隔を制御するには、グラフに コ ンポーネントを追加します。position 属性を使用して、グラフの四辺の境界のいずれかに凡例を配置します。 凡例で使用するテキストスタイルを制御するには、font 属性を使用します。font 属性は、CSS スタイルの短縮 フォントプロパティを指定する文字列です。たとえば、 です。 軸の目盛りとラベルを適切に設定しているかどうかは、理解不能な誤解を招くグラフになっているか、明確で説 得力のあるグラフになっているかの違いとして現れます。デフォルトで、 コン ポーネントには fields 属性で設定したデータ項目に基づいて自動的に目盛りが設定されます。自動目盛り設定 を使用すると、グラフ上にすべてのデータが収まりますが、開始値または終了値が有意義な数値ではない場合が あります。自動目盛り設定を上書きするには、minimum 属性と maximum 属性を使用します。刻みマークの間隔 を設定するには、steps 属性を使用します。この属性は、軸の両端間のステップ数を指定する整数です。測定値 と目盛りを比べやすくするためにグラフに線や網かけを追加するには、dashSize 属性、grid 属性や gridFill 属性を使用します。 軸とデータ系列にはグラフラベルを適用できます。 の子の場合、ラベル は軸の外側に描画されます。 がデータ系列コンポーネントの子の場合、ラベルはグラフの データ要素の上か近くに描画されます。ラベルのテキストを設定するには、field 属性を使用します。ラベルを 描画する場所を設定するには、display 属性を使用します。グラフ上に収まるようにラベルのテキストを調整す るには、orientation 属性や rotate 属性を使用します。 メモ: コンポーネントが コンポーネントと一緒に使用されて いる場合、orientation 属性による影響はありません。 次のサンプルグラフでは、これらのコンポーネントと属性を数多く使用して、見た目にわかりやすいデザインを 作成しています。 214 棒グラフ Visualforce Charting 棒グラフ 棒グラフは、Visualforce で使用できる線形データ系列グラフの 1 つです。線形系列グラフは、標準の長方形グリッ ドに対してプロットされるグラフです。 線形系列の各データ要素は、X,Y 座標で記述されます。グリッド上に座標を描画する方法はデータ系列によって 定義されます。 グラフには、原点軸から X,Y 座標まで伸びる棒が描画されます。原点軸が左 軸 (Y) なのか、または下軸 (X) なのかは、orientation 属性により決まります。グラフの左辺を棒の始点にする 場合は に設定し、棒がグラフの底辺から上に伸びる縦棒グラ フの場合は に設定します。 各棒の区間に複数のデータポイントをプロットするには、1 つの タグ内に棒をグループ化ま たは積み上げます。1 つのグラフに複数の タグを含めると、重なり合って描画されるため、 最後のデータ系列以外はすべて覆い隠れてしまいます。縦棒グラフを作成するには、グループ化して、または積 み上げて表示するすべての項目を yField 属性に追加します。 デフォルトでは、 のデータ項目はグループ化されてグラフに表示されます。データ項目を相 互に積み上げる場合は、stacked="true" に設定します。 グループ化される各棒の間隔を調整するには、gutter 属性を使用します。グループの間隔を調整するには、 groupGutter 属性を使用します。グラフの軸と棒自体の間隔を調整するには、xPadding 属性と yPadding 属性 を使用します。 デフォルトでは、積み上げまたはグループ化棒グラフの凡例のタイトルには、yField 属性の項目の名前が使用 されます。上の例では、デフォルトのタイトルは「data1」、「data2」、「data3」になります。凡例によりわか 215 その他の線形系列グラフ Visualforce Charting りやすいタイトルを付けるには、 コンポーネントの title 属性を使用します。各項目はカ ンマで区切ります。たとえば、title="MacDonald,Promas,Worle" のように使用します。 関連リンク グラフの色 グラフのレイアウトとアノテーション その他の線形系列グラフ その他の線形データ系列グラフには、面グラフ ()、折れ線グラフ ()、 および散布図 ( ) があります。 同じグラフで複数の線形データ系列グラフを組み合わせることができますが、わかりやすいグラフを作成するに は、次の点に留意してください。 • データ系列グラフは、Visualforce マークアップで定義した順に重ねて描画される。 • 通常、 グラフは背景に表示する必要があり、透明にできないため、最初に定義する。 コンポーネントは積み上げ棒グラフと似ていますが、個々の棒の代わりに、系列の各点を 線で結んで定義される網掛け領域として描画されます。 を別のデータ系列と組み合わせる には、opacity 属性を使用して面グラフを部分的に透明にします。opacity 属性は、0.0 ~ 1.0 までの浮動小数 点の数値です。0.0 は完全に透明、1.0 は完全に不透明を表します。棒グラフの系列と組み合わせた面グラフの系 列を次に示します。 216 その他の線形系列グラフ Visualforce Charting デフォルトでは、面グラフの凡例のタイトルには、yField 属性の項目の名前が使用されます、上の例では、デ フォルトのタイトルは「data1」、「data2」、「data3」になります。凡例によりわかりやすいタイトルを付ける には、 コンポーネントの title 属性を使用します。各項目はカンマで区切ります。たとえ ば、title="MacDonald,Promas,Worle" のように使用します。 217 その他の線形系列グラフ Visualforce Charting グラフと同様に、 グラフでは一連の点を結ぶ線が使用されます。線 の下の領域を塗りつぶすことができます。 グラフとは違い、 グラフ は積み上げられません。 グラフが塗りつぶされていない場合は、同じグラフに複数の系列 を表示することができます。折れ線グラフの系列にはデータポイントのマーカーを表示でき、マーカーと結線の 両方の色とサイズを定義できます。3 つの系列を組み合わせ、そのうちの 1 つが塗りつぶされている折れ線グラ フを次に示します。 218 円グラフ Visualforce Charting メモ: コンポーネントでは、Numeric 軸の上と右に向かって数値が大きくなってい かない場合、期待どおりに塗りつぶされない場合があります。これを解決するには、軸を type="Category" に設定し、グラフにデータを渡す前に手動で値を並び替えます。 グラフは、結線のない グラフのようなものです。さまざまなマー カーのサイズ、種類、色を使用することによって、同じグラフに多数の散布図系列を簡単に描画できます。 関連リンク グラフの色 グラフのレイアウトとアノテーション 円グラフ グラフで最も一般的に使用されるカスタマイズは、色とラベルです。前述の例で示した colorSet 属性と コンポーネントを使用します。 円グラフの代わりにドーナツグラフを作成するには、donut 属性を設定します。donut 属性は、0 ~ 100 の整数 で、穴の半径のパーセントを表します。単純なドーナツグラフを次に示します。 219 ゲージグラフ Visualforce Charting 関連リンク グラフの色 グラフのレイアウトとアノテーション ゲージグラフ ゲージグラフには、定義された軸または目盛りに対し 1 つの測定値が表示されます。グラフに表示されるのは 1 つの数値ですが、軸およびグラフの色を変えて、その数値の意味を伝えることができます。 値の範囲を定義するには、 タグの minimum 属性と maximum 属性を使用します。現在の値が適切か 不適切かを示すには、 タグの colorSet 属性を使用します。測定値が許容範囲内であるこ とを示すグラフを次に示します。 メモ: ゲージグラフでは、凡例やラベルはサポートされません。 関連リンク グラフの色 グラフのレイアウトとアノテーション レーダーグラフ レーダーグラフは、折れ線グラフに似ていますが、線グリッドの代わりに円形の軸が使用されます。 マーカーのスタイル、サイズ、色を設定するには、markerType、markerSize、および markerFill 属性を使用 します。結線の色と太さを設定するには、strokeColor 属性と strokeWidth 属性を使用します。必要に応じ て、fill=true に設定して系列で囲まれた領域を塗りつぶし、opacity を設定して他の系列が表示されるよう にこの領域を透明にします。opacity 属性は、0.0 ~ 1.0 までの浮動小数点の数値です。0.0 は完全に透明、1.0 は完全に不透明を表します。 220 レーダーグラフ Visualforce Charting レーダーグラフの例とグラフを作成するマークアップを次に示します。 関連リンク グラフの色 グラフのレイアウトとアノテーション 221 第 16 章 Visualforce でのフローの表示 Visual Workflow では、システム管理者は、ユーザが画面を順に進み、データの収集と更新を行える「フロー」と いうアプリケーションを構築できます。たとえば、Visual Workflow を使用して、カスタマーサポートセンターへ の電話のスクリプトを作成したり、営業組織用にリアルタイムの見積を生成したりできます。 フローを実行するための標準のユーザインターフェースはカスタマイズできません。Visualforce は、アプリケー ションの作成とアプリケーションのデザインのカスタマイズを行うための強力な手段を開発者に提供する、コア テクノロジーです。Visual Workflow では、この技術を活用して、フローを実行するときにユーザインターフェー スをカスタマイズできます。 次のトピックでは、Visualforce ページにフローを埋め込み、設定する方法を説明します。 • Visualforce ページにフローを埋め込む • を使用した高度な例 • フローの finishLocation 属性の設定 • フローのユーザインターフェースのカスタマイズ (ページ 228) Visualforce ページにフローを埋め込む フローのデザインをカスタマイズするか、機能を強化するには、Visualforce ページにコンポーネントとして埋め 込むことができます。組織のサイトとポータルでフローが有効になっている場合、Force.com サイト、カスタマー ポータル、またはパートナーポータルのユーザにフローを提供できます。 メモ: ユーザは、アクティブなバージョンを含むフローしか実行できません。埋め込んだフローにアク ティブなバージョンが含まれていない場合は、エラーメッセージが表示されます。埋め込んだフローに サブフロー要素がある場合、サブフロー要素から参照およびコールされるフローは有効バージョンであ る必要があります。 フローを Visualforce ページに追加するには、次のように コンポーネントを使用してフロー を埋め込みます。 1. フローの一意の名前を検索します。 a. フローリストのページに移動します。[設定] で、[作成] > [ワークフローと承認申請] > [フロー] をクリック します。 b. 埋め込むフローの名前をクリックします。 2. 新しい Visualforce ページを定義するか、編集するページを開きます。 3. タグ間の任意の場所に コンポーネントを追加します。 222 Visualforce でのフローの表示 Visualforce ページにフローを埋め込む 4. name 属性をフローの一意の名前に設定します。次に例を示します。 メモ: 管理パッケージのフローである場合、name 属性は namespace.flowuniquename の形式で指定 してください。 5. フローを含む Visualforce ページのページセキュリティを設定することで、フローを実行できるユーザを制限 します。 フローを含む Visualforce ページがサイトまたはポータルに外部的に配信される場合、Visualforce ページへのア クセスを持つユーザは埋め込まれているフローを実行できます。 カスタム Web タブ、リンク、またはボタンを使用して、フローを含む Visualforce ページを組織内のユーザに 提供する場合は、ユーザにそのページへのアクセス権がある必要があります。また、「フローを実行」権限、 またはユーザ詳細ページで [Force.com Flow ユーザ] 項目が有効化されている必要があります。 6. フローの完了動作を設定することにより、フロー画面の [完了] をユーザがクリックすると実行される処理を 指定します。 フローの変数値の設定 この例では、カスタマーサポートエージェントがケースを作成してモデムの問題をトラブルシューティングでき るようにする、単純なフローを作成します。 コンポーネントを使用してフローを開始するときに 変数の値を設定できます。この例では、フローの読み込み時に vaCaseNumber というケース番号変数を初期値の 01212212 に設定するために、次のマークアップを使用します。 メモ: インタビューの開始では変数の設定のみを行うことができます。 タグはフローが開 始されるときに一度のみ評価されます。 入力アクセスを許可する変数の設定と、出力アクセスを許可する変数の取得のみ行うことができます。 それぞれのフロー変数では、入出力アクセスは次の項目によって制御されます。 • Cloud Flow Designer の [入力/出力種別] 変数項目 • Metadata API の FlowVariable の isInput 項目および isOutput 項目 入力アクセスまたは出力アクセスを許可しない変数では、変数の設定または取得の試行は無視され、 Visualforce ページ、その コンポーネント、または Apex クラスのコンパイルが失敗する可 能性があります。 また、標準 Visualforce コントローラを活用して変数を設定することもできます。たとえば、Visualforce ページが standardCase コントローラを使用している場合、標準コントローラからデータを渡すようにページの機能を強 化できます。 223 Visualforce でのフローの表示 を使用した高度な例 finishLocation 属性の設定 モデムのトラブルシューティングの例に基づいて、ユーザがフローの終わりにある [完了] ボタンをクリックした ときに Salesforce ホームページにリダイレクトされるように finishLocation 属性を設定することもできます。 finishLocation のその他の設定例については、「フローの finishLocation 属性の設定」 (ページ 226)を参照 してください。 を使用した高度な例 コンポーネントは、複雑な Visualforce の相互作用を簡単に開発できるようにするために設計 されています。ただし、カスタムコントローラを作成してフロー内で利用できる機能も多くあります。カスタム コントローラを使用すると、相互にやりとりできる複数のコンポーネントを含むページを作成できます。独自の Apex 型によって組織内のすべてのフローを個別に参照でき、フロー内の変数にはメンバー変数としてアクセス できます。 メモ: 入力アクセスを許可する変数の設定と、出力アクセスを許可する変数の取得のみ行うことができます。 それぞれのフロー変数では、入出力アクセスは次の項目によって制御されます。 • Cloud Flow Designer の [入力/出力種別] 変数項目 • Metadata API の FlowVariable の isInput 項目および isOutput 項目 入力アクセスまたは出力アクセスを許可しない変数では、変数の設定または取得の試行は無視され、 Visualforce ページ、その コンポーネント、または Apex クラスのコンパイルが失敗する可 能性があります。 次の例では、一意の名前「ModemTroubleShooting」を持つフローは Flow.Interview.ModemTroubleShooting として参照されます。マークアップでは、ページの他の部分でフロー変数の値を表示する方法を示します。 メモ: 管理パッケージのフローである場合、name 属性は namespace.flowuniquename の形式で指定す る必要があります。 上記のマークアップのコントローラは、次のようになります。 public class ModemTroubleShootingCustomSimple { // Need not instantiate explicitly the Flow object using the class constructor 224 Visualforce でのフローの表示 を使用した高度な例 public Flow.Interview.ModemTroubleShooting myflow { get; set; } public String casePriority; public String getcasePriority() { // Access flow variables as simple member variables with get/set methods if(myflow==null) return 'High'; else return myflow.vaCasePriority; } } カスタムコントローラを使用する場合、フローコンストラクタのフローの先頭で変数の初期値も設定できます。 タグを使用して値を設定する場合、コンストラクタを使用して変数を渡すことは省略可能で、必 須ではありません。 次は、コンストラクタのフロー変数の値を設定するカスタムコントローラの例です。 public class ModemTroubleShootingCustomSetVariables { public Flow.Interview.ModemTroubleShooting myflow { get; set; } public ModemTroubleShootingCustomSetVariables() { Map myMap = new Map(); myMap.put('vaCaseNumber','123456'); myflow = new Flow.Interview.ModemTroubleShooting(myMap); } public String caseNumber { set; } public String getcaseNumber() { return myflow.vaCaseNumber; } } Flow.Interview クラスで getVariableValue メソッドを使用して、Visualforce コントローラがフロー変数の値 にアクセスできるようにすることができます。変数は、Visualforce ページに埋め込まれたフローか、サブフロー 要素でコールされる別のフローに含まれている場合があります。変数値は、これらのうちインタビューが現在実 行されているフローから返されます。指定された変数がフロー内に見つからない場合、メソッドは null を返し ます。このメソッドは、コンパイル時ではなく実行時にのみ変数の存在を確認します。 次のサンプルでは、getVariableValue メソッドを使用して Visualforce ページに埋め込まれたフローからブレッ ドクラム (ナビゲーション) 情報を取得します。そのフローにサブフロー要素が含まれ、参照される各フローにも vaBreadCrumb 変数が含まれる場合、どのフローでインタビューが実行されているかに関わらず、すべてのフロー のブレッドクラムを Visualforce ページから取得できます。 public class SampleContoller { //Instance of the flow public Flow.Interview.Flow_Template_Gallery myFlow {get; set;} public String getBreadCrumb() { String aBreadCrumb; if (myFlow==null) { return 'Home';} else aBreadCrumb = (String) myFlow.getVariableValue('vaBreadCrumb'); return(aBreadCrumb==null ? 'Home': aBreadCrumb); } } 次の表に、フローと Apex との間での、サポートされているデータ型の名前付けの違いを示します。 225 Visualforce でのフローの表示 フローの finishLocation 属性の設定 フロー Apex text String number decimal currency decimal date date、dateTime Boolean Boolean Apex コードのテストを記述する適切な方法として、次に ModemTroubleShootingCustomSetVariables のテス トクラスを作成する単純な例を挙げます。 @isTest private class ModemTroubleShootingCustomSetVariablesTest { static testmethod void ModemTroubleShootingCustomSetVariablestests() { PageReference pageRef = Page.ModemTroubleShootingSetVariables; Test.setCurrentPage(pageRef); ModemTroubleShootingCustomSetVariables mytestController = new ModemTroubleShootingCustomSetVariables(); System.assertEquals(mytestController.getcaseNumber(), '01212212'); } } reRender 属性の設定 reRender 属性を使用することにより、 コンポーネントはページ全体を更新することなく フローを再表示します。 警告: reRender 属性を設定しない場合、フロー内の他の画面に移動するボタンをクリックすると、 コンポーネントのみでなく Visualforce ページ全体が更新されます。 フローの finishLocation 属性の設定 コンポーネントを使用して Visualforce ページにフローを埋め込むと、Force.com サイトユー ザ、カスタマーポータルユーザ、および パートナーポータルユーザが、Visual Workflow を使用して作成された 動的アプリケーションにアクセスできるようになります。Visualforce で使用可能なその他のフローのカスタマイ ズに加えて、最後の画面で [完了] をクリックするときに実行される内容を指定することもできます。 次のセクションでは、 コンポーネントの finishLocation 属性を設定する方法を示します。 • URLFOR 関数を使用した finishLocation の設定 • $Page 変数を使用した finishLocation の設定 • コントローラを使用した finishLocation の設定 226 Visualforce でのフローの表示 フローの finishLocation 属性の設定 メモ: • finishLocation が指定されない場合は、[完了] をクリックしたユーザはフローの最初の画面に戻り ます。 • フローと同じページにレコードを表示するために標準コントローラを使用すると、[完了] をクリック したユーザは、レコードのない、フローの最初の画面に戻ります。これは、id クエリ文字列パラメー タがページ URL で維持されないためです。必要に応じて、ユーザをレコードに戻す場合は、 finishLocation を設定してください。 • Salesforce 組織の外部 URL にフローユーザをリダイレクトすることはできません。 URLFOR 関数を使用した finishLocation の設定 URLFOR 関数を使用して、次のことを実行できます。 • Salesforce ホームページなどの相対 URL にユーザの経路を設定します。 • ID を使用して特定のレコードまたは詳細ページにユーザの経路を設定します。たとえば、ID が 001D000000IpE9X である詳細ページにユーザの経路を設定する場合は、次のように指定します。 URLFOR についての詳細は、「関数」 (ページ 567)を参照してください。 $Page 変数を使用した finishLocation の設定 URLFOR を使用することなく、ユーザが [完了] をクリックすると他の Visualforce ページにリダイレクトされるよ うにする場合には、finishLocation を単にリダイレクト先のページの名前に設定します。 $Page についての詳細は、「グローバル変数」 (ページ 541)を参照してください。 コントローラを使用した finishLocation の設定 コントローラを使用したいくつかの異なる方法で finishLocation を設定できます。ページのサンプルコードの 一部を次に示します。

Congratulations!

This is your new page.
227 Visualforce でのフローの表示 フローのユーザインターフェースのカスタマイズ コントローラのサンプルコードを次に示します。 public class myFlowController { public PageReference getPageA() { return new PageReference('/300'); } public String getPageB() { return '/300'; } public String getPageC() { return '/apex/my_finish_page'; } } 例は 3 種類あります。 • getPageA は、場所を定義するための文字列を渡して、新しいページ参照をインスタンス化します。 • getPageB は、PageReference のように処理される文字列を返します。 • getPageC は、PageReference に翻訳された文字列を返します。 メモ: Salesforce 組織の外部 URL にユーザをリダイレクトすることはできません。 フローのユーザインターフェースのカスタマイズ Visualforce ページにフローを埋め込んだ後、CSS を使用してカスタムスタイルを適用することによって、実行時 のフローのデザインをカスタマイズできます。フローの属性と CSS クラスを併用することによって、ボタンの 場所、ボタンのスタイル、背景、画面の表示ラベルのデザインなど、フローの個々の部分をカスタマイズできま す。 フローボタンの属性 フローの [次へ] ボタン、[前へ] ボタン、および [完了] ボタンの表示方法を変更するには、次の属性を使用しま す。 属性 説明 buttonLocation フローのユーザインターフェースでのナビゲーションボタンの場所を定義しま す。選択可能な値は次のとおりです。 • top • bottom • both 次に例を示します。 228 Visualforce でのフローの表示 属性 フローのユーザインターフェースのカスタマイズ 説明 メモ: 指定されていない場合、buttonLocation 値はデフォルトの both に設定されます。 buttonStyle フローナビゲーションボタンにセットとしてスタイルを割り当てます。CSS ク ラスではなく、インラインスタイルでのみ使用できます。 次に例を示します。 フロー固有の CSS クラス これらの事前定義済みのフロースタイルクラスは、独自の CSS スタイルで上書きできます。 フロースタイルのクラス 適用先... FlowContainer フローを含む
要素。 FlowPageBlockBtns フローナビゲーションボタンを含む 要素。 メモ: システム内の別の場所で適用されたボタンのスタイルによって、 フローナビゲーションボタンの CSS スタイルが上書きされないように するには、CSS スタイルをフローナビゲーションボタンに適用するたび に、このフロースタイルクラスを指定することをお勧めします。 たとえば、.FlowPreviousBtn {} の代わりに、.FlowPageBlockBtns .FlowPreviousBtn {} と入力します。 FlowPreviousBtn [前へ] ボタン。 FlowNextBtn [次へ] ボタン。 FlowFinishBtn [完了] ボタン。 FlowText テキスト項目の表示ラベル。 FlowTextArea テキストエリア項目の表示ラベル。 FlowNumber 数値項目の表示ラベル。 FlowDate 日付項目の表示ラベル。 FlowCurrency 通貨項目の表示ラベル。 FlowPassword パスワード項目の表示ラベル。 FlowRadio ラジオボタン項目の表示ラベル。 FlowDropdown ドロップダウンリストの表示ラベル。 229 第 17 章 Visualforce でのテンプレートの使用 Visualforce では、複数の Visualforce ページ間で類似の内容を再利用する方法が複数用意されています。どのメソッ ドを選択するかは、再利用するテンプレートに必要な柔軟性に応じて異なります。テンプレートメソッドが柔軟 なほど、そのメソッドを使用するテンプレートの実装が変更しやすくなります。次のテンプレートメソッドを使 用できます (柔軟性の高い順)。 カスタムコンポーネントの定義 メソッドでコードをカプセル化すると、プログラムでそのメソッドを複数回利用できるのと同様に、カス タムコンポーネントで共通のデザインパターンをカプセル化することにより 1 つ以上の Visualforce ページ でそのコンポーネントを複数回利用することができます。カスタムコンポーネントの定義は最も柔軟なテ ンプレートメソッドです。これは、有効な Visualforce タグであればどれでも含めることができ、制限なし でどの Visualforce ページにもインポートできるためです。ただし、カスタムコンポーネントは、再利用可 能な Visualforce ページの定義には使用しないでください。Visualforce ページ全体の内容を再利用する場合、 他の 2 つのテンプレートメソッドのいずれかを選択してください。 を使用したテンプレートの定義 基本テンプレートを定義して、テンプレートの一部を実装ごとに変更できるようにする場合、 コンポーネントを使用します。このテンプレートメソッドは、ページの全体的な構 造を維持し、個々のページの内容を変える場合に適しています。例として、同じページレイアウトでさま ざまな記事を表示する必要があるニュース記事用の Web サイトなどがあります。 この技法によって、コントローラが返す PageReference からテンプレートを定義することもできます。 を使用する既存ページの参照 Visualforce ページの内容全体を別のページに挿入する場合、 コンポーネントを使用しま す。このテンプレートメソッドは、複数の領域で同じ内容を複製する場合に適しています。例として、Web サイトのどのページにも表示されるフィードバックフォームなどがあります。 および で作成したテンプレートは、すでに存在する Visualforce ページを 参照する場合にのみ使用する必要があります。1 つのコンポーネントセットのみを複製する必要がある場合は、 カスタムコンポーネントを使用します。 を使用したテンプレートの定義 を使用して定義したすべてのテンプレートには、1 つ以上の子の タグが 必要です。 タグは、そのテンプレートをインポートするページに対し、そのセクションで定義 が必要であることを示します。 を使用してテンプレートをインポートする Visualforce ペー 230 Visualforce でのテンプレートの使用 を使用したテンプレートの定義 ジでは、 を使用してテンプレートの各 セクションのコンテンツを指定する必要 があります。 スケルトンテンプレートを作成すると、それ以降の Visualforce ページが同じ標準構造内で異なるコンテンツを実 装できます。そのためには、 タグを使用してテンプレートページを作成します。 次の例は、、および を使用してスケルトンテンプレー トを実装する方法を示します。 最初に、compositionExample というコントローラを使用する myFormComposition という空のページを作成し ます。 ページを保存すると、compositionExample の作成を要求するメッセージが表示されます。次のコードを使用し て、そのカスタムコントローラを定義します。 public class compositionExample{ String name; Integer age; String meal; String color; Boolean showGreeting = false; public PageReference save() { showGreeting = true; return null; } public void setNameField(String nameField) { name = nameField; } public String getNameField() { return name; } public void setAgeField(Integer ageField) { age= ageField; } public Integer getAgeField() { return age; } public void setMealField(String mealField) { meal= mealField; } public String getMealField() { return meal; } public void setColorField(String colorField) { color = colorField; } public String getColorField() { return color; } 231 Visualforce でのテンプレートの使用 を使用したテンプレートの定義 public Boolean getShowGreeting() { return showGreeting; } } 次に、myFormComposition に戻り、スケルトンテンプレートを作成します。


That's everything, right?

2 つの 項目が age と meal のコンテンツを必要としています。これらの項目のマークアップは、 この構成テンプレートをコールするすべてのページに定義されます。 次に、myFullForm というページを作成し、そこで myFormComposition に タグを定義します。 このマークアップでは、次の点に留意してください。 • myFullForm を保存すると、前に定義した タグと [保存] ボタンが表示されます。 • 構成ページには age 項目および meal 項目が必要であるため、myFullForm はこれらをテキスト入力項目とし て定義します。項目がページに表示されている順序は重要ではありません。myFormComposition は age 項目 が常に meal 項目よりも前に表示されるように指定します。 • 一致する 項目がない場合でも、name 項目はインポートされます。 • 項目のコントローラコードが存在する場合でも、color 項目は無視されます。これは、構成テンプレートが color という名前の項目を必要としないためです。 • age および meal 項目は、テキスト入力である必要はありません。 タグ内のコンポーネント は、任意の有効な Visualforce タグにすることができます。 232 Visualforce でのテンプレートの使用 を使用する既存ページの参照 タグで有効な Visualforce を使用する方法の例として、myAgelessForm という新規 Visualforce ページを作成して次のマークアップを使用します。

You look great for your age!

構成テンプレートで必要なのは、 タグが存在することだけです。この例では、age がテキスト して定義されています。 動的テンプレート PageReference を介してテンプレートを割り当てるには、動的テンプレートを使用します。テンプレート名は、使 用するテンプレートが含まれる PageReference を返すコントローラメソッドに割り当てられます。 たとえば、スケルトンテンプレートを定義する myAppliedTemplate というページを作成します。 次に、このページへの参照を返すメソッドを使用する dynamicComposition というコントローラを作成します。 public class dynamicComposition { public PageReference getmyTemplate() { return Page.myAppliedTemplate; } } 最後に、このコントローラと動的テンプレートを実装する myDynamicComposition というページを作成します。 Hello {!$User.FirstName}, you look quite well. を使用する既存ページの参照 何も変更を行わずに他のページのコンテンツ全体を複製する場合は、 タグを使用します。この 技法を使用すると、複数の場所で同じように使用する既存のマークアップを参照することができます。 233 Visualforce でのテンプレートの使用 を使用する既存ページの参照 メモ: コンポーネントの複製のみを行う場合は、 を使用しないでください。コードのセ グメントを再利用可能にするには、カスタムコンポーネントの方が適しています。 たとえば、ユーザの名前を取得して表示するフォームを作成するとします。最初に、formTemplate というペー ジを作成して、再利用可能なフォームを表し、templateExample というコントローラを使用します。 templateExample が存在しないというメッセージが表示されたら、次のコードを使用してカスタムコントロー ラを定義します。 public class templateExample{ String name; Boolean showGreeting = false; public PageReference save() { showGreeting = true; return null; } public void setNameField(String nameField) { name = nameField; } public String getNameField() { return name; } public Boolean getShowGreeting() { return showGreeting; } } 次に、formTemplate に戻り、次のマークアップを追加します。 [保存] をクリックしても何も起こりません。これは予期される動作です。 次に、formTemplate を含む displayName というページを作成します。 234 Visualforce でのテンプレートの使用 を使用する既存ページの参照 このページを保存すると、formTemplate ページ全体がインポートされます。名前を入力し、[保存] をクリック すると、フォームから true 値が showGreeting 項目に渡されて、 とユーザ名が表示され ます。 別の Visualforce ページを作成し、ページで formTemplate を使用して異なる挨拶文を表示することもできます。 displayBoldName というページを作成し、次のマークアップを使用します。 表示されるテキストが変更されても、templateExample ロジックは同じままです。 235 第 18 章 モバイルデバイスの開発 開発者は Visualforce および Apex を使用することで、Force.com プラットフォームでネイティブに実行される高度 で強力なアプリケーションを記述できます。Force.com プラットフォームで作成されたアプリケーションをモバ イルデバイスに拡張するために、開発者は Visualforce Mobile を使用できます。Visualforce Mobile は、Salesforce Classic の速度と信頼性、salesforce.com のネイティブクライアントアプリケーションを、完全にカスタマイズ可能 なブラウザベースのユーザインターフェースと組み合わせています。 Visualforce Mobile は、開発者が、Salesforce Classic によって提供されるオフラインのデータアクセスと Visualforce および Apex によって提供される柔軟性と迅速な開発とを併せて活用できる、クライアント側プログラミングと オンデマンドプログラミングのハイブリッド版です。 Salesforce Classic for BlackBerry と Salesforce Classic for iPhone は、Visualforce ページと Web ページを組み込みブラ ウザのクライアントアプリケーション内で直接表示できます。Visualforce Mobile ページでは、Salesforce Classic に データの同期と組み込みブラウザのクローズを行わせるための JavaScript コードを実行することもできます。 Salesforce Classic とは? Salesforce Classic は、BlackBerry、iPhone、または Windows Mobile デバイスからユーザがデータにアクセスできる salesforce.com 提供のクライアントアプリケーションです。Salesforce Classic クライアントアプリケーションを使 うと、無線通信事業者ネットワークを介して Salesforce とデータを交換したり、ユーザのモバイルデバイスのデー タベースにあるデータのローカルコピーを保存したりできます。デバイスに送信されるデータはモバイル設定で 決定されます。モバイル設定は、ユーザの Salesforce レコードの関連するサブセットを定義するパラメータのセッ トです。 モバイルデバイスを使って Salesforce にアクセスする各ユーザには、Salesforce Classic ライセンスが別途必要にな ります。Performance Editon、Unlimited Editon、および Developer Edition を使用している組織には、Salesforce ラ イセンス 1 つにつきモバイルライセンスが 1 つ提供されます。Professional Edition または Enterprise Edition を使 用している組織は、モバイルライセンスを別途購入する必要があります。 メモ: Mobile Lite は、Professional Edition または Enterprise Edition を使用しているモバイルライセンスを 持たないお客様が利用できる、無料バージョンのモバイルアプリケーションです。Mobile Lite では、 Visualforce Mobile はサポートされません。 Salesforce Classic および Visualforce Mobile を実行できるデバイス Salesforce Classic は、BlackBerry、iPhone、Windows Mobile デバイスで実行できますが、Windows Mobile クライ アントアプリケーションは、現在 Visualforce Mobile をサポートしていません。BlackBerry デバイスおよび iPhone デバイスは次の要件を満たす必要があります。 236 モバイルデバイスの開発 モバイルアプリケーションの機能と制限事項 BlackBerry Salesforce Classic アプリケーションは、BlackBerry オペレーティングシステムバージョン 4.3 ~ 7.0 で実行で きます。パフォーマンスを最適化するためには、Salesforce では、バージョン 4.6 ~ 4.7 がインストールされ た BlackBerry スマートフォンで Visualforce Mobile を実行することをお勧めします。BlackBerry オペレーティ ングシステムを最新バージョンにアップグレードすると、デバイスの全体的なパフォーマンスが向上しま す。デバイスには、最低 5 MB の空きメモリが必要です。モバイルクライアントアプリケーションは、オペ レーティングシステムに関する要件を満たす以下の BlackBerry スマートフォンでサポートされます。 • BlackBerry 8100 Series (Pearl) • BlackBerry 8300 Series (Curve) • BlackBerry 8800 Series • BlackBerry 8900 Series (Javelin) • BlackBerry 9000 Series (Bold) • BlackBerry 9500 Series (Storm) iPhone Salesforce Classic には、iTunes で使用できる最新の iPhone オペレーティングシステムが必要です。モバイル クライアントアプリケーションをインストールする前に、デバイスには少なくとも 5 MB の空きメモリがあ る必要があります。モバイルクライアントアプリケーションは、次のデバイスでサポートされています。 • iPhone • iPhone 3G • iPhone 3GS • iPod Touch メモ: iPhone または BlackBerry デバイスを持っていない開発者はシミュレータを使用して Visualforce Mobile ページをテストすることができます。 モバイルアプリケーションの機能と制限事項 Salesforce Classic は、クライアントアプリケーションと Visualforce ページの間で情報を渡すことのできる組み込 みブラウザを備える、ネイティブクライアントアプリケーションです。組み込みブラウザは、デバイスのイン ターネット接続を使用して Salesforce と通信し、ネイティブクライアントアプリケーションは、SOAP API を使 用して Salesforce と非同期に通信します。組み込みブラウザは JavaScript を実行できますが、ネイティブクライア ントアプリケーションは JavaScript を実行できません。 次のリストに、ネイティブクライアントアプリケーションの機能と制限事項の概要を示します。 使用可能なオブジェクト システム管理者は、取引先、納入商品、取引先責任者、商談、リード、ToDo、行動、価格表、商品、ケー ス、ソリューションおよびカスタムオブジェクトをモバイル化できます。カスタムリンク、Sコントロー ル、マッシュアップ、差し込み項目、画像項目はモバイル化できません。ワークフロールール、入力規則、 数式項目、および Apex トリガは、モバイルクライアントアプリケーションでは実行されず、レコードが保 存されて Salesforce に送信された後で、サーバ側で実行されます。 237 モバイルデバイスの開発 Visualforce Mobile を使用する必要がある状況 権限、レコードタイプ、およびページレイアウト ユーザ権限、レコードタイプ、およびページレイアウトは、Salesforce から継承されます。システム管理者 は、必要に応じて、モバイルユーザの権限をさらに制限したり、モバイルページのレイアウトから不要な 項目を除外したりして、モバイル化されたオブジェクトのプロパティを変更することができます。 関連リスト システム管理者が関連オブジェクトをモバイル化すると (つまり、親データセットに子データセットを追加 すると)、そのオブジェクトは自動的にモバイルデバイス上の関連リストになります。 ダッシュボードとレポート ダッシュボードは、BlackBerry および iPhone クライアントアプリケーションで使用できます。レポートは、 BlackBerry クライアントアプリケーションで使用できます。レポートは Excel 形式でデバイスに送信され、 基本テーブルで表示されます。モバイルアプリケーションのレポートビューアは、並び替え、集計、小計、 またはグルーピングをサポートしていません。 カスタムリストビュー BlackBerry ユーザはモバイルクライアントアプリケーションのカスタムビューを作成できます。BlackBerry ユーザおよび iPhone ユーザは、モバイル管理コンソールで Salesforce のシステム管理者によって作成される カスタムビューにアクセスできます。モバイルアプリケーションでは、カスタムビューは 2 列に制限され ます。 Visualforce タブと Web タブ iPhone ユーザおよび BlackBerry ユーザは、Visualforce タブおよび Web タブが Salesforce のシステム管理者に よってモバイル化されている場合、モバイルクライアントアプリケーション内のそれらのタブにアクセス できます。ネイティブクライアントアプリケーションではユーザがデータにオフラインでアクセスできま すが、Visualforce タブおよび Web タブでは、タブが組み込みブラウザで起動されるためワイヤレスネット ワークへの接続が必要です。 Visualforce Mobile を使用する必要がある状況 よく使用されているコンシューマおよびエンタープライズモバイルアプリケーションの大多数は、インストール したりデータの送受信のためにサーバに定期的に接続したりする必要のある、クライアント側のアプリケーショ ンです。モバイルクライアントアプリケーションがモバイルオンデマンドアプリケーションよりも広く普及して いる理由には、主に次の 2 つがあります。 接続 モバイルデバイスは常時ネットワーク接続を維持しません。クライアントアプリケーションでは、ユーザ はオフラインで作業することが可能で、その場合もデータに中断なくアクセスできます。 速度 ワイヤレスデータネットワークは、依然として非常に低速です。クライアントアプリケーションは応答が 迅速です。 Visualforce Mobile はモバイルデバイスのカスタムインターフェースおよびビジネスロジックを作成する方法を提 供しますが、開発者が Visualforce Mobile で作業する必要があるのは、ネイティブクライアントアプリケーション の機能を使用してニーズを満たすことができない場合のみです。たとえば、開発者は、カスタムオブジェクトを 作成し、カスタム項目を作成し、さらにレコードの更新時にサーバ側で実行する Apex トリガを記述することで、 238 Visualforce ページと同じ機能を複製することができます。ワイヤレスネットワークの速度と信頼性が改善される までは、モバイルユーザにとって最良の操作性が得られるのはクライアントアプリケーションで操作を実行した 場合です。 ただし、ネイティブクライアントアプリケーションでは顧客の要件を満たせない状況があります。次の場合は、 Visualforce Mobile を使用してください。 モバイルデバイスの開発 iPhone および BlackBerry 用のページの開発 正しく表示されません。次の属性定義を使用して、Visualforce Mobile ページで標準スタイルシートを使用し ないようにすることを検討してください。 ページにスタイルシートを追加する場合、 コンポーネントのすぐ下に ページ間でスタイルを再利用するには、スタイルを定義する別の Visualforce ページを作成します。次に、 タグを使用してスタイルページを組み込みます。たとえば、myStyles という名前のペー ジを定義するとします。 次のように他のページにこれらのスタイルを含めます。 モバイル用に最適化されているスタイルシートを静的リソースとして保存し、ページでそれを参照するこ とができます。ただし、スタイルシートは、ページを表示するためにクライアント側の Visualforce マーク アップとペアになっているため、静的リソースとしてスタイルシートを追加するとページの読み込み時間 が長くなります。 メモ: iPhone 用のページを構築し、iPhone の標準 UI を模倣する必要がある場合は、iPhone に似た インターフェースを Web アプリケーションに提供するサードパーティのライブラリ iUI を使用する ことで、時間を節約して開発の手間を省くことができます。 ルックアップ で提供される参照項目セレクタは BlackBerry での適切なユーザの操作性を提供しませ ん。また、iPhone では機能しません。レコードの保存時に参照項目のエントリを検証する Apex トリガを作 成すると、この問題を回避できます。また、可能な場合は項目の種別を変更することもできます。 次のトピックでは、iPhone および BlackBerry 用のページ開発についての詳細を説明します。 • iPhone の考慮事項 • BlackBerry の考慮事項 • クロスプラットフォームの互換性のあるページの開発 240 モバイルデバイスの開発 • iPhone の考慮事項 JavaScript ライブラリの使用 関連リンク Visualforce ページのスタイル設定 静的リソースの使用 iPhone の考慮事項 モバイルアプリケーションでは、組み込みブラウザで Visualforce Mobile のページを起動します。iPhone に組み 込まれたブラウザは、デフォルトの Web ブラウザに使用されるのと同じフル機能の Safari ブラウザです。優良 な JavaScript サポートと十分な性能を備えています。 iPhone 用のページを開発するときは、次の考慮事項が適用されます。 ページのズーム デフォルトで、iPhone ブラウザは、ページの幅を 980 ピクセルに設定します。この値は、さまざまな Web サイトとの互換性を最大限にするために選択されています。iPhone ブラウザで初期ページを表示する幅を 指定するには、 タグを使用します。 このタグは、他のブラウザでは無視されます。 iPhone 特定のアプリケーションでは、ページの幅をデバイスの幅に設定する必要があります。viewport メタ キーに複数のプロパティを提供する場合、カンマで区切った割り当てステートメントのリストを使用しま す。次の表は、viewport プロパティを説明したものです。 プロパティ 説明 width viewport の幅 (ピクセル単位)。デフォルト値は 980 です。範囲は、200~10,000 です。ページをデバイス の幅 (ピクセル単位) に設定するには、device_width 値を使用します。 height viewport の高さ (ピクセル単位)。デフォルトは、width プロパティの値とデバイスのアスペクト比に基づい て計算されます。範囲は、223 ~ 10,000 ピクセルで す。ページをデバイスの高さ (ピクセル単位) に設定 するには、device_height 値を使用します。 initial-scale 乗数としての viewport の初期スケール。デフォルト は、表示領域の Web ページにフィットするように計 算されます。範囲は、minimum-scale プロパティと maximum-scale プロパティによって決定されます。 Web ページが初めて表示されるときの viewport の初 期スケールのみを設定できます。user-scalable を no に設定しない限り、ユーザはそれ以降ズームインお 241 モバイルデバイスの開発 iPhone の考慮事項 プロパティ 説明 よびズームアウトを実行できます。ユーザによるズー ム操作は、minimum-scale プロパティおよび maximum-scale プロパティによって制限されます。 minimum-scale viewport の最小スケール値を指定します。デフォル ト値は 0.25 です。範囲は 0 ~ 10.0 (0 を含まない) で す。 maximum-scale viewport の最大スケール値を指定します。デフォル ト値は 1.6 です。範囲は 0 ~ 10.0 (0 を含まない) で す。 user-scalable ユーザがズームインおよびズームアウトを実行でき るかを決定します。拡大縮小を許可するには yes、 許可しない場合は no を設定します。デフォルトは yes です。user-scalable を no に設定すると、入力項 目にテキストを入力する際にページをスクロールで きなくなります。 画面の回転 モバイルアプリケーションでは、画面を回転してもページをフリップしたりサイズ変更したりすることは できません。 URL ターゲット 組み込みブラウザは、target="_blank" 属性をサポートしません。これをページで使用すると、URL ター ゲットは読み込まれません。 ファイルへのアクセス 組み込みブラウザは、ファイルシステム、カメラ、場所、または他のデバイスデータへのアクセスをネイ ティブにサポートしていません。 静的リソースのキャッシュ モバイルアプリケーションでは、静的リソース (画像、JavaScript、CSS など) はキャッシュされません。こ のため、低速の接続ではパフォーマンスが影響を受ける可能性があります。組み込みブラウザは、キャッ シュ機能をサポートしません。 モバイル開発の一般的な規則として、次のコンポーネントを使用しないようにしてください。 • アクションの実行を JavaScript に依存するコンポーネント • Salesforce.com スタイルシートに依存するコンポーネント Visualforce Mobile ページが前述のカテゴリに該当するかどうかは、ページの HTML ソースを調べて確認で きます。JavaScript (.js) を参照する このアプローチでは、すべてのデバイスに最高のユーザ操作性を提供し、開発が長期にわたるという問題 を最小限に抑えます。ただし、2 つの個別のアプリケーション (デバイスタイプごとに 1 つのアプリケーショ ン) を管理する必要があります。 最低限の共通機能 最低限の共通機能を組み込み、存在を感じさせない、最小限の JavaScript のみを含めます。タグ内にインラ インイベントを含むスクリプトは使用しないようにします。お客様の組織のデバイスによっては、JavaScript を一切使用しないようにする必要がある場合があります。旧型の BlackBerry スマートフォンでは、どのよう な JavaScript でも、使用するとページが正常に機能しなくなる可能性があります。 条件コード デバイス条件コードおよびスタイルを作成します。ブラウザによってサーバに渡されるヘッダーに含まれ ているユーザエージェント文字列で、接続しているデバイスが BlackBerry であるか iPhone であるかを識別 します。Visualforce Mobile ページのコードはユーザエージェント文字列を評価し、接続しているデバイスに 適したコンテンツを表示します。Visualforce の利点は、マークアップがサーバ側で解釈され、クライアント は条件ステートメントの評価に基づいて、表示できるマークアップのみを取得する点です。条件コードの 使用は、最も高度なアプローチですが、コードがさらに複雑になるため必ずしも長期的な最良のソリュー ションとはいえません。 メモ: $Resource を使用した静的リソースへの動的参照 (ページ 162)では、代わりに使用できるアプ ローチを説明しています。このアプローチでは要求の特性に基づいてさまざまな画像を動的に表示 します。 たとえば、次のマークアップでは、mobileImages 静的リソース内に保存されている画像の表示のみを行う mobileSample というカスタムコンポーネントを作成します。ただし、表示する画像は、コンポーネントコ ントローラの調査に従ってブラウザがレポートしたユーザエージェント値に基づいて、実行時に決定され ます。 ... ... Global.zip ファイルおよび SendEmail.zip ファイルは参照されている CSS ファイルを含む静的リソース です。conditionalStylesheets カスタムコンポーネントの場合、ブラウザの種類に基づいて表示される 複数の CSS 宣言を定義できます。 // Visualforce component code // for a BlackBerry standard browser, e.g., Bold // for a BlackBerry embedded browser in Salesforce Classic // the Apex code distinguished between the regular and embedded browsers // for the iPhone Safari browser (inside Salesforce Classic or not) 最後に、browserName 値は前の例と同じ方法で Apex コントローラで決定されます。 246 モバイルデバイスの開発 JavaScript ライブラリの使用 メモ: Salesforce Classic は、テキスト "Salesforce" を BlackBerry の組み込みブラウザ用の文字列の 末尾に追加します。また、一部の BlackBerry スマートフォンでは、ユーザはユーザエージェント文 字列を変更できます。 // Apex code snippet ... public static String getBrowserName() { String userAgent = ApexPages.currentPage().getHeaders().get('User-Agent'); if (userAgent.contains('iPhone')) return 'iPhone-Safari'; if (userAgent.contains('Salesforce')) return 'Salesforce'; if (userAgent.contains('BlackBerry')) return 'BlackBerry'; return 'other'; } ... メモ: Salesforce Classic 用の JavaScript ライブラリのコマンドは、iPhone デバイスと BlackBerry デバイスの 両方で使用できます。 JavaScript ライブラリの使用 Visualforce Mobile ページを開発するとき、Salesforce Classic でアクションをトリガするコマンドを含む JavaScript ライブラリを活用できます。このライブラリを使用すると、Visualforce Mobile ページとネイティブクライアント アプリケーションとの間のシームレスな操作性を提供できるようになります。 新しい JavaScript ライブラリのアクションを、どの Visualforce ページでも使用できます。これらのコマンドは Visualforce をサポートする JavaScript 対応デバイスで機能します。現在、これらのデバイスには、iPhone と BlackBerry スマートフォンが含まれます。BlackBerry スマートフォンで表示されるページに JavaScript ライブラリ を使用する場合、Salesforce では、デバイスにバージョン 4.6 以降の BlackBerry オペレーティングシステムをイン ストールすることをお勧めします。 ヒント: 共有 JavaScript ライブラリを使用することには、iPhone と BlackBerry の両方のオペレーティング システムでコマンドが機能するという利点があります。 ライブラリの関数をコールするには、少量の JavaScript コードが必要です。次の関数があります。 mobileforce.device.sync() モバイルクライアントアプリケーションを Salesforce と強制的に同期し、デバイスのデータレコードを更新 します。 mobileforce.device.close() Visualforce ページが表示されている組み込みブラウザを閉じ、元のタブまたはレコードにユーザを戻しま す。 mobileforce.device.syncClose() モバイルクライアントアプリケーションを Salesforce と強制的に同期し、Visualforce ページが表示されてい る組み込みブラウザを閉じます。 247 モバイルデバイスの開発 JavaScript ライブラリの使用 mobileforce.device.getLocation() デバイスの現在位置の GPS 座標を取得します。 メモ: HTML リンクを使用して sync コマンドと close コマンドをトリガすることもできます。JavaScript のサポートが制限される BlackBerry スマートフォンで使用できる、すぐれた代替手法です。コマンドを トリガする HTML を使用するには、 タグに href 属性の値として、次の文字列を含めます。 • クライアントにデータの同期を強制的に行わせるには、mobileforce:///sync を使用します。 • 組み込みブラウザを強制的に閉じるには、mobileforce:///close を使用します。 • 組み込みブラウザを強制的に閉じ、クライアントにデータの同期を行わせるには、 mobileforce:///sync/close を使用します。 Visualforce ページで、次の静的リソースを使用して JavaScript ライブラリをポイントします。 外部 Web サイトは、src パラメータにインスタンス名を含める必要があります。 次のコードは、JavaScript ライブラリで使用できるすべてのコマンドを使用した Visualforce ページの例です。 Visualforce Mobile Trigger Test

Triggers:

JS sync
JS close
JS sync and close
HTML sync
HTML close
HTML sync and close

Location:

Latitude:

Logitude:

Get location
Visualforce ページのモバイル化 モバイルブラウザで実行できる Visualforce ページを開発したら、ユーザが Salesforce Classic で Visualforce ページ にアクセスできるようにセットアップを実行する必要があります。 次のトピックでは、Visualforce ページをモバイル化する方法を説明しています。 • モバイル準備完了の Visualforce タブの作成 • モバイル設定への Visualforce タブの追加 • Visualforce Mobile ページのテスト モバイル準備完了の Visualforce タブの作成 Visualforce ページをモバイル化するには、カスタムタブを作成してモバイル準備完了として定義し、モバイル設 定に追加できるようにします。 Visualforce Mobile タブを作成する手順は、次のとおりです。 1. [設定] で、[作成] > [タブ] をクリックします。 2. [Visualforce] タブ関連リストで、[新規] をクリックします。 3. カスタムタブに表示する、モバイル用に最適化された Visualforce ページを選択します。 4. タブに表示する表示ラベルを指定します。 5. [タブスタイル] ルックアップアイコンをクリックして、[タブスタイルの選択] を表示します。 タブスタイルがすでに使用されている場合は、タブスタイル名の横に角括弧 ([ ]) で囲まれた数字が表示され ます。スタイル名上にマウスポインタを置き、そのスタイルを使用しているタブを参照します。タブで未使 用のスタイルのみを表示するには、[他のタブで使用されているスタイルを非表示] をクリックします。 249 モバイルデバイスの開発 モバイル設定への Visualforce タブの追加 6. タブスタイルをクリックして、カスタムタブの配色とアイコンを選択します。 7. [モバイル準備完了] チェックボックスをオンにして、Visualforce ページがモバイルブラウザに正しく表示され て機能することを示します。 このチェックボックスをオンにすると、モバイル設定で使用可能なタブのリストにそのタブが追加されます。 8. 最初に表示されるスプラッシュページとして使用するカスタムリンクを選択しないでください。モバイルア プリケーションは、スプラッシュページをサポートしません。 9. 必要に応じてタブの説明を入力し、[次へ] をクリックします。 10. 新規カスタムタブを使用できるユーザプロファイルを選択する手順は、次のとおりです。 • [1 つのタブ表示をすべてのプロファイルに適用する] を選択し、ドロップダウンリストから [デフォルトで 表示]、[デフォルトで非表示]、または [タブを隠す] を選択します。 • または、[プロファイルごとに異なるタブ表示を適用する] を選択し、各プロファイルのドロップダウンリ ストから [デフォルトで表示]、[デフォルトで非表示]、または [タブを隠す] を選択します。 11. Salesforce デスクトップユーザにタブが表示されないように、利用できるすべてのアプリケーションから新し いタブを削除することを検討します。Visualforce Mobile ページからは、通常、多くの標準の Salesforce 要素が 取り除かれているため、ユーザがデスクトップブラウザからページにアクセスできるようする必要はあまり ありません。 • 利用できるすべてのアプリケーションの横にあるチェックボックスをオフにします。 • [各ユーザのカスタマイズ設定にタブを追加する] チェックボックスをオフにします。 12. [保存] をクリックします。 モバイル設定への Visualforce タブの追加 Visualforce ページをモバイル化するには、Visualforce タブをモバイル設定に追加する必要があります。モバイル 設定とは、Salesforce がユーザのモバイルデバイスに転送するデータと、そのデータをモバイルデバイスで受信す るユーザを決定するパラメータのセットです。複数のモバイルユーザの異なるニーズを同時に満たせるように、 組織で複数のモバイル設定を作成できます。たとえば、あるモバイル設定ではリードと商談を営業部門に送信 し、別の設定ではケースをカスタマーサポート担当者に送信する、というように設定できます。 モバイル設定を設定する手順は、次のとおりです。 • モバイル設定を作成する • データセットを定義する • モバイルオブジェクトプロパティを編集する • モバイルタブをカスタマイズする モバイル設定についての詳細は、『Salesforce Classic Implementation Guide』を参照してください。組織でモバイル設 定がすでに作成されている場合は、タブのカスタマイズのステップに進んでください。 モバイル設定を作成する モバイル設定を作成する前に、ご自分のユーザアカウントがモバイルライセンスに割り当てられていることを確 認してください。確認するには、ユーザレコードを編集します。[モバイルユーザ]チェックボックスがすでにオ 250 モバイルデバイスの開発 データセットを定義する ンになっている場合は、その他の操作は不要です。[モバイルユーザ]チェックボックスがオンになっていない場 合は、プロファイルまたは権限セットの「モバイル設定の管理」権限を有効にします。 メモ: Developer Edition、Unlimited Edition、および Performance Edition を使用している組織では、デフォ ルトですべての Salesforce ユーザにモバイルライセンスが割り当てられています。 モバイル設定を作成する手順は、次のとおりです。 1. [設定] で [モバイル管理] > [モバイル設定] をクリックして、モバイル設定リストページにアクセスします。 2. [新規モバイル設定] をクリックします。 3. モバイル設定の名前を入力します。 4. [有効] チェック ボックスをオンにします。モバイル設定は、このチェックボックスをオンにするまでは機能 しません。 5. 必要に応じて、モバイル設定の説明を入力します。 6. 必要に応じて、[最近使ったデータのモバイル利用] チェックボックスをオンにして、Salesforce で最近使用した レコードにデバイス同期化のマークを付けます。 7. [最近使ったデータのモバイル利用] チェックボックスをオンにしている場合は、[最近使ったデータの最大数] ド ロップダウンリストから値を選択します。 8. [選択可能なユーザ] ボックスでユーザ名を選択し、[追加] 矢印をクリックして、モバイル設定にユーザアカウ ントを追加します。 プロファイル全体または個別のユーザをモバイル設定に追加できます。 9. 合計データサイズの制限を設定するには、[データサイズの最大値] ドロップダウンリストを使用して、このモ バイル設定に割り当てられているユーザのモバイルデバイス上で常時使用可能なメモリ量を指定します。 Visualforce Mobile ページのテストのみを行う場合は、デフォルト設定が適切なサイズです。 10. [保存] をクリックします。 データセットを定義する モバイル設定を設定する手順における次のステップでは、モバイルデバイスと自動的に同期するオブジェクトと レコードを決定します。Visualforce Mobile ページのテストのみを行う場合は、データセットの定義は不要です。 ただし、オブジェクトのレコード詳細ページから Visualforce Mobile ページへのリンクを作成する場合は、ネイ ティブのレコードと Visualforce Mobile ページとの統合をテストできるようにそのオブジェクトをモバイル化する 必要があります。レコードから Visualforce Mobile ページへのリンクの作成方法を確認するには、『Salesforce Classic Implementation Guide』の「Creating Mobile Links」というタイトルのトピックを参照してください。 データセットを追加する手順は、次のとおりです。 1. モバイル設定の詳細ページを開きます。 2. [データセット] 関連リストで、[編集] をクリックします。 3. 階層内で、[データセット] を選択して親データセットを作成するか、既存のデータセットを選択して子デー タセットを作成します。 4. [追加...] をクリックします。 5. ポップアップウィンドウで、モバイル化するオブジェクトを選択します。 251 モバイルデバイスの開発 Visualforce Mobile ページのテスト 1. モバイル設定の詳細ページを開きます。 2. 初めてモバイルタブを定義する場合は、[モバイルタブ] 関連リストで [タブのカスタマイズ] をクリックしま す。モバイルタブがすでに設定されている場合は、[編集] をクリックします。 3. [選択可能なタブ] リストでモバイル化する Visualforce タブを選択し、[追加] 矢印をクリックしてモバイル設 定に追加します。Visualforce タブが [選択可能なタブ] リストに表示されない場合は、タブを編集してモバイ ル準備完了とマークします。 標準オブジェクトまたはカスタムオブジェクトをモバイル化した場合、タブをカスタマイズするときに忘れ ずにそれらのオブジェクトを選択してください。また、[ダッシュボード] タブをモバイルアプリケーション に表示するには、このタブを選択する必要があります。 4. [選択されたタブ] リストでタブを選択し、[上へ] と [下へ] の矢印をクリックして、モバイルアプリケーショ ンに表示する順番にタブを配置します。 メモ: iPhone ユーザは、モバイルクライアントアプリケーションでタブ順序をカスタマイズできます。 ユーザがタブ順序をカスタマイズすると、管理者によるモバイル設定のタブ順序の変更はクライアン トアプリケーションで無視され、新たにモバイル化されたタブはユーザの既存のタブの下に追加され ます。 5. [保存] をクリックします。 Visualforce Mobile ページのテスト Visualforce Mobile ページを開発したら、モバイルアプリケーションでテストし、期待どおりに表示されて機能す ることを確認します。BlackBerry スマートフォンまたは iPhone にモバイルアプリケーションをインストールして 実行する方法については、『Salesforce Classic User Guide for BlackBerry』または 『Salesforce Classic User Guide for iPhone』 の「Installing Salesforce Classic」を参照してください。 Salesforce Classic デバイス要件を満たす iPhone または BlackBerry スマートフォンがない場合は、iPhone または BlackBerry シミュレータでモバイルアプリケーションを実行できます。シミュレータのインストールと実行方法 については、『Salesforce Classic Implementation Guide』の「Mobile Device Simulators」を参照してください。 Visualforce Mobile ページをテストするとき、次のいくつかの管理タスクを実行する必要がある場合があります。 データの同期 モバイルアプリケーションは、Salesforce のスキーマ変更や新しいデータを 20 分ごとに確認します。場合に よっては、モバイル設定の編集後または Salesforce でのレコード作成後のデータを同期して、その変更が直 ちにアプリケーションに反映されるようにします。モバイルアプリケーションを強制的に Salesforce と同期 することができます。 iPhone のデータを同期する方法については、『Salesforce Classic User Guide for iPhone』の「Synchronize Data」 を参照してください。BlackBerry スマートフォンのデータを同期する方法については、『Salesforce Classic User Guide for BlackBerry』の「Refreshing Data」を参照してください。 メモ: Visualforce Mobile ページで JavaScript ライブラリのコマンドを使用し、モバイルアプリケー ションがデータを同期するように強制できます。 253 モバイルデバイスの開発 例: iPhone 用の対応付けアプリケーションの作成 別のユーザアカウントのテスト 多くの場合、開発者は Salesforce 組織に複数のアクティブなユーザアカウントを作成しています。Salesforce Classic でユーザアカウントを有効にしている場合、別のユーザアカウントを登録する前にそのアカウント を無効にする必要があります。 シミュレータの代わりにモバイルデバイスを使用して Visualforce Mobile ページをテストする場合、モバイ ルアプリケーションからアカウントを無効にできます。iPhone から Salesforce アカウントを無効にする方法 については、『Salesforce Classic User Guide for iPhone』の「Erase Data」を参照してください。BlackBerry スマー トフォンからアカウントを無効にする方法については、『Salesforce Classic User Guide for BlackBerry』の「Removing Salesforce Data from Your Device」を参照してください。 シミュレータを使用して Visualforce Mobile ページをテストする場合、Salesforce でアカウントを無効にする 必要があります。Salesforce でアカウントを無効にする方法については、『Salesforce Classic Implementation Guide』の「Deleting Mobile Devices」を参照してください。 Sandbox アカウントのテスト デフォルトでは、モバイルクライアントアプリケーションは本番組織のトランスポートに接続しますが、 sandbox 組織でテストすることができます。Sandbox アカウントを有効にする方法については、『Salesforce Classic Implementation Guide』の「Activating a Sandbox Account in Salesforce Classic」を参照してください。 例: iPhone 用の対応付けアプリケーションの作成 モバイル開発の概要を説明するために、この章には iPhone 用のアプリケーションを作成するプロセスを説明す るいくつかの例があります。このアプリケーションは、Google Maps Web API を使用して顧客の優先度順に見込 みのある取引先を対応付けます。これらの例を実際に動作させるには、必ず次の要件を満たしている必要があり ます。 • Developer Edition の組織: Developer Edition を取得していない場合は、Developer Force で Developer Edition の 組織にサインアップします。 • テストデータ: Developer Edition を使用している組織で、ユーザの取引先に有効な住所が含まれていることを 確認します。次の 2 つの取引先の住所 (請求先) を編集して、会社が自分の住所の近隣になるようにします。 ◊ Edge Communications ◊ United Oil & Gas Corp. これらの住所が互いに近くなるようにすることで、例をテストしているときに、マップにすべての取引先を より簡単に表示できます。 • UI ライブラリ: Web アプリケーションで iPhone の標準の UI を簡単に模倣できるようにするサードパーティ のライブラリ iUI をダウンロードします。 • Google Maps API: Google Maps API にサインアップして、Maps API キーを取得します。 • iPhone Simulator: モバイルアプリケーションで Visualforce ページをテストできるように iPhone シミュレータ をダウンロードします。 • モバイル設定: 例が完成したら、忘れずに Visualforce タブおよび取引先オブジェクトをモバイル化するモバイ ル設定を作成します。 この章の Visualforce Mobile の例には、次のものが含まれます。 • カスタムコントローラの作成 • 対応付けおよびリストビューの作成 254 モバイルデバイスの開発 カスタムコントローラの作成 詳細ページの作成 • カスタムコントローラの作成 対応付けアプリケーションを作成するには、まず、マップおよび対応する取引先のリストを表示する Visualforce ページで参照されるカスタムコントローラを作成する必要があります。このコントローラでは、評価が「見込み 有り」のユーザの取引先を取得して、Visualforce ページで対応付けを行う JavaScript ルーチンで使用するための、 区切り文字で区切られた取引先の文字列配列を作成します。さらに、Salesforce ページで Google マップを使用す るために必要な Maps API キーの getter メソッドも定義します。 次の Apex クラスは、ユーザの「見込み有り」の取引先を対応付ける Visualforce ページのコントローラです。 public class mapController { public String addrStr; public User usr; public String myKey; public Account[] getMyAccts() { String usrId = UserInfo.getUserId(); Account[] accts = [Select Id, Name, Rating, CustomerPriority__c, OwnerId, BillingStreet, BillingCity, BillingState, BillingPostalCode From Account where Rating = 'Hot' And OwnerId =: usrId ]; for(Account acct : accts) { addrStr = addrStr + acct.Name + ' : ' + acct.CustomerPriority__c + ':' + acct.Id + '~:~'+ acct.BillingStreet + '~:~' + acct.BillingCity + '~:~' + acct.BillingState + '~:~' + acct.BillingPostalCode + '~::~'; } return accts; } public String getmyKey() { // Set up google maps api key myKey = 'http://maps.google.com/maps?file=api&v=2&'; // In the following line, enter your google maps key // to get an api key, visit the Google Maps API site // http://code.google.com/apis/maps/signup.html myKey = myKey + 'key='; return myKey; } public String getAddrArStr(){ addrStr = ''; Account[] theRecs = getMyAccts(); return addrStr; } } 関連リンク カスタムコントローラの作成 255 モバイルデバイスの開発 対応付けおよびリストビューの作成 対応付けおよびリストビューの作成 対応付けアプリケーション作成における次のステップは、マップとそれに対応する取引先のリストを表示する Visualforce ページの作成です。Visualforce ページは、Google マップオブジェクトのパネルを定義し、取引先のリ ストを表示するグループサブパネルを作成します。さらに、JavaScript を使用して取引先住所を取得し、顧客の優 先度に基づいて色付けされたマーカーをマップに入力します。JavaScript は次のロジックを実行して、マップオブ ジェクトを設定します。 • {!AddrArStr} 文字列配列から対応付ける住所を取得する • コントローラに定義された区切りを取得し、住所配列を解凍する • すべての取引先住所と現在のユーザに対し doAddLocationToMap をコールする • Account.CustomerPriority__c をキーとして使用し、緑、黄色、赤のうちどのマーカーを使用するかを決 定する • $Resource.markers 静的リソースに保存されたカスタム画像マーカーを取得する JavaScript コードは、複数の場所で参照する必要がある場合に備えて静的リソース内に配置しておくのが適切な方 法です。MobileListView という静的リソースを作成します。 function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { oldonload(); func(); } } } addLoadEvent( function() { if (GBrowserIsCompatible()) { var my_geocoder = new GClientGeocoder(); var map = new GMap2(document.getElementById("map")); var TC = new GMapTypeControl(); var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10)); var mCount =0; map.addControl(new GSmallMapControl()); // Small arrows map.addControl(TC, bottomRight); // Map type buttons function LTrim( value ) { var re = /\s*((\S+\s*)*)/; return value.replace(re, "$1"); } function RTrim( value ) { var re = /((\s*\S+)*)\s*/; return value.replace(re, "$1"); } // Remove leading and ending whitespaces function trim( value ) { return LTrim(RTrim(value)); } function doAddLocationToMap(SiteName, Street, City, State, Zip, typ) { var addr = Street + ", " + City + ", " + State + " " + Zip; 256 my_geocoder.getLatLng (addr, function(point) { if (point) { var mTag = ''; var myIcon = new GIcon(G_DEFAULT_ICON); if(typ == 'self') { mTag = "" + SiteName + "" + "
" + City ; myIcon.image = "http://maps.google.com/mapfiles/arrow.png"; myIcon.iconSize=new GSize(32,32); } else { if(typ == 'acct') { mCount ++; var priAr = SiteName.split(":"); var compName = priAr[0]; // company name var pri = trim(priAr[1]); // priority// モバイルデバイスの開発 対応付けおよびリストビューの作成 doAddLocationToMap(arCols[0],arCols[1],arCols[2], arCols[3],arCols[4],'acct'); } //Get user address and draw doAddLocationToMap('{!$User.FirstName} {!$User.LastName}' +' (Me)','{!$User.Street}','{!$User.City}',' {!$User.State}','{!$User.PostalCode}','self'); } } ); 次のコードは、対応付けアプリケーションのリンク先ページを定義します。
  • User: {!$User.FirstName} {!$User.LastName}
  • Accounts
  • {!p.Name}
ページのマークアップは、 コンポーネントを使用して、テンプレートを参照します。テン プレートは、iUI フレームワークを利用して、iPhone のようなスタイルをページに適用します。iUI フレームワー クは、$Resource.IUI 静的リソースから組み込まれます。テンプレートを定義することによって、iPhone プラッ トフォーム用に作成するすべての Visualforce ページに簡単に同じスタイルを適用できます。 次のマークアップは、テンプレートとして使用される iuivf ページを定義します。 * in any Visualforce page. --> 258 モバイルデバイスの開発 詳細ページの作成 テンプレートについては、次の点に注意してください。 • マークアップは、iUI ライブラリの #home スタイルを上書きします。そうすることで、ページ上部に目立っ たギャップを作ることなく Salesforce Classic にアプリケーションが表示されるようにしています。 • マークアップは、class="Toolbar" 要素の使用を回避します。Salesforce Classic に組み込まれたブラウザで は、ページの上部にナビゲーションツールバーが表示されるため、2 つ目のツールバーを表示するとユーザを 混乱させる可能性があります。iUI フレームワークに提供されるボタンスタイルを使用する場合は、ボタンを 表示するために Toolbar クラスを使用しないようにしてください。 関連リンク Visualforce ページでの JavaScript の使用 apex:composition 静的リソースの使用 詳細ページの作成 対応付けアプリケーション作成の最後のステップでは、リストビュー内の取引先の詳細ページを作成します。ま ず、取引先情報を取得するコントローラを作成します。 public class customAccountController { private final Account account; public customAccountController() { account = [Select Id, Name, Rating, CustomerPriority__c, Description, Phone, BillingStreet, BillingCity, BillingState, BillingPostalCode from Account where id = :ApexPages.currentPage().getParameters().get('id')]; } public Account getAccount() { return account; } public PageReference save() { update account; return null; } } 次に、ユーザがリストビューから選択した取引先の電話番号および評価を表示する Visualforce ページを作成しま す。このページに iPhone に似たスタイル設定を追加するには、iUI フレームワークの
クラスおよび クラスを使用します。 次のコードでは、対応付けアプリケーションの取引先の詳細ページを定義します。
259 モバイルデバイスの開発 詳細ページの作成

{!Account.Name}

260 第 19 章 Force.com AppExchange アプリケーションへの Visualforce の 追加 Visualforce ページ、コンポーネント、またはカスタムコントローラを、AppExchange 用に作成するアプリケー ションに含めることができます。 Apex クラスとは異なり、管理パッケージにおける Visualforce ページのコンテンツは、パッケージがインストー ルされている場合は非表示になりません。ただし、カスタムコントローラ、コントローラ拡張、およびカスタム コンポーネントは非表示になります。さらに、access 属性によって、カスタムコンポーネントがご使用の名前 空間でのみ実行されるように制限できます。 Salesforce.com は、Visualforce コンポーネントまたは Apex コンポーネントを配布する場合にのみ管理パッケージ を使用することをお勧めします。これは、管理パッケージが、ページ、コンポーネント、クラス、メソッド、変 数などの名前の先頭に自動的に追加される固有の名前空間を受け取るためです。この名前空間のプレフィックス によって、インストーラの組織内で名前が複製されることを防ぐことができます。 Visualforce ページを使用してパッケージを作成する場合は、次の警告を考慮する必要があります。 • 管理パッケージに含められるコンポーネントの access 属性が global に設定されている場合は、次の制限事 項に注意してください。 ◊ コンポーネントの access 属性は public に変更できません。 ◊ すべての必須の子 コンポーネント (true に設定された必須属性を持つコンポーネント) の access 属性は global に設定されている必要があります。 ◊ 必須の子 に default 属性が設定されている場合、それを削除または変更することは できません。 ◊ 新規の必須の子 コンポーネントを追加することはできません。 ◊ 子 コンポーネントの access 属性が global に設定されている場合、その属性を public に変更することはできません。 ◊ 子 コンポーネントの access 属性が global に設定されている場合、type 属性を変 更することはできません。 • global でないコンポーネントを持つパッケージがインストールされている場合は、ユーザがそのコンポーネン トを [設定] で表示しようとすると、コンポーネントのコンテンツの代わりに「Component is not global (コン ポーネントは global ではありません)」と表示されます。さらに、コンポーネントはコンポーネントの参照に 含まれません。 • パッケージをインストールする組織で高度な通貨管理が有効になっている場合、 を使用する Visualforce ページはインストールできません。 • Force.com AppExchange アプリケーションの一部として含まれる Apex は、いずれも累積テストカバー率が 75% 以上である必要があります。パッケージを AppExchange にアップロードすると、すべてのテストが実行され、 261 Force.com AppExchange アプリケーションへの Visualforce の追加 Visualforce ページとコンポーネントのパッケージバー ジョン設定の管理 エラーがない状態で実行されていることが確認されます。テストは、パッケージがインストールされている 場合にも実行されます。 • バージョン 16.0 以降、管理された global Apex クラスを Visualforce コントローラとして使用している場合、 登録者が次のメソッドとプロパティを使用できるように、これらのアクセスレベルを global に設定する必要 があります。 ◊ カスタムコントローラのコンストラクタ ◊ 入力および出力コンポーネント用などの getter メソッドと setter メソッド ◊ プロパティの get 属性と set 属性 ヒント: Apex クラスまたは Visualforce ページが翻訳を含むカスタム表示ラベルを参照している場合、そ の翻訳をパッケージに組み込むには、個々の言語を明示的にパッケージに含める必要があります。 Visualforce ページを含むパッケージが組織にインストールされている場合、ページは、salesforce.com ドメイ ンではなく、visual.force.com ドメインから配信されます。これにより、パッケージの悪意のあるコードが データに影響を与えるのを回避します。 関連リンク カスタムコントローラおよびコントローラ拡張のテスト Visualforceページとコンポーネントのパッケージバージョン設 定の管理 Visualforce マークアップがインストール済み管理パッケージを参照する場合、Visualforce マークアップが参照す る各管理パッケージのバージョン設定が、下位互換性を補助するために保存されます。これにより、管理パッ ケージのコンポーネントが次のバージョンのパッケージにアップグレードした場合にも、特定の既知の動作を行 うバージョンにページが引き続きバインドされるようになります。 パッケージバージョンは、パッケージでアップロードされる一連のコンポーネントを特定する番号です。バー ジョン番号の形式は majorNumber.minorNumber.patchNumber (例: 2.1.3) です。メジャー番号とマイナー番号 は、毎回のメジャーリリース時に指定した値に増えます。patchNumber は、パッチリリースにのみ生成および更 新されます。公開者は、パッケージバージョンを使用して、後続のパッケージバージョンをリリースすることに より、そのパッケージを使用する既存の顧客の統合を分割することなく管理パッケージのコンポーネントを強化 することができます。 メモ: パッケージコンポーネントと Visualforce カスタムコンポーネントの概念は大きく異なります。パッ ケージは、カスタムオブジェクト、Apex クラスとトリガ、カスタムページおよびカスタムコンポーネン トなどの、多くの要素で構成されます。 Visualforce ページまたはカスタムコンポーネントのパッケージバージョンを設定する手順は、次のとおりです。 1. Visualforce ページまたはコンポーネントを編集して、[バージョン設定] をクリックします。 2. Visualforce ページまたはコンポーネントが参照する各管理パッケージの[バージョン]を選択します。より新し いバージョンの管理パッケージがインストールされても、バージョン設定を手動で更新しない限り、ページ またはコンポーネントではこのバージョンの管理パッケージが引き続き使用されます。インストール済み管 理パッケージを設定リストに追加するには、使用可能なパッケージのリストからパッケージを選択します。 262 Force.com AppExchange アプリケーションへの Visualforce の追加 Visualforce ページとコンポーネントのパッケージバー ジョン設定の管理 ページまたはコンポーネントに関連付けていないインストール済み管理パッケージがある場合にのみ、リス トは表示されます。 3. [保存] をクリックします。 パッケージバージョン設定を使用する場合は、次のことに注意してください。 • 管理パッケージのバージョンを指定せずに、管理パッケージを参照する Visualforce ページまたはカスタムコ ンポーネントを保存する場合、ページまたはコンポーネントは、デフォルトで最新のインストールバージョ ンの管理パッケージと関連付けられます。 • パッケージがページまたはコンポーネントにより参照されている場合は、管理パッケージの Visualforce ペー ジまたはコンポーネントのバージョン設定を削除することはできません。管理パッケージの参照元を調べる には、[連動関係の表示] を使用します。 関連リンク Visualforce のバージョン設定方法 カスタムコンポーネントのバージョン設定の管理 263 第 20 章 Visualforce ページでの JavaScript の使用 Visualforce ページで JavaScript を使用すると、幅広い既存の JavaScript 機能 (JavaScript ライブラリなど) や、ページ の機能をカスタマイズするその他の方法を利用できます。 などの action タグは Ajax 要求をサポートしています。 警告: ページに JavaScript を含めることで、Visualforce を使用するときは発生しないブラウザ間やメンテ ナンスの問題が発生する可能性があります。JavaScript を記述する前に、既存の Visualforce コンポーネン トでは問題を解決できないことを確認してください。 Visualforce ページに JavaScript を含める最適な方法は、静的リソースに JavaScript を配置してそこからコールする 方法です。次に例を示します。 これで、 Change my font weight! {!$Component.thePanel} 式は、 コンポーネントによって生成される HTML 要素の DOM ID を取得するために使用されます。$Component グローバル変数を使用すると、Visualforce コンポーネント用に生成される DOM ID の参照が簡略化され、ページ構造全体での連動関係の一部が削減され ます。 関連リンク コンポーネント ID へのアクセスのベストプラクティス $Component Visualforce での JavaScript ライブラリの使用 Visualforce ページに JavaScript ライブラリを含めると、これらのライブラリが提供する機能を活用できます。 JavaScript ライブラリを含める場合、静的リソースを作成してから、ページに コンポー ネントを追加してライブラリを含めるのが最適な方法です。 265 Visualforce ページでの JavaScript の使用 Visualforce での JavaScript ライブラリの使用 たとえば、MooTools (http://mootools.net/) を使用する場合、mootools という名前でライブラリの静的リソース を作成し、次のようにページ内で参照します。 その後、ライブラリから関数をコールする

Congratulations

Change me! Visualforce ページで JavaScript ライブラリを使用し、そのライブラリで $ が特殊文字として定義されている場合、 JavaScript を変更して、この特殊文字としての使用を上書きする必要があります。たとえば、jQuery を使用する場 合、jQuery.noConflict() 関数を使用して $ の定義を上書きできます。 メモ: Chatter コンポーネント 、または を使用するページでは、バージョン 3 より前の Ext JS バージョ ンを使用しないでください。 266 Visualforce ページでの JavaScript の使用 Apex コントローラの JavaScript Remoting Apex コントローラの JavaScript Remoting JavaScript から Apex コントローラのメソッドをコールするには、Visualforce の JavaScript Remoting を使用します。 これにより、AJAX 機能を実装した標準 Visualforce コンポーネントでは実現できない、複雑で動的な動作を行う ページを作成できます。 JavaScript Rmoting は、次の 3 つで構成されています。 • JavaScript で記述される、Visualforce ページに追加するリモートメソッドの呼び出し。 • Apex コントローラクラスのリモートメソッド定義。このメソッドは Apex で記述されますが、通常の action メソッドとはいくつかの違いがあります。 • JavaScript で記述される、Visualforce ページに追加または含めるレスポンスハンドラコールバック関数。 Visualforce ページへの JavaScript Remoting の追加 Visualforce ページで JavaScript Remoting を使用するには、要求を次の形式の JavaScript 呼び出しとして追加しま す。 [ a e ace.]c e . e h d( [parameters...,] cabackF c i , [configuration] ); • namespace はコントローラクラスの名前空間です。組織に名前空間が定義されている場合、またはクラスが • インストール済みパッケージに基づく場合は必須です。 controller は Apex コントローラの名前です。 • method はコールする Apex メソッドの名前です。 • parameters はメソッドが取るパラメータのカンマ区切りのリストです。 • callbackFunction はコントローラからの応答を処理する JavaScript 関数の名前です。匿名関数をインライン で宣言することもできます。callbackFunction ではメソッドコールの状況と結果をパラメータとして返し ます。 • configuration は、リモートコールと応答の処理を設定します。Apex メソッドの応答をエスケープするかど うかを指定するなど、リモートコールの動作を変更する場合にこれを使用します。 リモートメソッドコールは同期して実行されますが、応答が返されるのを待機しません。応答が返されると、 コールバック関数は非同期で応答を処理します。詳細は、「リモート応答の処理」を参照してください。 JavaScript Remoting 要求の設定 Remoting 要求の宣言時に構成設定を使用してオブジェクトを指定することで、Remoting 要求を設定します。た とえば、デフォルトの設定パラメータは次のようになります。 { buffer: true, escape: true, timeout: 30000 } これらの設定パラメータに順序はありません。また、デフォルトから変更の必要がないパラメータは省略できま す。 JavaScript Remoting では、次の設定パラメータをサポートしています。 267 Visualforce ページでの JavaScript の使用 Apex コントローラの JavaScript Remoting 名前 データ型 説明 buffer Boolean 相互に近い時間に実行される要求を 1 つの要求にグルー プ化するかどうかを指定します。デフォルトは、true です。 JavaScript Remoting では、相互に近い時間に実行される 複数の要求を最適化し、これらを 1 つの要求にグルー プ化します。このバッファリングにより、要求および 応答のサイクルの全体的な効率性が改善されますが、 場合によってはすべての要求が個別に実行されるよう にする方が便利なこともあります。 escape Boolean Apex メソッドの応答をエスケープするかどうかを指定 します。デフォルトは、true です。 timeout Integer 要求のタイムアウト (ミリ秒単位)。デフォルトは 30000 (30 秒) です。最大値は 120000 (120 秒 = 2 分) です。 Visualforce Remoting オブジェクトを使用してタイムアウトを設定することで、ページで行われるすべての要求に 対して要求タイムアウトを設定することもできます。 ページレベルのタイムアウト設定を要求単位で上書きするには、その要求の設定オブジェクトのタイムアウト を、上記の説明に従って設定します。 JavaScript Remoting の OAuth 2.0 認証 JavaScript Remoting 要求では、認証に標準のユーザ名とパスワードによるログインプロセスではなく、OAuth 2.0 を使用できます。OAuth では、標準の認証ではセキュアに実行できないアプリケーション間および組織間統合が 可能です。 Visualforce ページでは、認証用の OAuth がページレベルで設定され、すべての JavaScript Remoting 要求に OAuth が使用されます。設定を除き、JavaScript Remoting の使用法はまったく同じです。 Visualforce ページから JavaScript Remoting 用の OAuth を設定するには、次のようにします。 oauthAccessToken を一度設定すると、すべての JavaScript Remoting 要求で OAuth が使用されます。残りの JavaScript Remoting コードには変更は必要ありません。 oauthAccessToken は、ページのコードで取得される OAuth 認証トークンです。アクセストークンの取得と更 新は簡単な OAuth で直接行われ、追加部分が 1 つあります。JavaScript Remoting の OAuth 認証では "visualforce" スコープが要求されるため、このスコープを使用するか、これを含むスコープ ("web" や "full") を使用してトーク ンを生成する必要があります。OAuth 要求で、scope=visualforce (あるいは "web" または "full") と設定しま す。 アクセストークンの取得および Force.com プラットフォームでの OAuth の使用についての詳細は、Salesforce オ ンラインヘルプの「リモートアクセスアプリケーションの認証」および wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com を参照してください。 名前空間および JavaScript Remoting 特にパッケージで提供されるメソッドに Remotoing コールを行うページで名前空間との連携をより簡単に行うた め、$RemoteAction グローバル変数を使用して、リモートアクションの正しい名前空間 (ある場合) を自動的に 解決できます。この機能を使用するには、JavaScript Remoting を明示的に呼び出す必要があります。これを実行 するパターンは次のとおりです。 Visualforce.remoting.Manager.invokeAction( 'f  _ aified_ e e_ac i ', i ca i _ a a e e ); 完全修飾リモートアクションは、 a e ace[.Ba eCa ][.C ai i gCa ].C c e eCa .Me h d のよ うに、名前空間、ベースクラスなどを含むリモートアクションメソッドへの完全なパスを表す文字列です。名前 空間を自動的に解決するには、たとえば、{!$RemoteAction.MyController.getAccount} のように、式に $RemoteAction を使用します。 呼び出しパラメータは、リモートメソッドの呼び出しの実行に使用される引数であり、標準リモートコールを行 うために使用される引数と同じです。 • @RemoteAction メソッドに送信するためのパラメータ (ある場合)。 • • 返される結果を処理するコールバック関数。 呼び出しに関する設定詳細 (ある場合)。 たとえば、次のような取引先を取得するリモート呼び出しを定義するとします。 この JavaScript Remoting コールでは、コントローラが定義されている名前空間、自分の名前空間内にあるか、イ ンストールされたパッケージが提供する名前空間内にあるなどの詳細を把握している必要がありません。また、 組織に定義済みの名前空間がない状況にも対応します。 メモ: invokeAction のコール時に発生したエラーは JavaScript コンソールでのみレポートされます。た とえば、$RemoteAction で複数の名前空間に一致する @RemoteAction メソッドが見つかった場合、最 初に一致したメソッドを返し、JavaScript コンソールに警告を記録します。一致するコントローラまたは アクションが見つからない場合は、そのコールはエラーを表示することなく失敗し、エラーは JavaScript コンソールに記録されます。 リモートメソッドの宣言 コントローラでは、Apex のメソッド宣言は、次のように @RemoteAction アノテーションが先頭に付加されま す。 @RemoteAction global static String getItemId(String objectName) { ... } メソッドでは、引数として、Apex プリミティブ、コレクション、型指定された sObject、汎用 sObject、ユーザ定 義された Apex クラスおよびインターフェースを取ることができます。汎用 sObject では、実際の型を特定するた めに ID または sobjectType の値を指定する必要があります。インターフェースパラメータでは、実際の型を特定 するために apexType を指定する必要があります。 メソッドでは Apex プリミティブ、sObject、コレクション、ユーザ定義された Apex クラスおよび列挙、 SaveResult、UpsertResult、DeleteResult、SelectOption、または PageReference を返すことができま す。 JavaScript Remoting に使用されるメソッドは、名前とパラメータ数によって一意に識別される必要があります。 オーバーロードは不可能です。たとえば、上記のメソッドでは、一緒に getItemId(Integer productNumber) メソッドを持つことはできません。代わりに、異なる名前で複数のメソッドを宣言します。 • • getItemIdFromName(String objectName) getItemIdFromProductNumber(Integer productNumber) Apex メソッドは static で、かつ global または public のいずれかである必要があります。グローバルに公開 されるリモートアクションで繊細な操作を実行したり、非公開のデータを公開したりしないようにしてくださ い。global リモートアクションは他の global メソッドのみをコールできます。public リモートアクションは global コンポーネントでは使用できません。一方、global スコープでは使用できます。スコープのエスカレー ションはコンパイルエラーになります。または、実行時に解決される参照の場合は、実行時エラーになります。 次の表では、これらの制限を詳細に説明します。 @RemoteAction のス Visualforce Page 非グローバルコン ポーネント グローバルコンポー iframe ネント グローバルリモート 使用可能 メソッド 使用可能 使用可能 使用可能 公開リモートメソッ 使用可能 ド 使用可能 エラー エラー コープ 270 Visualforce ページでの JavaScript の使用 Apex コントローラの JavaScript Remoting コンポーネント、 タグまたは タグによって間接的に含まれるマークアッ プを介してリモートアクションにアクセスする場合、リモートメソッドのスコープは最上位コンテナ (スコープ のエスカレーションルールに準拠する必要のある包含階層の最上位項目) に継承されます。 最上位コンテナ @RemoteAction のア Visualforce Page クセス元 非グローバルコン ポーネント グローバルコンポー iframe ネント グローバルコンポー 使用可能 ネント 使用可能 使用可能 使用可能 非グローバルコン ポーネント 使用可能 非グローバルコン ポーネントが公開リ モートメソッドを含 まない場合にのみ使 用可能。 非グローバルコン ポーネントが公開リ モートメソッドを含 まない場合にのみ使 用可能。 なし なし エラー 使用可能 同じ名前空間内では 使用可能。名前空間 が異なる場合および 含まれるページまた はその子階層に公開 リモートメソッドが 含まれる場合はエ ラー。 リモートメソッドと継承 @RemoteAction メソッドが検索またはコールされる場合、Visualforce ではページコントローラの継承階層を調 べ、コントローラの上位階層のクラス内で @RemoteAction メソッドを検索します。 この機能を示す例を次に示します。次の Apex クラスでは 3 階層の継承階層を形成します。 global with sharing class ChildRemoteController extends ParentRemoteController { } global virtual with sharing class ParentRemoteController extends GrandparentRemoteController { } global virtual with sharing class GrandparentRemoteController { @RemoteAction global static String sayHello(String helloTo) { return 'Hello ' + helloTo + ' from the Grandparent.'; } } この Visualforce ページでは簡単な sayHello リモートアクションをコールします。 271 Visualforce ページでの JavaScript の使用 Apex コントローラの JavaScript Remoting
[Results]
リモートメソッドは ChildRemoteController クラス内には存在しません。代わりに、 GrandparentRemoteController から継承されます。 インターフェースパラメータによるリモートメソッドの宣言 具象クラスに制限するのではなく、インターフェースパラメータと戻り値のデータ型を使用して @RemoteAction メソッドを宣言できます。これにより、たとえば、パッケージプロバイダは、リモートメソッドと関連付けられ たインターフェースをパッケージ化できます。登録者組織は、パッケージ化されたインターフェースを実装する 独自のクラスに渡すことによって、Visualforce ページからコールできます。 次に、簡単な例を示します。 public class RemoteController { public interface MyInterface { String getMyString(); } public class MyClass implements MyInterface { private String myString; public String getMyString() { return myString; } public void setMyString(String s) { myString = s; } } @RemoteAction public static MyInterface setMessage(MyInterface i) { MyClass myC = new MyClass(); myC.setMyString('MyClassified says "' + i.getMyString() + '".'); return myC; } } JavaScript Remoting コールからインターフェースパラメータを宣言する @RemoteAction に送信されるオブジェク トは apexType 値を含む必要があります。この値は、具象クラスへの完全修飾パス、つまり、 a e ace[.Ba eCa ][.C ai i gCa ].C c e eCa である必要があります。たとえば、上記のコン トローラへの JavaScript Remoting コールを実行するには、次のコードを使用します。 Visualforce.remoting.Manager.invokeAction( '{!$RemoteAction.RemoteController.setMessage}', {'apexType':'thenamespace.RemoteController.MyClass', 'myString':'Lumos!'}, handleResult ); 組織内にクラス定義がある場合は、Remoting コールを単純化し、デフォルトの c 名前空間も使用できます。 RemoteController.setMessage( {'apexType':'c.RemoteController.MyClass', 'myString':'Lumos!'}, handleResult ); リモート応答の処理 リモートメソッドコールに対する応答は、リモートメソッドコールで提供されているコールバック関数によって 非同期に処理されます。コールバック関数は、リモートコールの状況を表す event オブジェクト、およびリモー ト Apex メソッドで返される result オブジェクトをパラメータとして取得します。関数は返されるデータに基 づいてページの情報およびユーザインターフェース要素を更新できます。 event オブジェクトは、リモートコールの成功または失敗に対応するうえで役立つ値を提供します。 272 Visualforce ページでの JavaScript の使用 Apex コントローラの JavaScript Remoting • event.status は、成功のときは true、エラーのときは false になります。 • event.type は応答の種別です。成功したコールは rpc、リモートメソッドが例外を返した場合は exception • のようになります。 event.message には、返されたエラーメッセージが含まれます。 • event.where には、リモートメソッドにより生成された場合は、Apex スタック追跡が含まれます。 string または number など、result によって返される Apex プリミティブデータ型は対応する JavaScript に変換さ れます。返される Apex オブジェクトは JavaScript オブジェクトに変換され、コレクションは JavaScript 配列に変 換されます。JavaScript は大文字と小文字を区別することに注意してください。そのため、id、Id、および ID は 異なる項目であるとみなされます。 JavaScript リモートコールの一部として、Apex メソッド応答に同じオブジェクトに対する参照が含まれる場合、 そのオブジェクトは返される JavaScript オブジェクトには複製されません。代わりに、表示される JavaScript オブ ジェクトには同じオブジェクトへの参照が含まれます。たとえば、同一オブジェクトを 2 回含むリストを返す Apex メソッドです。 デフォルトでは、リモートコールの応答は、30 秒以内に返される必要があります。これを超えると、コールはタ イムアウトになります。要求の完了にこれ以上の時間を必要とする場合は、長いタイムアウトを 120 秒以内で設 定します。 リモートコールの応答の最大サイズは 15 MB です。 JavaScript Remoting コードがこの制限を超える場合は、次のように対応できます。 • • • • 各要求の応答サイズを削減する。必要なデータのみを返します。 大量データの取得を、小さなチャンクを返す複数の要求に分割する。 バッチ以外の要求を使用していることを確認する。Remoting 要求の設定ブロックで { buffer: false } と 設定します。 バッチ要求の使用頻度を抑え、バッチサイズを削減する。 メモ: JavaScript Remoting を使用時に開発中の JavaScript コンソールを開いたままにします。JavaScript Remoting で発生するエラーや例外は、JavaScript コンソールが有効化されている場合はそれに記録され、 有効化されていない場合は無視されます。 プログラミングエラーまたはその他の失敗により @RemoteAction メソッドで例外が発生すると、Apex スタック 追跡がブラウザに返されます。JavaScript デバッガコンソールでスタック追跡を検査するか、応答コールバック関 数のエラー処理でスタック追跡を使用します。次のコールバック関数では、例外がある場合にスタック追跡を表 示します。 JavaScript Remoting および コンポーネントを使用すると、JavaScript によりコントローラアクションメソッドを コールすることもできます。この 2 つの相違点の一部を次に示します。 タグ • ◊ ユーザが再表示ターゲットを指定できる ◊ フォームを送信する ◊ JavaScript の記述は不要 JavaScript Remoting: • ◊ ユーザがパラメータを渡すことができる ◊ コールバックを提供する ◊ 一部の JavaScript を記述する必要がある 通常、 の方が使いやすく、必要なコードも少なくなります。一方、JavaScript では、よ り高度な柔軟性を提供できます。 JavaScript Remoting の例 Visualforce ページでの JavaScript Remoting の使用方法の基本的なサンプルを次に示します。まず、次のように AccountRemoter という Apex コントローラを作成します。 global with sharing class AccountRemoter { public String accountName { get; set; } public static Account account { get; set; } public AccountRemoter() { } // empty constructor @RemoteAction global static Account getAccount(String accountName) { account = [SELECT Id, Name, Phone, Type, NumberOfEmployees FROM Account WHERE Name = :accountName]; return account; } } @RemoteAction アノテーション以外、これは他のコントローラ定義と同じように見えます。 このリモートメソッドを使用するためには、次のような Visualforce ページを作成します。
このマークアップについては、次の点に注意してください。 • JavaScript は、明示的な invokeAction Remoting コールを使用し、$RemoteAction グローバル変数を活用し てリモートアクションメソッドの正しい名前空間を解決します。 • event.status 変数は、コールが成功した場合にのみ true になります。この例で示したエラー処理は意図的 に単純にしてあり、エラーメッセージとスタック追跡が、event.message 値と event.where 値からそれぞ れ出力されます。要求でメソッドコールが成功しない場合は、これに代わるさらに強固なロジックを実装す ることをお勧めします。 • result 変数は、Apex の getAccount メソッドから返されるオブジェクトを表します。 • プレーン HTML 要素の DOM ID へのアクセス方法は単純で、項目の ID を使用するだけです。 • ID が一意になるようにするために、Visualforce コンポーネントの DOM ID は動的に生成されます。上記の コードでは、$Component グローバル変数を介してコンポーネントにアクセスすることによってその ID を取 得するために、「JavaScript を使用したコンポーネントの参照」で説明した方法を使用しています。 275 第 21 章 ベストプラクティス Visualforce ページでは次のベストプラクティスを使用できます。 • Visualforce のパフォーマンス向上のためのベストプラクティス • コンポーネント ID へのアクセスのベストプラクティス • 静的リソースのベストプラクティス • コントローラおよびコントローラ拡張のためのベストプラクティス • コンポーネント facet の使用のためのベストプラクティス • ページブロックコンポーネントのベストプラクティス • PDF を表示するためのベストプラクティス • のベストプラクティス Visualforceのパフォーマンス向上のためのベストプラクティス Visualforce は、標準の Salesforce ページの機能、動作およびパフォーマンスに合わせる機能を開発者に提供するた めに設計されました。遅延、予期しない動作や、その他の問題 (特に Visualforce に関するもの) がある場合は、い くつかの対処法を実行することにより、操作性を改善できるだけでなく、コーディングの改善にも役立てること ができます。 まず、次を確認して、Visualforce に問題があるかどうかを特定します。 • 予測される Visualforce の機能を他のマシンや他のブラウザを使用してテストし、その問題が 1 台のユーザの コンピュータに限らないことを確認する。 • 他の Salesforce ページの読み込み時間を確認して、読み込みに時間がかかることがネットワーク上の問題では ないことを確認する。他のページの読み込みにも時間がかかる場合は、Salesforce における帯域幅や待ち時間 の問題が原因である可能性があります。Salesforce サーバの状況を確認するには、trust.salesforce.comを参照し てください。また、ネットワーク接続の状況をチェックして、適切に機能しているかどうかを確認する必要 があります。 • JavaScript および CSS の縮小、Web 画像の最適化、できる限り iframe の使用を避けるなど、一般的な Web 設 計のベストプラクティスに従っていることを確認する。 • 開発者コンソールを使用して、要求をステップごとに実行し、要求内のどの項目がシステムリソースを最も 消費したかを調べる。Salesforce オンラインヘルプの「開発者コンソールの使用」を参照してください。 次のリストは、よく発生する Visualforce のパフォーマンス上の問題と解決策を示したものです。 276 ベストプラクティス Visualforce のパフォーマンス向上のためのベストプラク ティス ビューステートのサイズ Visualforce ページのビューステートのサイズは、135 KB 未満である必要があります。ビューステートのサ イズを縮小することにより、ページをより迅速に読み込み、表示が停止する頻度を削減します。 開発モードフッターの [ビューステート] タブを使用し、次の対処法を実行すると、ビューステートのパ フォーマンスを監視できます。 • 状態の維持に不可欠ではなく、ページの更新時にも不要な変数には、Apex コントローラで transient キーワードを使用する。 • ビューステートの大部分をコントローラまたはコントローラ拡張で使用されているオブジェクトから取 得していることが分かった場合は、Visualforce ページに関連するデータのみを戻すように SOQL コール の絞り込みを検討する。 • ビューステートが大規模なコンポーネントツリーの影響を受けている場合は、ページが依存しているコ ンポーネント数の削減を試みる。 読み込み時間 サイズが大きいページは読み込み時間に直接影響します。Visualforce ページの読み込み時間を改善するに は、次の対処法を実行します。 • アイコンの画像など頻繁にアクセスするデータをキャッシュする • Apex コントローラの getter メソッドで SOQL クエリを使用しない • 次の対処法を実行して、ページ上に表示するレコード件数を削減する ◊ Apex コントローラで SOQL コールから返されるデータを制限する。たとえば、WHERE 句で AND ス テートメントを使用したり、null の結果を削除したりします。 ◊ リストコントローラでページネーションを活用して、ページあたりの表示レコード件数を削減する。 • Apex オブジェクトを遅延読み込みして要求時間を削減する • タグ外に JavaScript を移動し、 終了タグのすぐ前の

Click Me
/*** Controller ***/ public class exampleCon { String uname; public String getUsername() { return uname; } public PageReference sayHello() { uname = UserInfo.getName(); return null; } 290 標準のコンポーネントの参照 apex:actionFunction public void setState(String n) { state = n; } public String getState() { return state; } public PageReference methodOne() { return null; } private String state = 'no'; } 属性 必須項 API アクセ バー 目 ス ジョン 属性名 属性型 action ApexPages.Action ページマークアップの他の場所で DOM イベント によって actionFunction がコールされるときに呼び 出される action メソッド。このメソッドを参照す るには、差し込み項目の構文を使用します。たと えば、action="{!save}" ではコントローラの save メ ソッドを参照します。アクションが指定されてい ない場合、ページは単に更新されます。 12.0 global focus String AJAX 要求の完了後にフォーカスされるコンポーネ ントの ID。 12.0 global id String ページの他のコンポーネントが actionFunction コン ポーネントを参照できるようにする識別子。 12.0 global immediate Boolean ページの項目に関連付けられている入力規則を処 理することなく、このコンポーネントに関連付け られているアクションをすぐに実行するかどうか を指定する boolean 値。true に設定すると、アク ションがすぐに実行され、入力規則はスキップさ れます。指定されていない場合、この値はデフォ ルトの false に設定されます。 12.0 global name String ページマークアップの他の場所で呼び出された場 はい 合の JavaScript 関数の名前。action 属性で指定され ているメソッドを実行します。action メソッドが完 了すると、reRender 属性で指定されるコンポーネ ントが更新されます。 12.0 global onbeforedomupdate String onbeforedomupdate イベントの発生時 (AJAX 要求が 処理されたとき、ただし、ブラウザの DOM が更 新される前) に呼び出される JavaScript。 12.0 global String AJAX 更新要求の結果がクライアントで完了したと きに呼び出される JavaScript。 12.0 global oncomplete 説明 291 標準のコンポーネントの参照 apex:actionPoller 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 12.0 global reRender Object action メソッドの結果がクライアントに返されると きに再作成される 1 つ以上のコンポーネントの ID。 この値には、単一の ID、ID のカンマ区切りのリス ト、または ID のリストまたはコレクションの差し 込み項目の式を使用できます。 12.0 global status String AJAX 更新要求の状況を表示する関連付けられてい るコンポーネントの ID。「actionStatus コンポーネ ント」を参照してください。 12.0 global timeout Integer AJAX 更新要求がタイムアウトするまでの時間 (ミ リ秒)。 12.0 global apex:actionPoller 指定した間隔に従って AJAX 要求をサーバに送信するタイマーです。各要求により、ページの全体または一部を 更新できます。 は作用するリージョン内にある必要があります。たとえば、 を併用するには、 内にある必要があ ります。 を使用するときの考慮事項 で使用する action メソッドを軽量にする。これは、 からコー • ルされる action メソッドで、DML の実行、外部サービスコール、およびリソースを大量に消費する他の操作 を回避するためのベストプラクティスです。指定した間隔で から繰り返しコールさ れる action メソッドの影響を考慮します。特に、広範囲にわたって配布されたり、長期間開いたままになっ たりするページで使用する場合には注意が必要です。 では、ログインセッションをアクティブに保持しながら接続が定期的に更新されま • す。 が存在するページは、非アクティブであるという理由でタイムアウトになること はありません。 • 他のアクションの結果として再表示される場合は、 自体がリセットされます。 • このコンポーネントは拡張リストとは併用しないでください。 例 292 /*** Controller: ***/ public class exampleCon { Integer count = 0; public PageReference incrementCounter() { count++; return null; } public Integer getCount() { return count; } } 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン この値には、単一の ID、ID のカンマ区切りのリス ト、または ID のリストまたはコレクションの差し 込み項目の式を使用できます。 status String AJAX 更新要求の状況を表示する関連付けられてい るコンポーネントの ID。「actionStatus コンポーネ ント」を参照してください。 10.0 global timeout Integer AJAX 更新要求がタイムアウトするまでの時間 (ミ リ秒)。 10.0 global apex:actionRegion AJAX 要求の生成時に Force.com サーバが処理する必要のあるコンポーネントを区切る Visualforce ページの領域 です。 の本文のコンポーネントのみがサーバによって処理されるため、ページのパフォー マンスが向上します。 コンポーネントは要求時にサーバが処理するコンポーネントのみを定義します。要求が 完了したときに再表示されるページの領域は定義しません。動作を制御するには、、または コンポーネントの rerender 属性を使用します。 「transient キーワードの使用」 も参照してください。 {!text(now())} 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン id String ページの他のコンポーネントがコンポーネントを 参照できるようにする識別子。 10.0 global immediate Boolean ページの項目に関連付けられている入力規則を処 理することなく、このコンポーネントに関連付け られているアクションをすぐに実行するかどうか を指定する boolean 値。true に設定すると、アク ションがすぐに実行され、入力規則はスキップさ れます。指定されていない場合、この値はデフォ ルトの false に設定されます。 11.0 global rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 10.0 global renderRegionOnly Boolean actionRegion の処理時に actionRegion 外で AJAX が 呼び出す動作を無効にするかどうかを指定する boolean 値。true に設定すると、actionRegion 外にあ るコンポーネントは AJAX レスポンスには含まれ ません。false に設定すると、ページのすべてのコ ンポーネントがレスポンスに含まれます。指定さ れていない場合、この値はデフォルトの true に設 定されます。 10.0 global apex:actionStatus AJAX 更新要求の状況を表示するコンポーネントです。AJAX 要求の状況は進行中または完了のいずれかです。 例 295 標準のコンポーネントの参照 apex:actionStatus /*** Controller: ***/ public class exampleCon { Integer count = 0; public PageReference incrementCounter() { count++; return null; } public Integer getCount() { return count; } } 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン dir String 生成された HTML コンポーネントの読み取り方 向。使用可能な値には「RTL」(右から左) または 「LTR」(左から右) があります。 10.0 global for String 状況インジケータが状況を表示している actionRegion コンポーネントの ID。 10.0 global id String ページの他のコンポーネントが actionStatus コン ポーネントを参照できるようにする識別子。 10.0 global lang String 「en」または「en-US」など、生成された HTML 出力の基本言語。この属性についての詳細は、W3C 仕様を参照してください。 10.0 global layout String actionStatus コンポーネントをページに表示する方 法。使用可能な値には、div HTML 要素にコンポー ネントを埋め込む「block」または span HTML 要 素にコンポーネントを埋め込む「inline」がありま す。指定されていない場合、この値はデフォルト の「inline」に設定されます。 10.0 global onclick String onclick イベントが発生した場合 (このコンポーネン トをクリックした場合) に呼び出される JavaScript。 10.0 global ondblclick String ondblclick イベントが発生した場合 (このコンポー ネントをダブルクリックした場合) に呼び出される JavaScript。 10.0 global onkeydown String onkeydown イベントが発生した場合 (ユーザがキー ボードのキーを押した場合) に呼び出される JavaScript。 10.0 global onkeypress String onkeypress イベントが発生した場合 (ユーザがキー ボードのキーを押したか、押したままにした場合) に呼び出される JavaScript。 10.0 global 296 標準のコンポーネントの参照 apex:actionStatus 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン onkeyup String onkeyup イベントが発生した場合 (ユーザがキーボー ドのキーを放した場合) に呼び出される JavaScript。 10.0 global onmousedown String onmousedown イベントが発生した場合 (ユーザがマ ウスボタンをクリックした場合) に呼び出される JavaScript。 10.0 global onmousemove String onmousemove イベントが発生した場合 (ユーザがマ ウスポインタを移動した場合) に呼び出される JavaScript。 10.0 global onmouseout String onmouseout イベントが発生した場合 (ユーザがコン ポーネントからマウスポインタを移動した場合) に 呼び出される JavaScript。 10.0 global onmouseover String onmouseover イベントが発生した場合 (ユーザがマ ウスポインタをコンポーネントに重ねた場合) に呼 び出される JavaScript。 10.0 global onmouseup String onmouseup イベントが発生した場合 (ユーザがマウ スボタンを放した場合) に呼び出される JavaScript。 10.0 global onstart String AJAX 要求の開始時に呼び出される JavaScript。 10.0 global onstop String AJAX 要求の完了時に呼び出される JavaScript。 10.0 global rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 10.0 global startStyle String AJAX 要求の開始時の状況要素の表示に使用される スタイル。主にインライン CSS スタイルを追加す るために使用されます。 10.0 global startStyleClass String AJAX 要求の開始時の状況要素の表示に使用される スタイルクラス。外部 CSS スタイルシートを使用 するときに適用される CSS スタイルの指定に主に 使用されます。 10.0 global startText String AJAX 要求の開始時に表示される状況テキスト。 10.0 global stopStyle String AJAX 要求の完了時の状況要素の表示に使用される スタイル。インライン CSS スタイルの追加に主に 使用されます。 10.0 global stopStyleClass String AJAX 要求の完了時の状況要素の表示に使用される スタイルクラス。外部 CSS スタイルシートを使用 するときに適用される CSS スタイルの指定に主に 使用されます。 10.0 global AJAX 要求の完了時に表示される状況テキスト。 10.0 global stopText String 297 標準のコンポーネントの参照 apex:actionSupport 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン style String AJAX 要求の状態を問わず、状況要素の表示に使用 されるスタイル。インライン CSS スタイルの追加 に主に使用されます。 10.0 global styleClass String AJAX 要求の状態を問わず、状況要素の表示に使用 されるスタイルクラス。外部 CSS スタイルシート を使用するときに適用される CSS スタイルの指定 に主に使用されます。 10.0 global title String ユーザがコンポーネントにマウスポインタを重ね たときにツールチップとして表示されるテキスト。 10.0 global Facet facet 名 説明 API バー ジョン start AJAX 要求の開始時に表示されるコンポーネント。この facet は、startText 10.0 属性の代わりに使用します。actionStatus コンポーネントの外観は、属性 name="start" を含む facet によって要求の開始時に制御されるため、start facet が actionStatus コンポーネントの本文に表示される順序は重要ではあ りません。 stop AJAX 要求の完了時に表示されるコンポーネント。この facet は、stopText 10.0 属性の代わりに使用します。actionStatus コンポーネントの外観は、属性 name="stop" を含む facet によって要求の完了時に制御されるため、stop facet が actionStatus コンポーネントの本文に表示される順序は重要ではあ りません。 apex:actionSupport 他のコンポーネントに AJAX サポートを追加するコンポーネントです。このコンポーネントでは、ボタンのク リック、マウスを重ねるなどの特定のイベントの発生時にサーバが非同期にコンポーネントを更新できます。 も参照してください。 例 298 標準のコンポーネントの参照 apex:actionSupport /*** Controller: ***/ public class exampleCon { Integer count = 0; public PageReference incrementCounter() { count++; return null; } public Integer getCount() { return count; } } 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン action ApexPages.Action サーバに対する AJAX 要求によって呼び出される action メソッド。このメソッドを参照するには、差 し込み項目の構文を使用します。たとえば、 action="{!incrementCounter}" ではコントローラの incrementCounter() メソッドを参照します。アクショ ンが指定されていない場合、ページは単に更新さ れます。 10.0 disabled Boolean ユーザがコンポーネントを無効にできる boolean 値。「true」に設定すると、イベントの実行時にア クションが呼び出されません。 16.0 disableDefault Boolean 関連付けられているイベントのデフォルトのブラ ウザ処理をスキップするかどうかを指定する boolean 値。true に設定すると、この処理はスキップされま す。指定されていない場合、この値はデフォルト の true に設定されます。 10.0 global global event String AJAX 要求を生成する DOM イベント。使用可能 な値には、「onblur」、「onchange」、「onclick」、 「ondblclick」、「onfocus」、「onkeydown」、 「onkeypress」、「onkeyup」、「onmousedown」、 「onmousemove」、「onmouseout」、 「onmouseover」、「onmouseup」、「onselect」な どがあります。 10.0 global focus String AJAX 要求の完了後にフォーカスされるコンポーネ ントの ID。 10.0 global id String ページの他のコンポーネントがコンポーネントを 参照できるようにする識別子。 10.0 global immediate Boolean ページの項目に関連付けられている入力規則を処 理することなく、このコンポーネントに関連付け 11.0 global 299 標準のコンポーネントの参照 属性名 属性型 apex:areaSeries 説明 必須項 API アクセ バー 目 ス ジョン られているアクションをすぐに実行するかどうか を指定する boolean 値。true に設定すると、アク ションがすぐに実行され、入力規則はスキップさ れます。指定されていない場合、この値はデフォ ルトの false に設定されます。 onbeforedomupdate String onbeforedomupdate イベントの発生時 (AJAX 要求が 処理されたとき、ただし、ブラウザの DOM が更 新される前) に呼び出される JavaScript。 11.0 global oncomplete String AJAX 更新要求の結果がクライアントで完了したと きに呼び出される JavaScript。 10.0 global onsubmit String AJAX 更新要求がサーバに送信される前に呼び出さ れる JavaScript。 10.0 global rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 10.0 global reRender Object AJAX 更新要求の結果がクライアントに返されると きに再作成される 1 つ以上のコンポーネントの ID。 この値には、単一の ID、ID のカンマ区切りのリス ト、または ID のリストまたはコレクションの差し 込み項目の式を使用できます。 10.0 global status String AJAX 更新要求の状況を表示する関連付けられてい るコンポーネントの ID。「actionStatus コンポーネ ント」を参照してください。 10.0 global timeout Integer AJAX 更新要求がタイムアウトするまでの時間 (ミ リ秒)。 10.0 global apex:areaSeries Visualforce グラフで網掛け領域として表示されるデータ系列です。fill 属性を true に設定した折れ線グラフの系列 に似ていますが、各 X 値に対する複数の Y 値がレベルとしてそれぞれの上に「積み上げ」られます。 少なくとも、各点が表す領域量を定義する線に沿って各点の X 値および Y 値として使用するデータコレクショ ンの項目、および目盛りとして使用する X 軸および Y 軸を指定する必要があります。グラフにレベルを追加す るには、複数の Y 値を追加します。各レベルには新しい色が使用されます。 注: このコンポーネントは コンポーネントで囲む必要があります。1 つのグラフに複数の コンポーネントを使用でき、、および コンポーネントを追加できますが、判読しにくい結果になる可能性があります。 300 標準のコンポーネントの参照 apex:areaSeries 3 つの Y 値をレベルとしてプロットする面グラフ 属性 属性名 属性型 axis String 必須項 API アクセ バー 目 ス ジョン 説明 このグラフの系列のバインド先の軸。グラフの 4 辺の境界の 1 つである必要があります。 • • • • はい 26.0 left right top bottom この軸のバインド先は同階層の コン ポーネントによって定義される必要があります。 colorSet String レベル領域の塗りつぶしの色として順に使用され る一連の色の値。色は、HTML スタイル (16 進) の 色をカンマ区切りで指定します。たとえば、 #00F,#0F0,#F00 です。 26.0 highlight Boolean マウスポインタを重ねたときに各レベルを強調表 示するかどうかを指定する boolean 値。指定されて いない場合、この値はデフォルトの true に設定さ れます。 23.0 highlightLineWidth Integer レベルが強調表示されるときにレベルを囲む線の 太さをピクセル単位で指定する整数。 26.0 highlightOpacity String レベルが強調表示されるときにレベル上に重ねる 色の不透明度を表す 0 ~ 1 までの小数値。 26.0 highlightStrokeColor String レベルが強調表示されるときにレベルを囲む線の HTML スタイルの色を指定する文字列。 26.0 id String ページの他のコンポーネントがグラフコンポーネ ントを参照できるようにする識別子。 26.0 opacity String この系列のレベルの塗りつぶされた領域の不透明 度を表す 0 ~ 1 までの小数値。 26.0 301 global 標準のコンポーネントの参照 apex:attribute 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン rendered Boolean グラフでグラフ系列を表示するかどうかを指定す る boolean 値。指定されていない場合、この値はデ フォルトの true に設定されます。 26.0 rendererFn String 各データポイントが表示される方法を追加または 上書きする JavaScript 関数の名前を指定する文字 列。追加のスタイルを指定またはデータを追加す るために実装します。 26.0 showInLegend Boolean このグラフ系列をグラフの凡例に追加するかどう かを指定する boolean 値。指定されていない場合、 この値はデフォルトの true に設定されます。 26.0 tips Boolean マウスポインタを重ねたときに各データポイント マーカーのツールチップを表示するかどうかを指 定する boolean 値。ツールチップの形式は xField: yField です。指定されていない場合、この値はデ フォルトの true に設定されます。 26.0 title String このグラフ系列のタイトル。グラフの凡例に表示 されます。 26.0 yField の複数のデータ系列を使用する積み上げグ ラフの場合、各系列のタイトルをカンマで区切り ます。例: title="MacDonald,Picard,Worle"。 xField String 系列のデータポイントごとの X 軸の値の取得元で はい ある、グラフデータに指定された各レコードの項 目。この項目はグラフデータのすべてのレコード に存在している必要があります。 26.0 yField String 系列のデータポイントごとの Y 軸の値の取得元で はい ある、グラフデータに指定された各レコードの項 目。この項目はグラフデータのすべてのレコード に存在している必要があります。 26.0 apex:attribute カスタムコンポーネントの属性の定義です。属性タグはコンポーネントタグの子としてのみ指定できます。 名前が id、rendered などである属性は定義できません。これらの属性はすべてのカスタムコンポーネント定義で 自動的に作成されます。 例 302 標準のコンポーネントの参照 apex:attribute

属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン access String 属性を同じ名前空間の任意のページ外で属性とし て使用できるかどうかを指定する。使用できる値 は、「public」(デフォルト) および「global」です。 属性を属性の名前空間外で使用できるように指定 する場合は、global を使用します。親の apex:component のアクセス属性が global に設定され ている場合は、このコンポーネントに対しても global に設定する必要があります。親の apex:component のアクセス属性が public に設定され ている場合は、このコンポーネントに対して global に設定することはできません。注: この指定がある 属性には、appexchange の管理パッケージの説明に ある非推奨ポリシーが適用されます。 14.0 assignTo Object 関連付けられているカスタムコンポーネントコン トローラでこの属性の値をクラス変数に割り当て る setter メソッド。この属性を使用する場合は、 getter メソッドおよび setter メソッドまたは get 値 および set 値を含むプロパティを定義する必要があ ります。 12.0 global default String 属性のデフォルト値。 13.0 global description String 属性のテキストによる説明。この説明はカスタム コンポーネントが保存されるとすぐにコンポーネ ントの参照に含められます。 12.0 global encode Boolean これは、一部のパッケージインストールに影響す る問題に対応する一時オプション。この属性は今 後のリリースで廃止されます。Salesforce による指 示がない限り使用しないでください。 15.0 id String カスタムコンポーネント定義で他のタグが属性を 参照できるようにする識別子。 12.0 303 global 標準のコンポーネントの参照 apex:axis 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン name String 関連付けられているカスタムコンポーネントが属 はい 性の値を含む場合に Visualforce マークアップで使 用されている属性の名前。コンポーネントの定義 では、この名前はその他すべての属性とは異なり 一意である必要があります。id、rendered、action という名前の属性は定義できません。これらの属 性は、すべてのカスタムコンポーネントの定義で 自動的に作成されるか、または使用できないかの いずれかです。 12.0 global required Boolean 関連付けられているカスタムコンポーネントが Visualforce ページに含まれる場合に属性の値を指定 する必要があるかどうかを指定する boolean 値。 true に設定すると、値が必須になります。指定され ていない場合、この値はデフォルトの false に設定 されます。 12.0 global type String 12.0 global 属性の Apex データ型。assignTo 属性を使用してこ の属性の値をコントローラクラス変数に割り当て る場合、データ型の値とクラス変数のデータ型が 一致している必要があります。type 属性は次のデー タ型のみを値として使用できます。 • • • • • はい string、integer、または boolean などのプリミティ ブデータ型 Account などの sObject、My_Custom_Object__c、 または汎用型の SObject String[]、Contact[] などの配列表記を使用して指 定する一次元リスト type="map" を使用して指定する対応付け。対応 付けの特定のデータ型を指定する必要はありま せん。 カスタム Apex データ型 (クラス) apex:axis グラフの軸を定義します。これを使用して軸の単位、目盛り、ラベル、およびその他の表示オプションを設定し ます。1 つのグラフの各境界に 1 つ、最大 4 つの軸を定義できます。 注: このコンポーネントは コンポーネントで囲む必要があります。 例 304 属性 標準のコンポーネントの参照 属性名 属性型 position String apex:barSeries 説明 必須項 API アクセ バー 目 ス ジョン 軸がバインドされているグラフの境界。有効なオ プションは、次のとおりです。 • • • • • • はい 23.0 left right top bottom gauge radial 最初の 4 つの位置は、標準線形グラフの各辺に対 応します。「gauge」は で使 用される軸に固有のもので、「radial」は で使用される軸に固有のも のです。 rendered Boolean 軸要素をグラフに表示するかどうかを指定する boolean 値。指定されていない場合、この値はデ フォルトの true に設定されます。 23.0 steps Integer 軸に配置する刻みマークの数を指定する integer 値。 設定すると、軸の刻みマークの自動計算が無効に なります。軸のタイプが Numeric の場合にのみ有 効です。 26.0 title String 軸のラベル。 23.0 type String 軸のタイプを指定する。これは、軸の間隔および スペースの計算に使用されます。有効なオプショ ンは、次のとおりです。 • • • • はい 23.0 「Category」は項目名、項目種別など数値以外 の情報に使用する。 「Numeric」は定量的な値に使用する。 「Gauge」は のみで使用 される必須のオプション。 「Radial」は のみで使用 される必須のオプション。 apex:barSeries Visualforce グラフで棒として表示するデータ系列です。少なくとも、各棒の X 値および Y 値として使用するデー タコレクションの項目、および目盛りとして使用する X 軸および Y 軸を指定する必要があります。グループ化 または積み上げ棒区分をグラフに追加するには、複数の Y 値を追加します。各区分には新しい色が使用されま す。 306 標準のコンポーネントの参照 apex:barSeries 注: このコンポーネントは コンポーネントで囲む必要があります。1 つのグラフに複数の コンポーネントおよび コンポーネントを含めることができます。 コンポーネントと コンポーネントを追加できますが、判読しにく い結果になる可能性があります。 例 属性 属性名 属性型 axis String 説明 必須項 API アクセ バー 目 ス ジョン このグラフの系列のバインド先の軸。グラフの 4 辺の境界の 1 つである必要があります。 • • • • はい 23.0 left right top bottom この軸のバインド先は同階層の コン ポーネントによって定義される必要があります。 colorSet String colorsProgressWithinSeries Boolean 棒の塗りつぶしの色として順に使用される一連の 色の値。色は、HTML スタイル (16 進) の色をカン マ区切りで指定します。たとえば、 #00F,#0F0,#F00 です。 colorSet 属性の色をどのような順序で使用してい くかを指定する boolean 値。 • true に設定すると、colorSet の最初の色が の最初の棒 ( が積み上げの場合は棒区 分) に使用され、2 番目の色は 2 番目の棒という ように順に使用されます。各 の先頭で、再び最初の色に 戻ります。 307 26.0 26.0 標準のコンポーネントの参照 属性名 属性型 apex:barSeries 説明 • 必須項 API アクセ バー 目 ス ジョン false に設定すると、colorSet の最初の色が最 初の のすべての棒に使用さ れ、2 番目の色は 2 番目の の棒というように順に使用されます。 groupGutter Integer 棒のグループの間隔を棒の幅のパーセントで指定 する整数。 26.0 gutter Integer 個々の棒の間隔を棒の幅のパーセントで指定する 整数。 26.0 highlight Boolean マウスポインタを重ねたときに各棒を強調表示す るかどうかを指定する boolean 値。指定されていな い場合、この値はデフォルトの true に設定されま す。 23.0 highlightColor String 棒が強調表示されるときに棒の上に重ねる HTML スタイルの色を指定する文字列。 26.0 highlightLineWidth Integer 棒が強調表示されるときに棒を囲む線の太さをピ クセル単位で指定する整数。 26.0 highlightOpacity String 棒が強調表示されるときに棒の上に重ねる色の不 透明度を表す 0 ~ 1 までの小数値。 26.0 highlightStroke String 棒が強調表示されるときに棒を囲む線の HTML ス タイルの色を指定する文字列。 26.0 ページの他のコンポーネントがグラフコンポーネ ントを参照できるようにする識別子。 23.0 id String orientation String グラフの棒の方向。有効なオプションは、次のと おりです。 • • はい 23.0 horizontal vertical 指定されていない場合、この値はデフォルトの 「vertical」に設定されます。 rendered Boolean グラフでグラフ系列を表示するかどうかを指定す る boolean 値。指定されていない場合、この値はデ フォルトの true に設定されます。 23.0 rendererFn String 各棒が表示される方法を追加または上書きする JavaScript 関数の名前を指定する文字列。追加のス タイルを指定またはデータを追加するために実装 します。 26.0 showInLegend Boolean このグラフ系列をグラフの凡例に追加するかどう かを指定する boolean 値。指定されていない場合、 この値はデフォルトの true に設定されます。 23.0 308 global 標準のコンポーネントの参照 apex:canvasApp 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン stacked Boolean 棒の値をグループ化するか積み上げるかを指定す る boolean 値。 26.0 tips Boolean マウスポインタを重ねたときに各棒のツールチッ プを表示するかどうかを指定する boolean 値。この ツールチップの形式は : です。指 定されていない場合、この値はデフォルトの true に設定されます。 23.0 title String このグラフ系列のタイトル。グラフの凡例に表示 されます。 23.0 yField の複数のデータ系列を使用する積み上げグ ラフの場合、各系列のタイトルをカンマで区切り ます。例: title="MacDonald,Picard,Worle"。 xField String 系列のデータポイントごとの X 軸の値の取得元で はい ある、グラフデータに指定された各レコードの項 目。この項目はグラフデータのすべてのレコード に存在している必要があります。 23.0 xPadding Integer 左軸および右軸とグラフの棒の間のパディングを ピクセル単位で指定する整数。 26.0 yField String 系列のデータポイントごとの Y 軸の値の取得元で はい ある、グラフデータに指定された各レコードの項 目。この項目はグラフデータのすべてのレコード に存在している必要があります。 23.0 yPadding Integer 上軸および下軸とグラフの棒の間のパディングを ピクセル単位で指定する整数。 26.0 apex:canvasApp 指定された developerName/namespacePrefix または applicationName/namespacePrefix 値のペアで識別 されるキャンバスアプリケーションを表示します。developerName と applicationName の両方が設定されて いる場合は、developerName 属性が優先されます。 要件: • 組織で Force.com Canvas が有効になっている必要があります。 コンポーネントを使用するときの考慮事項は、次のとおりです。 • 開発組織とは、キャンバスアプリケーションを開発し、パッケージ化する組織です。 • インストール組織とは、パッケージ化されたキャンバスアプリケーションのインストール先の組織です。 • Visualforce ページでの コンポーネントの使用状況は、キャンバスアプリケーションのア プリケーション名または開発者名が変更されても更新されません。 309 標準のコンポーネントの参照 • apex:canvasApp キャンバスアプリケーションは、 を使用してそれを参照する Visualforce ページが存在す る場合は削除できません。 次の例では、開発者名のみを使用してキャンバスアプリケーションを表示します。組織に名 前空間プレフィックスがない場合は、namespacePrefix 属性を使用しないでください。 Note: The canvas app is rendered within a div element, the div element id can be retrieved by {!$Component.genContainer}. 次の例では、アプリケーション名のみを使用してキャンバスアプリケーションを表示します。 次の例では、開発者名と、キャンバスアプリケーションが作成された組織の名前空間プレ フィックスを使用して、キャンバスアプリケーションを表示します。 次の例では、アプリケーション名と、キャンバスアプリケーションが作成された組織の名前 空間プレフィックスを使用して、キャンバスアプリケーションを表示します。 次の例では、特定の出力パネルでキャンバスアプリケーションを表示します。 310 標準のコンポーネントの参照 apex:canvasApp 属性 属性名 属性型 必須項 API アクセ バー 目 ス ジョン 説明 applicationName String キャンバスアプリケーションの名前。 applicationName または developerName が必要です。 29.0 border String キャンバスアプリケーションの境界線の幅 (ピクセ ル)。指定されていない場合、デフォルトの 0 ピク セルに設定されます。 29.0 canvasId String キャンバスアプリケーションウィンドウの一意の ID。この属性を使用して、イベントをキャンバス アプリケーションの対象にします。 29.0 containerId String キャンバスアプリケーションが表示される HTML 要素 ID。指定されていない場合、デフォルトの null に設定されます。この属性で指定されるコンテ ナを コンポーネントの後に配置 することはできません。 29.0 developerName String キャンバスアプリケーションの開発者名。この名 前は、キャンバスアプリケーションが作成された ときに定義され、キャンバスアプリケーションの プレビューアで表示されます。developerName また は applicationName が必要です。 29.0 height String キャンバスアプリケーションウィンドウの高さ (ピ クセル)。指定されていない場合、デフォルトの 900 ピクセルに設定されます。 29.0 id String ページの他のコンポーネントがコンポーネントを 参照できるようにする識別子。 14.0 maxHeight String キャンバスアプリケーションウィンドウの高さの 最大値 (ピクセル)。デフォルトは 2000 ピクセル で、「infinite」も有効な値です。 29.0 maxWidth String キャンバスアプリケーションウィンドウの幅の最 大値 (ピクセル)。デフォルトは 1000 ピクセルで、 「infinite」も有効な値です。 29.0 namespacePrefix String キャンバスアプリケーションが作成された Developer Edition 組織の名前空間の値。キャンバスアプリケー ションが Developer Edition 組織で作成されていな い場合は省略できます。指定されていない場合、 デフォルトの null に設定されます。 29.0 onCanvasAppError String キャンバスアプリケーションの表示に失敗した場 合にコールされる JavaScript 関数の名前。 29.0 onCanvasAppLoad String キャンバスアプリケーションの読み込み後にコー ルされる JavaScript 関数の名前。 29.0 311 global 標準のコンポーネントの参照 apex:chart 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン parameters String キャンバスアプリケーションに渡されるパラメー タのオブジェクト表現。JSON 形式または JavaScript オブジェクトリテラルとして指定する必要があり ます。JavaScript オブジェクトリテラルとしてのパ ラメータの例: {param1:'value1',param2:'value2'}。指 定されていない場合、デフォルトの null に設定さ れます。 29.0 rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 14.0 scrolling String キャンバスアプリケーションウィンドウでスクロー ルバーを使用するかどうかを指定します。有効な 値は auto|yes|no です。指定されていない場合、デ フォルトの no に設定されます。 29.0 width String キャンバスアプリケーションウィンドウの幅 (ピク セル)。指定されていない場合、デフォルトの 800 ピクセルに設定されます。 29.0 global apex:chart Visualforce グラフです。サイズおよびデータバインドを含むグラフの一般的な特性を定義します。 例 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン animate Boolean 最初に表示するときにグラフをアニメーションさ せるかどうかを指定する boolean 値。指定されてい ない場合、この値はデフォルトの true に設定され ます。 23.0 background String グラフの背景に使用する色を HTML スタイルの (16 進数) 色として指定する文字列。指定されてい ない場合は、白の背景が使用されます。 26.0 312 標準のコンポーネントの参照 apex:chart 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン colorSet String 各子系列で使用される一連の色。色は、HTML ス タイル (16 進) の色をカンマ区切りで指定します。 たとえば、#00F,#0F0,#F00 です。これらの色は、 Visualforce グラフで使用されるデフォルトの色を上 書きします。これらの色は同様に個々のデータ系 列に指定した colorSet で上書きできます。 26.0 data Object グラフのデータバインドを指定する。これには、 はい 式のコントローラメソッド参照、JavaScript 関数、 または JavaScript オブジェクトを指定できます。ど の場合でも、結果はレコードの配列である必要が あり、すべてのレコードに子データ系列コンポー ネントで参照されるすべての項目を含める必要が あります。 23.0 floating Boolean CSS の絶対位置設定を使用して、通常の HTML ド キュメントフロー外にグラフをフロート表示する かどうかを指定する boolean 値。 23.0 height String グラフの長方形の高さ。整数で指定した場合はピ はい クセル単位となり、パーセント記号が続く数値で 指定した場合は HTML 要素を含む高さのパーセン トとなります。ブラウザおよびデータセット全体 で一貫性のある動作を実現するには、ピクセルを 使用してください。極端に高いまたは低いグラフ を生成される可能性がある可変のデータセットを 操作する場合は、パーセントを使用します。多数 の棒を含む横棒グラフに最も効果的です。 23.0 注意: パーセントの高さは Firefox では正しく表示 されないことが判明しています。 hidden Boolean 初期状態でグラフを表示するか非表示にするかを 指定する boolean 値。ページが初めて表示されると きにグラフを非表示にする場合は、true に設定しま す。 23.0 id String ページの他のコンポーネントがグラフコンポーネ ントを参照できるようにする識別子。 23.0 legend Boolean デフォルトのグラフの凡例を表示するかどうかを 指定する boolean 値。グラフに詳細オプションの コンポーネントを追加します。指 定されていない場合、この値はデフォルトの true に設定されます。 23.0 name String 追加設定の指定または動的操作の実行に使用する 生成された JavaScript オブジェクトの名前。名前は すべてのグラフコンポーネントで一意である必要 23.0 313 global 標準のコンポーネントの参照 属性名 属性型 apex:chart 説明 必須項 API アクセ バー 目 ス ジョン があります。含む側の最上位コンポーネント ( または ) の名前 空間が指定されている場合、グラフ名にプレフィッ クスとして名前空間が付けられます。たとえば、 MyNamespace.MyChart となります。 rendered Boolean コンポーネントをページに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 23.0 renderTo String グラフを表示する DOM 要素の ID を指定する文字 列。 23.0 resizable Boolean 表示されたグラフのサイズを変更できるかどうか を指定する boolean 値。 23.0 theme String 使用するグラフのテーマの名前を指定する文字列。 テーマには、定義済みの一連の色が用意されてい ます。使用可能なテーマは、次のとおりです。 • • • • • • • • • • • • • 26.0 Salesforce 青 緑 赤 紫 黄 空 カテゴリ1 カテゴリ2 カテゴリ3 カテゴリ4 カテゴリ5 カテゴリ6 デフォルトの「Salesforce」では、Salesforce レポー トおよび分析のグラフと同じ色が指定されます。 colorSet を使用すれば、グラフコンポーネントに 独自の色を定義できます。 width String グラフの長方形の幅。整数で指定した場合はピク はい セル単位となり、パーセント記号が続く数値で指 定した場合は HTML 要素を含む幅のパーセントと なります。ブラウザおよびデータセット全体で一 貫性のある動作を実現するには、ピクセルを使用 してください。グラフでブラウザウィンドウの幅 を広げる場合は、パーセントを使用します。 314 23.0 標準のコンポーネントの参照 apex:chartLabel apex:chartLabel ラベルの表示方法を定義します。 は、ラップするコンポーネントに応じて、データ系列の ラベル、円グラフの区分のラベル、および軸のラベルの表示に影響を与えるオプションを提示します。 注: このコンポーネントはデータ系列コンポーネントまたは コンポーネントで囲む必要がありま す。 例 属性 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン color String HTML スタイルの (16 進) 色として指定されるラベ ルテキストの色。指定されていない場合、この値 はデフォルトの「#000」(黒) に設定されます。 display String ラベルの位置を指定するか、ラベルの表示を無効 化する。有効なオプションは、次のとおりです。 • • • • • • • • 23.0 23.0 rotate middle insideStart insideEnd outside over under none (ラベルは表示されない) 指定されていない場合、この値はデフォルトの 「middle」に設定されます。 field String 系列の各データポイントのラベルの取得元である、 グラフデータに指定された各レコードの項目。こ の項目はグラフデータのすべてのレコードに存在 している必要があります。指定されていない場合、 この値はデフォルトの「name」に設定されます。 315 23.0 標準のコンポーネントの参照 apex:chartTips 属性名 属性型 説明 必須項 API アクセ バー 目 ス ジョン font String CSS スタイルのフォント定義として、ラベルテキ ストに使用するフォント。指定されていない場合、 この値はデフォルトの「11px Helvetica, sans-serif」 に設定されます。 23.0 id String ページの他のコンポーネントがグラフコンポーネ ントを参照できるようにする識別子。 23.0 minMargin Integer 視覚化の原点に対するラベルからの最小距離をピ クセル単位で指定する。指定されていない場合、 この値はデフォルトの 50 に設定されます。 23.0 orientation String ラベルテキストの文字を表示する (通常または縦書 き)。有効なオプションは、次のとおりです。 • • global 23.0 horizontal vertical 指定されていない場合、通常の左から右のテキス トではこの値はデフォルトの、「horizontal」に設 定されます。 rendered Boolean グラフのラベルをグラフに表示するかどうかを指 定する boolean 値。指定されていない場合、この値 はデフォルトの true に設定されます。 23.0 rendererFn String 軸または系列のラベルとして表示されるラベルに 追加または上書きする JavaScript 関数の名前を指定 する文字列。 26.0 rotate Integer ラベルテキストを回転する角度。指定されていな い場合、この値はデフォルトの 0 に設定されます。 23.0 apex:chartTips データ系列の要素にマウスを重ねると表示されるツールチップを定義します。このコンポーネントでは、データ 系列のコンポーネントの tips 属性を true に設定すると表示されるデフォルトのツールチップより多くの設定オプ ションを提供します。 注: このコンポーネントはデータ系列コンポーネントで囲む必要があります。 例 属性 必須項 API アクセ バー 目 ス ジョン 属性名 属性型 説明 height Integer ツールチップの高さ (ピクセル単位)。 23.0 id String ページの他のコンポーネントがグラフコンポーネ ントを参照できるようにする識別子。 23.0 labelField String 系列のデータポイントごとのツールチップのラベ ルとして使用するグラフデータの各レコードの項 目。ツールチップは


Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : No
Warning                         : Invalid secondary xref table
Page Mode                       : UseOutlines
EXIF Metadata provided by EXIF.tools

Navigation menu