学习目标
- 解释什么是Visualforce表达式,并描述它的用途。
- 列出可用于Visualforce表达式的三个或更多全局变量。
- 将Visualforce表达式添加到Visualforce页面。
- 在Visualforce表达式中使用一个函数。
全局变量和Visualforce表达式简介
Visualforce表达式是可以解析为单个值的任何一组字面值,变量,子表达式或运算符。表达式中不允许使用方法调用。
Visualforce中的表达式语法是: {! expression }
任何在{! }分隔符将在页面呈现或使用时动态替换。空白被忽略。
结果值可以是一个原始(整数,字符串等),一个布尔值,一个sObject,一个控制器方法(如一个动作方法)以及其他有用的结果。
全局变量
例如,Visualforce在名为$ User的全局变量中提供有关登录用户的信息。您可以使用以下形式的表达式来访问$ User全局变量(以及任何其他字段)的字段:{! $ GlobalName.fieldName}。
- 打开开发者控制台,然后点击 创建一个新的Visualforce页面。输入UserStatus作为页面名称。
- 在编辑器中,用以下替换标记。
<apex:page> <apex:pageBlock title="User Status"> <apex:pageBlockSection columns="1"> </apex:pageBlockSection> </apex:pageBlock> </apex:page>
这个标记创建一个框,为您准备添加一些有用的信息。 - 点击 Preview 打开您的页面的预览,您可以在进行更改时查看。
- 在<apex:pageBlockSection>标签之间添加以下标记。
{! $User.FirstName }
您应该在您创建的用户状态面板中看到您的名字。 - 将另外两个使用$ User全局变量的表达式添加到User Status面板的标记中,以使页面如下所示。
<apex:page> <apex:pageBlock title="User Status"> <apex:pageBlockSection columns="1"> {! $User.FirstName } {! $User.LastName } ({! $User.Username }) </apex:pageBlockSection> </apex:pageBlock> </apex:page>
{! …}告诉Visualforce,大括号内的任何内容都是动态的,并以表达式语言编写。它的值是在运行时计算和替换的,当有人查看页面时。
- {! $User.FirstName}
- {!$USER.FIRSTNAME}
- {! $user.firstname }
公式表达式
例如,&字符是连接字符串的公式语言运算符。
- 在您的UserStatus页面中,使用以下公式表达式替换名字和姓氏的单独表达式。
{! $User.FirstName & ' ' & $User.LastName }
这个表达式将登录的用户的名字和姓氏组合在一起,用空格分开。输出应该看起来一样。 - 将以下内容添加到用户信息下方的页面标记中。
<p> Today's Date is {! TODAY() } </p> <p> Next week it will be {! TODAY() + 7 } </p>
这些是使用TODAY()函数的更复杂的公式。函数是内置的计算,您可以通过名称后面的括号来识别。
第一个表达式简单地计算当前日期,第二个表达式使用加法运算符在日期中添加七天。页面中的输出将如下所示。Today's Date is Thu Sep 18 00:00:00 GMT 2014 Next week it will be Thu Sep 25 00:00:00 GMT 2014
- 将以下内容添加到日期表达式下面的页面标记中。
<p>The year today is {! YEAR(TODAY()) }</p> <p>Tomorrow will be day number {! DAY(TODAY() + 1) }</p> <p>Let's find a maximum: {! MAX(1,2,3,4,5,6,5,4,3,2,1) } </p> <p>The square root of 49 is {! SQRT(49) }</p> <p>Is it true? {! CONTAINS('salesforce.com', 'force.com') }</p>
您的网页上的结果将是这样的。一些函数,如TODAY(),有一个空括号,但有些函数需要函数用来计算的参数。在这个例子中,YEAR()接受一个由TODAY()函数提供的日期参数,它不带任何参数。 MAX()函数可以使用任意数量的参数。
CONTAINS()函数特别有趣。它返回一个布尔值:true或者false。它比较文本的两个参数,如果第一个参数包含第二个参数,则返回true。如果不是,则返回false。在这种情况下,字符串“force.com”包含在字符串“salesforce.com”中,所以它返回true。
条件表达式
例如,如果发票没有订单项,则可能需要显示单词“none”而不是空白列表。或者,如果某个项目已过期,则可能需要显示“已结束”,而不是显示结束日期和时间。
- 首先是一个布尔值:不管是真还是假。例如,您以前使用的CONTAINS()函数。
- 第二个参数是第一个参数为true时返回的值。
- 第三个参数是第一个参数为false时将返回的值。
- 在您的UserStatus页面的其他表达式下面,添加以下代码。
<p>{! IF( CONTAINS('salesforce.com','force.com'), 'Yep', 'Nope') }</p> <p>{! IF( DAY(TODAY()) < 15, 'Before the 15th', 'The 15th or after') }</p>
在保存更改并查看结果之前,尝试预测它们将会是什么!
第一个表达式使用与以前相同的CONTAINS()函数计算。 IF()函数将CONTAINS()的布尔结果转换为更有用的显示给用户的文本。同样,第二个表达式在本月上半月显示一条消息,在本月下半月显示另一条消息。 - 删除所有的测试表达式,只留下使用$ User全局变量的行。
换句话说,回到这个页面。
<apex:page> <apex:pageBlock title="User Status"> <apex:pageBlockSection columns="1"> {! $User.FirstName & ' ' & $User.LastName } ({! $User.Username }) </apex:pageBlockSection> </apex:pageBlock> </apex:page>
让我们使用条件表达式来做一些更有用的事情。 - 用以下代码替换$ User.Username表达式的行。
({! IF($User.isActive, $User.Username, 'inactive') })
isActive是$ User全局变量上可用的另一个字段。这是一个布尔字段,如果用户处于活动状态,则为true;如果已停用,则为false。现在,“用户状态”面板将显示用户的用户名(如果它们处于活动状态),如果不是,则显示“不活动”(inactive)。
告诉我更多…
在Visualforce表达式中可以使用许多全局变量和函数。
Visualforce中可以使用近二十个全局变量。如您所见,它们对于获取有关当前登录用户的信息非常有用,但也可用于获取有关组织($ Organization),设置($ Setup),有关自定义对象的详细信息($ ObjectType)的详细信息,对象($ Action)等等。请参阅Visualforce全局变量参考。
同样,在Visualforce中可以使用几十个函数。该列表与公式字段中的可用功能类似,但不完全相同。在它们重叠的地方,函数的行为是相同的,所以在编写Visualforce表达式时,可以重复使用大部分关于公式字段的知识。请参阅Visualforce函数参考以获取完整列表。
表达式有许多用途,常常用于为Visualforce组件上的属性提供值。