使用标准控制器
学习目标
完成本单元后,您将能够:
- 阐述 Visualforce 标准控制器的含义并描述其关键属性。
- 在 Visualforce 页面中添加标准控制器。
- 显示页面标准控制器检索到的记录数据。
- 编写一个表达式,使用点记法来访问相关记录上的字段。
Visualforce 标准控制器简介
Visualforce 使用传统的模型 - 视图 - 控制器(MVC)范例,包含复杂的内置控制器来处理标准动作和数据访问,并提供与 Lightning 平台数据库简单而紧密的集成。这些内置控制器通常称为标准控制器,甚至称为标准控制器。
MVC 设计模式可以轻松地将视图及其样式与底层数据库和逻辑分离。在 MVC 中,视图(Visualforce 页面)与控制器交互,控制器为页面提供功能。例如,控制器可以包含单击按钮时要执行的逻辑。控制器通常还与模型(数据库)进行交互 — 提供视图可能想要显示的可用数据,或将更改推送回数据库。
大多数标准和所有自定义对象都有标准控制器,可用于与对象关联的数据进行交互,因此您无需自己编写控制器代码。您可以扩展标准控制器以添加新功能,或从零开始创建自定义控制器。这里将为您介绍标准控制器。
找到一个记录 ID 并将其添加到请求 URL 中
通过将记录 ID 添加为请求 URL 中的参数,向标准控制器提供记录 ID。
如果要使用标准控制器引用特定的记录,需要知道要处理的记录标识符或记录 ID。使用 ID 检索数据,并在记录数据更改时将其保存回数据库。
当 Visualforce 页面与组织中的其他页面交互时,可以自动传入记录的标识符,Visualforce 页面可以使用标识符来查找和显示该记录的数据。但是在开发过程中,您的页面是独立的,因此为了让页面显示来自数据库中记录的数据,您需要手动提供记录 ID。最简单的方法是将其作为 GET 参数添加到请求 URL 中。
- 要创建新的 Visualforce 页面,请打开 Developer Console,然后单击 File(文件) | New(新建) | Visualforce Page(Visualforce 页面)。输入
AccountSummary
作为页面名称。
- 在编辑器中,将标记替换为以下内容。此标记会创建一个框,供您添加一些有用的信息。
<apex:page> <apex:pageBlock title="Account Summary"> <apex:pageBlockSection> </apex:pageBlockSection> </apex:pageBlock> </apex:page>
- 单击 Preview(预览)可打开页面预览,您可以在进行更改时查看该预览。确保您可以看到预览窗口的 URL 字段。只需几个步骤即可实现。
- 在一个单独的浏览器窗口中,转到组织的主页,然后选择“客户”选项卡。如果“客户”选项卡不可见,请从右上角的应用程序菜单中选择“销售”,即可切换到销售应用程序。
- 确保“查看”菜单显示“所有客户”。
- 在“所有客户”页面,单击任意客户名称。
- 客户详细信息页面加载完毕后,查看该页面的 URL。URL 看起来是这样的:
https://MyDomainName.lightning.force.com/lightning/r/Account/001D000000JRBes/view
。记录的标识符,即记录 ID,是一系列字母和数字的组合。该示例中,记录 ID 为001D000000JRBes
(与组织中的记录 ID 有所不同)。组织中所有对象类型的所有记录中,记录 ID 都是唯一的。
- 选择记录 ID,并将其复制到剪贴板。在您离开客户详细信息页之前,看看整个页面和上面显示的信息。[Alt text: Account details page] 这样做,不仅仅是为了获取记录 ID。至此,您将了解如何使用 Visualforce 代码构建显示相同信息的页面。
- 切换至您从开发者控制台打开的预览页面。单击浏览器窗口的 URL 字段,在 URL 的末尾输入
&id=
,然后粘贴您之前复制的记录 ID。URL 看起来应该是这样的:https://MyDomainName.lightning.force.com/apex/AccountSummary?core.apexpages.request.devconsole=1&id=001D000000JRBes
- 按回车键以在新的 URL 中加载页面。
虽然加载带有记录 ID 的预览页看起来没有任何不同,但是添加 ID 意味着您可以请求标准控制器通过加载记录、且确保记录在页面上可用的方式来帮助您解决问题。
要在 Lightning Experience 的上下文中预览页面,请返回至主浏览器窗口,您可以在其中查看客户详细信息页。从客户详细信息页中,打开浏览器的 JavaScript 控制台并输入以下代码。请不要忘记将 pageName
替换为您的页面名称:
$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName"}).fire();
您还可以通过将记录 ID 参数添加到 JavaScript 中 URL 末尾的方式来预览带有记录 ID 的页面:
$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName?id=00141000004jkU0AAI"}).fire();
显示单个记录的数据
将客户的标准控制器添加到页面,然后引用客户字段以显示记录数据。
按照上一章节中加载的页面 URL 执行以下步骤,创建一个显示客户摘要的页面。
- 在页面标记的开头,在
<apex:page>
标签内部添加以下属性。standardController="Account”
现在当您保存页面时,预览页面会像以前一样重新加载,但这次客户的标准控制器处于活动状态。当页面加载时,标准控制器解析 URL 中的参数,找到 id 参数,并使用 id 的值来检索记录使得记录在页面上可用。您还看不到记录,但记录就在那里。
- 在页面正文中,添加以下标记。
Name: {! Account.name }
现在您可以看到正在检索记录!您应该会看到添加到 URL 中的记录 ID 所属的客户名称。
- 将客户名称的单行替换为以下标记。您的完整代码显示如下。
Name: {! Account.Name } <br/> Phone: {! Account.Phone } <br/> Industry: {! Account.Industry } <br/> Revenue: {! Account.AnnualRevenue } <br/>
结果应该是一个简单的客户摘要。<apex:page standardController="Account"> <apex:pageBlock title="Account Summary"> <apex:pageBlockSection> Name: {! Account.Name } <br/> Phone: {! Account.Phone } <br/> Industry: {! Account.Industry } <br/> Revenue: {! Account.AnnualRevenue } <br/> </apex:pageBlockSection> </apex:pageBlock> </apex:page>
接下来会发生什么呢?这一系列行为,都多亏了标准控制器!
- 当页面被加载,
<apex:page>
组件激活时,也会激活客户对象的标准控制器。
- 标准控制器检测 URL 中有一个 ID 参数,然后搜索并检索匹配的客户记录。
- 标准控制器获取记录并将其放入可供页面使用的变量中。变量名与标准控制器的 sObject 同名,都称为 Account。它是一个对象变量,包含客户 sObject 上可用的所有字段。
- 四个 Visualforce 表达式都引用了客户变量。这些表达式使用点记法访问客户变量中的各个字段。
{!Account.Name }
获取了客户名称等数据。
但是,收入数字是怎么回事?它是用科学计数法显示的。怎么能让它显示为货币呢?
数字显示为科学记数法中的“原始”值的原因是数字由表达式直接输出。它将原始值直接放到页面上。要控制值的格式,您需要使用一个组件,并为该组件提供要处理的值。该组件将获取原始值并对其进行适当的格式化,然后负责将结果输出到页面。您会在别的章节了解如何做到这一点。这里我们只探讨访问记录数据。
显示相关记录的字段
使用点记法显示相关记录的数据。
例如,在查看客户对象详细信息时,您可能已经注意到客户对象有一个名为“客户所有者”的字段,它的类型是 Lookup(User)。换句话说,这个字段与用户记录有关系。通过单击“客户所有者”字段标签链接,您会发现其字段名称是“所有者”。
Owner 关系代表一个用户。并且,如果从 Setup(设置)转到 Object Manager(对象管理器)| User(用户) | Fields & Relationships(字段和关系),您会发现用户有一个 Name(名称)字段。让我们使用此信息来显示用户。
在页面正文的客户名称之前,添加以下行。
Account owner: {! Account.Owner.Name } <br/>
点记法 (Account.Owner.Name
) 表示要遍历记录之间的关系。Account.Owner
表示客户记录的所有者字段。末尾的附加 Name 表示 owner 字段不是字符串的简单字段,而是与另一条记录(即 Lookup(User))的关系,并且您希望获取由 Owner 字段值表示的记录(即用户记录),并在该记录上显示 Name 字段。
了解详细信息...
标准控制器功能非常强大,我们只是触及了皮毛。您将在其他地方了解关于标准触发器的更多信息,但这里聚焦了重点信息。
除了此处提及的轻松数据访问之外,标准控制器还提供了一组标准操作,例如创建、编辑、保存和删除,您可以使用标准用户界面元素(例如按钮和链接)将这些操作添加到您的页面中。当您了解 Visualforce 输入表单并将更改保存回数据库时,您将了解有关这些标准操作的更多信息。
想要嵌入到对象页面布局中的 Visualforce 页面,用作特定于对象的自定义操作,或用作 Salesforce 应用程序的移动卡必须使用相关对象的标准控制器。
如果您创建了自己的自定义对象(而不是使用客户等对象),并且想知道如何引用一个字段,则必须遵循略有不同的程序。从 Setup(设置)中,在 Quick Find(快速查找)方框中输入 Object Manager,然后选择 Object Manager(对象管理器)| <您的自定义对象> |Fields & Relationships(字段和关系)。找到您的字段并选择该字段。API 名称指明了必须在 Visualforce 页面中使用的字段的名称。例如,如果您的字段叫做 Foo,则其 API 名称为 Foo__c,您可以通过该名称引用 Foo,如:{! myobject__c.foo__c}
。
尽管标准控制器功能强大,但有时您还是需要做一些不同的事情,而 Visualforce 也都可以。任何时候,您都可以使用 Apex 代码替换或扩充控制器,编写自己的控制器,或扩展内置控制器。
资源
- Visualforce 开发人员指南:标准控制器
- Visualforce 开发人员指南:标准列表控制器
- Salesforce 开发人员博客:Twitter Bootstrap 和 Visualforce 的简短介绍