Salesforce Visualforce (基础6)输入数据

学习目标

完成本单元后,您将能够:

  • 解释Visualforce表单的基本要求。
  • 使用不包含平台视觉样式的Visualforce表单元素进行区分。
  • 列出四个或更多的标准输入表单标签。
  • 创建一个Visualforce窗体来编辑和保存一条记录。

Visualforce表单介绍

创建和编辑数据是任何应用程序的基本方面。 Visualforce提供了您需要的所有功能,可以轻松创建可创建新记录或检索记录,编辑其值并将更改保存回数据库的页面。
在这里,我们将标准控制器与<apex:form>组件和一些易于理解的表单元素结合起来,创建一个相当复杂的记录编辑页面。

创建一个基本表单

使用<apex:form>和<apex:inputField>创建一个页面来编辑数据。将<apex:commandButton>与标准控制器中内置的保存操作组合起来,以创建新记录或将更改保存到现有记录。

让某人编辑和更新记录的页面需要执行以下所有操作。

  • 查找记录以便从数据库中进行编辑和检索。
  • 把相关的记录数据以编辑的形式放在页面上。
  • 通过更改的数据接收表单提交。
  • 验证新的值。
  • 将有效的更改保存回数据库。
  • 向提交更改的人员提供适当的消息,无论新数据是成功保存还是存在错误。

当您使用标准控制器和<apex:form>组件时,Visualforce会自动为您执行大部分这些操作。

让我们从基础开始。

  1. 打开开发者控制台,然后点击 File | New | Visualforce Page 创建一个新的Visualforce页面。输入AccountEdit作为页面名称。
  2. 在编辑器中,用以下替换标记。
    <apex:page standardController="Account">
        
        <h1>Edit Account</h1>
        
        <apex:form>
        
            <apex:inputField value="{! Account.Name }"/>
            
            <apex:commandButton action="{! save }" value="Save" />
        
        </apex:form>
        
    </apex:page>
  3. 点击预览打开您的页面的预览,您可以在进行更改时查看。
    一个新的窗口应该打开,显示一个形式与一个单一的空领域的身体。
  4. 在预览窗口中,将客户的ID添加到URL,然后按ENTER。
    URL应该是这样的: https://SalesforceInstance/apex/AccountEdit?core.apexpages.request.devconsole=1&id=001D000000JRBes

    您现在应该在表单字段中看到该客户的名称。

    A basic form to edit account name

    这验证你已经有了标准的控制器工作和一个有效的记录ID。

它看起来可能不是很多,但是在六十多行标记中,您已经获得了用于更新客户名称的完整功能表单。给它一个旋转!

这些是这种形式要理解的基本方面。

  • 该页面使用<apex:page>组件中定义的客户的标准控制器。
  • <apex:form>是一个Visualforce组件,它将其中的所有内容打包成可以作为页面操作的一部分发送回服务器的东西。如果您需要将数据发送回Salesforce,大部分时间您都会在<apex:form>中执行此操作。
  • <apex:inputField>为与其关联的记录数据字段创建屏幕表单字段。您可以通过提供一个表达式来引用value属性中的相关字段。这里的表达是{! Account.Name},你应该没有困难猜测客户的名称字段。
  • 最后,<apex:commandButton>在页面的用户界面上添加一个按钮。这个按钮点击时触发一个动作。在这种情况下,该操作是标准控制器中的save()操作方法。与<apex:inputField>类似,通过引用提供给<apex:commandButton>操作属性的表达式中要调用的操作方法,可以将<apex:commandButton>与其操作连接起来。

添加字段标签和平台样式

在<apex:pageBlock>和<apex:pageBlockSection>标签中放置表单元素进行组织和分组,并使表单采用平台视觉风格。
让我们修改你的表格,使它看起来更熟悉。
  1. 在<apex:form>组件的内部,将两个表单元素包装在<apex:pageBlock>和<apex:pageBlockSection>标记中,以便您的标记看起来像这样。
    <apex:page standardController="Account">
        <apex:form>
        
        <apex:pageBlock title="Edit Account">
    
            <apex:pageBlockSection>
                <apex:inputField value="{! Account.Name }"/>        
            </apex:pageBlockSection>
    
            <apex:pageBlockButtons>
                <apex:commandButton action="{! save }" value="Save" />        
            </apex:pageBlockButtons>
    
        </apex:pageBlock>
        
        </apex:form>
    </apex:page>
    这个版本的表单的样式是完全不同的!与输出组件一样,当您在<apex:pageBlock>和<apex:pageBlockSection>标签中使用输入组件时,它们将采用平台视觉样式。
  2. 在客户名称字段下方,添加三个字段,以便您的标记看起来像这样。
    <apex:pageBlockSection columns="1">
        <apex:inputField value="{! Account.Name }"/>
        <apex:inputField value="{! Account.Phone }"/>        
        <apex:inputField value="{! Account.Industry }"/>        
        <apex:inputField value="{! Account.AnnualRevenue }"/>
    </apex:pageBlockSection>
    现在你有了一个更完整,更现实的形式来使用。
    Edit account form with platform styling

<apex:inputField>组件根据标准或自定义对象字段的类型呈现适当的输入小部件。例如,如果您使用<apex:inputField>标记显示日期字段,则日历小部件将显示在表单上。如果您使用<apex:inputField>标签来显示选取列表字段,就像我们在这里为行业字段所做的一样,则会显示一个下拉列表。

<apex:inputField>可用于捕获任何标准或自定义对象字段的用户输入,并且尊重在字段定义上设置的任何元数据,例如字段是必需的还是唯一的,或者当前用户是否有权查看或编辑它。

显示表单错误和消息

使用<apex:pageMes​​sages>显示任何表单处理错误或消息。
出现问题时,您的页面应提供有用的反馈,例如缺少必填字段或字段值未通过验证时。标准控制器实际上为您处理所有这些。所有你需要做的是告诉它在哪里把信息放在页面上。
  1. 在<apex:pageBlock>标记下,添加以下行。
    <apex:pageMessages/>
  2. 尝试删除客户的名称,并用空白名称保存记录。

    显示页面的验证错误。

    Edit account with page error messages

正如你所看到的,<apex:inputField>显示了它自己的字段的错误,但是对于更长的表单来说,将页面的所有错误列在页面顶部的一个地方是一个很好的方法。

标准的控制器已经收集了表格处理后的所有页面的消息。 <apex:pageMes​​sages>组件使您能够在合适的地方显示这些消息。

告诉我更多…

显然还有很多东西需要学习如何为您的Web应用程序构建有用的可用表单。
对于初学者,Visualforce提供了十几个输入组件,而不仅仅是<apex:inputField>。 <apex:inputField>与标准控制器配合使用,可直接编辑记录数据。对于使用自定义控制器代码的页面,或者表单输入不直接映射到记录上的字段时,您需要了解其他一些信息。大多数这些组件的名称都以“apex:input”开头,您可以在组件参考中找到它们。对于选择列表和单选按钮控件,请查找名称以“apex:select”开头的组件。

对于准备在移动设备上使用的用户界面,您需要查看专门用于HTML5页面的<apex:input>,并允许您使用各种功能来生成输入用户元素移动友好。

您在此处编写的代码使用标准控制器为页面提供的许多操作。我们把这些标准的行动称为,其中也有不少。有一个核心集合可用于标准控制器的所有对象,但许多内置的标准对象还有其他可供使用的操作。

说到行动,您可以添加操作来编辑和删除现有的相关联系人。你如何添加创建新的相关联系人的能力?这不像使用创建动作创建链接那样简单,就像编辑和删除一样。这是因为这些操作对现有记录起作用,这些记录与相关客户已经有关系。但是当你创建一个新的记录时,你需要自己创建这个关系。这将要求你写一些你自己的自定义控制器代码。

Salesforce Visualforce (基础5)显示记录

学习目标

完成本单元后,您将能够:

  • 解释粗粒度和细粒度组件之间的区别,以及为什么您可能需要使用其中一个或另一个。
  • 解释什么是迭代组件,以及它的用途。
  • 使用相关的粗粒度组件显示记录详细信息和相关列表。
  • 使用相关的细粒度组件来替换和定制粗粒度组件。

输出组件简介

Visualforce包含近150个内置组件,您可以在页面上使用它们。请求页面时,组件呈现为HTML,CSS和JavaScript。粗粒度的组件在一个单独的组件中提供了大量的功能,并且可能为它所使用的页面添加了大量的信息和用户界面。细粒度的组件提供了更加专注的功能,并使您能够设计页面,使其看起来和行为符合您的需要。
在这里,我们将重点讨论输出组件,也就是从记录中输出数据的组件,并使您能够设计一个仅供查看的用户界面。


用标准控制器创建一个Visualforce页面

将输出组件与标准控制器一起使用,以便于访问和显示记录详细信息。
您将在此页面中尝试多个不同的输出组件。现在,让我们创建一个大部分空白的页面。

  1. 打开开发者控制台,然后点击 File | New | Visualforce Page 创建一个新的Visualforce页面。输入页面名称的AccountDetail。
  2. 在编辑器中,用以下替换标记。
    <apex:page standardController="Account">
        
        {! Account.Name }
        
    </apex:page>
  3. 点击预览打开您的页面的预览,您可以在进行更改时查看。
    应打开一个新窗口,显示标准的Salesforce页面标题和侧边栏元素,但没有任何内容。
  4. 在预览窗口中,将帐户的ID添加到URL中,然后按回车键。
    该URL应该是这样的:https://SalesforceInstance/apex/AccountDetail?core.apexpages.request.devconsole=1&id=001D000000JRBes
    您现在应该在正文中看到该帐户的名称。这验证你已经有了标准的控制器工作和一个有效的记录ID。

显示记录详情

使用<apex:detail>快速将记录详细信息添加到使用标准控制器的页面。
一些输出组件给聚会带来了很多。这些“粗粒度”组件提供了许多功能,显示许多字段,标签和其他用户界面元素。它们使您可以快速构建内置Salesforce用户界面的变体页面。

  1. 将行替换为{! Account.Name},使用以下标记,并保存您的更改。
    <apex:detail />
    哇,这是一个很大的改变!使用一行标记,您可以复制帐户对象的整个标准视图页面!
    The <apex:detail/> component

<apex:detail>是一个粗粒度输出组件,它只在一行标记中向页面添加许多字段,部分,按钮和其他用户界面元素。还要注意,它添加到页面的所有内容都使用Salesforce Classic样式。定制<apex:detail>的外观有相当多的属性。现在花几分钟,尝试改变几个看看他们做什么。要创建与Lightning Experience的风格更加一致的页面,请参阅了解Visualforce&Lightning Experience模块中的重要视觉设计注意事项。

显示个别字段

使用<apex:outputField>显示记录中的各个字段。
当你需要更多的控制你的页面布局时,你可以单独添加字段。 <apex:outputField>组件是专门为此而设计的。

  1. 用下面的标记替换<apex:detail />行。
    <apex:outputField value="{! Account.Name }"/>
    <apex:outputField value="{! Account.Phone }"/>
    <apex:outputField value="{! Account.Industry }"/>
    <apex:outputField value="{! Account.AnnualRevenue }"/>
    
    这四个字段被添加到页面。但格式化可能不是你所期望的。字段值全部显示在一行中,没有标签,也没有其他格式。这不是我们想要的,与<apex:detail>和<apex:relatedList>组件形成了鲜明的对比,这些组件自动使用平台样式。
    本身,<apex:outputField>只输出字段的值。但是,当您将其封装在<apex:pageBlock>和<apex:pageBlockSection>组件中时,其行为会发生相当大的变化。

  2. 用<apex:pageBlock>和<apex:pageBlockSection>组件包装<apex:outputField>行,以便您的标记看起来像这样。
    <apex:pageBlock title="Account Details">
        <apex:pageBlockSection>
            <apex:outputField value="{! Account.Name }"/>
            <apex:outputField value="{! Account.Phone }"/>
            <apex:outputField value="{! Account.Industry }"/>
            <apex:outputField value="{! Account.AnnualRevenue }"/>
        </apex:pageBlockSection>
    </apex:pageBlock>
    这还差不多!
    Output fields inside a page block

    需要<apex:pageBlock>和<apex:pageBlockSection>组件来激活平台外观。当在<apex:pageBlockSection>中使用<apex:outputField>时,它将采用两列布局,很好地添加字段标签,对齐和样式字段和标签等等。

    尽管<apex:outputField>看起来像一个细粒度的组件,因为它只输出一个字段,但实际上却做了很多。它知道是否在某些其他组件中使用它,并适当地更改其输出和样式。格式和显示也很聪明。请注意,年收入字段被格式化为货币。 <apex:outputField>自动适应正在显示的字段的数据类型。尝试添加一个日期,清单,或选择列表字段到页面,看看会发生什么。

显示一个表

使用<apex:pageBlockTable>将数据表添加到页面。
什么是相关列表?当您将其添加到页面时,<apex:relatedList>会执行什么操作?
  • 它抓取了一个类似数据元素的列表。例如,该帐户的联系人列表。
  • 它为每个字段设置一个列,每个列上面都有标题,等等。
  • 对于列表中的每个项目(对于每个相关联系人),它将向表格添加一行,并使用该记录中的适当字段填充每列。

您可以使用迭代组件在自己的Visualforce标记中执行相同的操作。一个迭代组件与一组相似的项目一起工作,而不是一个单一的值。例如,{!Account.contacts}是一个表达式,用于计算一个帐户的联系人列表。您可以将此表达式与迭代组件一起使用来创建列表或表格,其中包含这些相关联系人的详细信息。

  1. 用下面的标记替换两个<apex:relatedList />行。
    <apex:pageBlock title="Contacts">
       <apex:pageBlockTable value="{!Account.contacts}" var="contact">
          <apex:column value="{!contact.Name}"/>
          <apex:column value="{!contact.Title}"/>
          <apex:column value="{!contact.Phone}"/>
       </apex:pageBlockTable>
    </apex:pageBlock>
    列出帐户联系人的表格会添加到页面中,只有您选择的列。
    Contacts list using pageBlockTable
<apex:pageBlockTable>是一个迭代组件,用于生成一个数据表,并附有平台样式。这是你的标记发生了什么。

  • <apex:pageBlockTable>的值属性被设置为前面提到的表达式{!Account.contacts}。这是<apex:pageBlockTable>将使用的记录列表。
  • 对于该列表中的每个记录,一次一条记录<apex:pageBlockTable>将该记录分配给<apex:pageBlockTable>的var属性中指定的变量。在这种情况下,该变量被命名为contact。
  • 对于每条记录,<apex:pageBlockTable>使用由<apex:pageBlockTable>主体内的<apex:column>组合集定义的行在表中构造一个新行。 <apex:column>组件依次使用表示当前记录的联系变量来提取该记录的字段值。
  • 在循环之外,<apex:pageBlockTable>使用<apex:column>组件中的字段通过查找每个字段的标签来创建列标题。

这是非常重要的,迭代组件是第一次很难理解。你现在可以做的最好的事情是尝试创建你自己的。使用<apex:pageBlockTable>将与机会相关的记录列表添加到页面。选择你想在表格中显示的字段。查找<apex:pageBlockTable>和<apex:column>的不同属性,并进行试验,直到您感觉舒适。

告诉我更多…

粗粒度的组件使您可以快速地为页面添加大量的功能,而精细的组件可以让您更好地控制页面的特定细节。
<apex:enhancedList>和<apex:listViews>是您可能要用于或代替<apex:relatedList>的其他粗粒度组件。还有许多其他组件将很多功能包装到一个标签中。如果你还没有做,请查看标准组件参考,看看可能的范围。

<apex:pageBlockTable>是一个迭代组件,用于获取Salesforce Classic样式。 <apex:dataTable>和<apex:dataList>是用于创建表格和列表的迭代组件,无需创建样式。 <apex:repeat>是一个迭代组件,您可以使用它来为记录集合生成任意标记。

您可能已经注意到,手动创建的相关列表缺少一些添加到由<apex:relatedList>创建的表中的内容。例如,用于编辑和删除单个记录的编辑和删除链接缺失,新联系人按钮也是如此。要创建这些用户界面元素,您需要了解更多的Visualforce,特别是关于表单和操作。你会在其他地方了解到。

Salesforce Visualforce (基础4)标准控制器

学习目标

完成本单元后,您将能够:

  • 解释什么是Visualforce标准控制器,并描述其关键属性。
  • 将标准控制器添加到Visualforce页面。
  • 显示来自页面标准控制器检索的记录的数据。
  • 写一个表达式,使用点符号来访问相关记录上的字段。

Visualforce标准控制器介绍

Visualforce使用传统的模型 – 视图 – 控制器(MVC)范例,并包含复杂的内置控制器来处理标准动作和数据访问,与Force.com数据库提供简单而紧密的集成。这些内置控制器通常被称为标准控制器,甚至标准控制器。
MVC设计模式可以很容易地将视图和样式从底层数据库和逻辑中分离出来。在MVC中,视图(Visualforce页面)与控制器交互,控制器为页面提供功能。例如,控制器可以包含单击按钮时要执行的逻辑。控制器通常还与模型(数据库)进行交互 – 制作视图可能要显示的可用数据,或将更改推送回数据库。

大多数标准和所有自定义对象都具有标准控制器,可用于与对象相关的数据进行交互,因此您无需自己编写控制器的代码。您可以扩展标准控制器以添加新功能,或从头创建自定义控制器。在这里,您将了解到标准控制器。

查找记录ID并将其添加到请求URL

通过将请求URL中的参数添加到标准控制器,为记录提供记录标识。
如果要使用标准控制器来引用特定记录,则需要知道要使用的记录的记录标识符或标识。它使用ID来检索数据,并在记录数据更改时将其保存回数据库。

当您的Visualforce页面与组织中的其他页面进行交互时,您可以自动传入记录的标识符,Visualforce页面可以使用它查找并显示该记录的数据。但是在开发过程中,页面是独立的,所以为了让页面显示数据库记录中的数据,需要手动提供记录ID。最简单的方法是将其作为GET参数添加到请求URL中。

  1. 打开开发者控制台,然后点击 File | New | Visualforce Page 创建一个新的Visualforce页面。输入页面名称的AccountSummary。
  2. 在编辑器中,用以下替换标记。
    <apex:page>
        
        <apex:pageBlock title="Account Summary">
            <apex:pageBlockSection>
            	
                
                
            </apex:pageBlockSection>
        </apex:pageBlock>
        
    </apex:page>
    这个标记创建一个框,为您准备添加一些有用的信息。
  3. 点击预览打开您的页面的预览,您可以在进行更改时查看。
    确保您可以看到预览窗口的URL字段。您将通过几个步骤回到此处。
  4. 在单独的浏览器窗口中,转至组织的主页,然后选择“帐户”选项卡。
    如果“客户”选项卡不可见,请从右上角的应用程序菜单中选择“销售”,切换到“销售”应用程序。
  5. 确保“查看”菜单显示“所有客户”,然后单击“查看”查看所有客户记录。
  6. 在“所有帐户”页面上,单击任何帐户名称。
  7. 帐户详细信息页面加载完成后,查看该页面的URL。

    该URL将如下所示:this:https://SalesforceInstance/one/one.app#/sObject/001D000000JRBes/.

    记录的标识符,它的ID是最后一系列的字母和数字。在这个例子中,它是“001D000000JRBes”(但是在你的组织中它将是不同的)。它在您组织中所有对象类型的所有记录中都是唯一的。

  8. 选择记录ID,并将其复制到剪贴板。

    在您离开帐户详细信息页面之前,请查看整个页面以及显示的信息。

    Account details page

    为了获得一个记录ID,这不是绕道而行的。在您完成之前,您将了解如何在Visualforce代码中构建一个自己显示相同信息的页面。

  9. 切换回您从Developer Console打开的预览页面。点击浏览器窗口的URL字段,在URL的末尾输入&id =,然后粘贴您之前复制的记录ID。
    该URL应该是这样的:https://SalesforceInstance/apex/AccountSummary?core.apexpages.request.devconsole=1&id=001D000000JRBes
  10. 按Return键加载新网址的页面。

尽管加载带有记录ID的预览页面看起来没有什么不同,但是添加ID意味着您现在可以通过加载该记录并使其在页面上显示来请求标准控制器帮助您。

要在Lightning Experience的上下文中预览页面,请打开浏览器的JavaScript控制台并输入以下代码。不要忘记用你的页面名称来替换pageName:

$A.get("e.force:navigateToURL").setParams(
    {"url": "/apex/pageName"}).fire();
您还可以通过以下方式预览带有记录ID的页面:将记录ID参数添加到JavaScript中URL的末尾:
$A.get("e.force:navigateToURL").setParams(
    {"url": "/apex/pageName?&id=00141000004jkU0AAI"}).fire();

显示单个记录中的数据

将帐户的标准控制器添加到页面,然后引用帐户字段以显示记录的数据。

按照以下步骤创建一个显示帐户摘要的页面。

  1. 在页面标记的开始处,在<apex:page>标记内添加以下属性。
    standardController="Account"
    当您现在保存页面时,预览页面将像以前一样重新加载,除了此时用于帐户的标准控制器处于活动状态。当页面加载时,标准控制器解析URL中的参数,找到id参数,并使用它的值来检索记录并使其可用于页面。你还看不到,但它在那里。
  2. 在页面的主体中,添加以下标记。
    Name: {! Account.name }
    繁荣。现在你可以看到记录正在被检索!您应该看到具有您添加到URL的记录ID的帐户的名称。
  3. 用以下标记替换单行与帐户名称。
    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>
    结果应该是一个简单的帐户摘要。
    A simple account summary page

那么,这里发生了什么?很多,标准控制器的礼貌!

  1. 当页面被加载,并且<apex:page>组件被激活时,它激活帐户对象的标准控制器。
  2. 标准控制器可以看到URL中有一个ID参数,并搜索并检索匹配的帐户记录。
  3. 标准控制器接受记录并将其放入可供页面使用的变量中。该变量与标准控制器的sObject:Account具有相同的名称。它是一个对象变量,并包含Account sObject上可用的所有字段。
  4. 四个Visualforce表达式都引用了Account变量。他们使用“点符号”访问Account变量中的各个字段。所以,{! Account.Name}获取帐户的名称,依此类推。

但是,收入是多少?它以科学记数法显示。你怎么能把货币显示为货币呢?

数字以科学记数法显示为“原始”值的原因是因为数字是由表达式直接输出的。它将原始值直接放在页面上。要控制值的格式,您需要使用一个组件,并给组件提供值来处理。组件将采取原始值并适当格式化,然后将结果输出到页面上。你会学到如何做到这一点。这里我们只是对访问记录数据感兴趣。

 

告诉我更多…

标准的控制器是相当强大的,我们只是抓了表面。你会在别处学到更多的东西,但是这里有一些亮点。
除了这里所示的简单数据访问之外,标准控制器还提供一组标准操作,例如创建,编辑,保存和删除,您可以使用标准用户界面元素(如按钮和链接)将其添加到您的页面。当您了解有关Visualforce输入表单并将更改保存回数据库时,您将了解有关这些标准操作的更多信息。

要嵌入到对象页面布局中的Visualforce页面,作为对象特定的自定义操作使用,或者在Salesforce应用程序中用作移动卡,必须使用相关对象的标准控制器。

如果您创建了自己的自定义对象(而不是像Account一样使用对象)并且想知道如何引用字段,则必须遵循一个稍微不同的过程。从设置中,在快速查找框中输入对象,然后选择对象,选择您的对象,然后选择该字段。 API名称现在指示您必须在Visualforce页面中使用的字段的名称。例如,如果您的字段名为Foo,则其API名称为Foo__c,并且您将使用该名称引用它 – 如:{! myobject__c.foo__c}。

像标准控制器一样强大,有时你需要做一些不同的事情。这在Visualforce中没有问题。在任何时候,您都可以使用Apex代码替换或扩充它们,并编写自己的控制器或扩展到内置控制器。

Salesforce Visualforce (基础3)使用变量

学习目标

完成本单元后,您将能够:

  • 解释什么是Visualforce表达式,并描述它的用途。
  • 列出可用于Visualforce表达式的三个或更多全局变量。
  • 将Visualforce表达式添加到Visualforce页面。
  • 在Visualforce表达式中使用一个函数。

全局变量和Visualforce表达式简介

Visualforce页面可以显示从数据库或Web服务中检索的数据,根据登录的用户和查看页面而变化的数据等等。这个动态数据是通过使用由页面控制器提供的全局变量,计算和属性在标记中访问的。这些一起被描述为Visualforce表达式。使用表达式将动态输出或值传递给组件,方法是将它们分配给属性。
Visualforce表达式是可以解析为单个值的任何一组字面值,变量,子表达式或运算符。表达式中不允许使用方法调用。

Visualforce中的表达式语法是: {! expression }

任何在{! }分隔符将在页面呈现或使用时动态替换。空白被忽略。

结果值可以是一个原始(整数,字符串等),一个布尔值,一个sObject,一个控制器方法(如一个动作方法)以及其他有用的结果。

全局变量

使用全局变量访问和显示Visualforce标记中的系统值和资源。
例如,Visualforce在名为$ User的全局变量中提供有关登录用户的信息。您可以使用以下形式的表达式来访问$ User全局变量(以及任何其他字段)的字段:{! $ GlobalName.fieldName}。

  1. 打开开发者控制台,然后点击 File | New | Visualforce Page 创建一个新的Visualforce页面。输入UserStatus作为页面名称。
  2. 在编辑器中,用以下替换标记。
    <apex:page>
        
        <apex:pageBlock title="User Status">
            <apex:pageBlockSection columns="1">
            	
                
                
            </apex:pageBlockSection>
        </apex:pageBlock>
        
    </apex:page>
    这个标记创建一个框,为您准备添加一些有用的信息。
  3. 点击 Preview 打开您的页面的预览,您可以在进行更改时查看。
  4. 在<apex:pageBlockSection>标签之间添加以下标记。
    {! $User.FirstName }
    您应该在您创建的用户状态面板中看到您的名字。
  5. 将另外两个使用$ 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,大括号内的任何内容都是动态的,并以表达式语言编写。它的值是在运行时计算和替换的,当有人查看页面时。

Visualforce表达式不区分大小写,并且{! …}被忽略。所以这些表达式都产生相同的值:

  • {! $User.FirstName}
  • {!$USER.FIRSTNAME}
  • {! $user.firstname }

公式表达式

Visualforce使您可以在表达式语言中使用更多的全局变量。它也支持让你操纵值的公式。
例如,&字符是连接字符串的公式语言运算符。
  1. 在您的UserStatus页面中,使用以下公式表达式替换名字和姓氏的单独表达式。
    {! $User.FirstName & ' ' & $User.LastName }
    这个表达式将登录的用户的名字和姓氏组合在一起,用空格分开。输出应该看起来一样。
  2. 将以下内容添加到用户信息下方的页面标记中。
    <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
  3. 将以下内容添加到日期表达式下面的页面标记中。
    <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>
    您的网页上的结果将是这样的。

    Visualforce expressions playground

    一些函数,如TODAY(),有一个空括号,但有些函数需要函数用来计算的参数。在这个例子中,YEAR()接受一个由TODAY()函数提供的日期参数,它不带任何参数。 MAX()函数可以使用任意数量的参数。

    CONTAINS()函数特别有趣。它返回一个布尔值:true或者false。它比较文本的两个参数,如果第一个参数包含第二个参数,则返回true。如果不是,则返回false。在这种情况下,字符串“force.com”包含在字符串“salesforce.com”中,所以它返回true。

条件表达式

使用条件表达式根据表达式的值显示不同的信息。
例如,如果发票没有订单项,则可能需要显示单词“none”而不是空白列表。或者,如果某个项目已过期,则可能需要显示“已结束”,而不是显示结束日期和时间。
您可以使用条件公式表达式(如IF())在Visualforce中执行此操作。 IF()表达式有三个参数:

  • 首先是一个布尔值:不管是真还是假。例如,您以前使用的CONTAINS()函数。
  • 第二个参数是第一个参数为true时返回的值。
  • 第三个参数是第一个参数为false时将返回的值。
  1. 在您的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()的布尔结果转换为更有用的显示给用户的文本。同样,第二个表达式在本月上半月显示一条消息,在本月下半月显示另一条消息。

  2. 删除所有的测试表达式,只留下使用$ User全局变量的行。
    换句话说,回到这个页面。

    <apex:page>
        
        <apex:pageBlock title="User Status">
            <apex:pageBlockSection columns="1">
                
                {! $User.FirstName & ' ' & $User.LastName } 
               ({! $User.Username })
                
            </apex:pageBlockSection>
        </apex:pageBlock>
        
    </apex:page>
    让我们使用条件表达式来做一些更有用的事情。
  3. 用以下代码替换$ User.Username表达式的行。
    ({! IF($User.isActive, $User.Username, 'inactive') })
    
    isActive是$ User全局变量上可用的另一个字段。这是一个布尔字段,如果用户处于活动状态,则为true;如果已停用,则为false。现在,“用户状态”面板将显示用户的用户名(如果它们处于活动状态),如果不是,则显示“不活动”(inactive)。

告诉我更多…

在Visualforce表达式中可以使用许多全局变量和函数。
Visualforce中可以使用近二十个全局变量。如您所见,它们对于获取有关当前登录用户的信息非常有用,但也可用于获取有关组织($ Organization),设置($ Setup),有关自定义对象的详细信息($ ObjectType)的详细信息,对象($ Action)等等。请参阅Visualforce全局变量参考。

同样,在Visualforce中可以使用几十个函数。该列表与公式字段中的可用功能类似,但不完全相同。在它们重叠的地方,函数的行为是相同的,所以在编写Visualforce表达式时,可以重复使用大部分关于公式字段的知识。请参阅Visualforce函数参考以获取完整列表。

表达式有许多用途,常常用于为Visualforce组件上的属性提供值。

Salesforce Visualforce (基础2)创建VF Page

学习目标

完成本单元后,您将能够:

  • 解释什么是Visualforce页面,并描述其关键属性。
  • 列出并打开组织中的现有Visualforce页面。
  • 使用开发者控制台创建和编辑Visualforce页面。
  • 在编辑器中识别,添加和自定义Visualforce标签和属性。

创建Visualforce页面简介

Visualforce页面是应用程序开发人员的基本构建块。 Visualforce页面与标准网页类似,但包含访问,显示和更新组织数据的强大功能。页面可以通过一个唯一的URL来引用和调用,就像它们在传统的Web服务器上一样。
Visualforce使用类似于HTML的基于标记的标记语言。每个Visualforce标记对应于一个粗糙或细粒度的用户界面组件,如页面的一部分,列表视图或单个字段。 Visualforce拥有近150个内置组件,并为开发人员创建自己的组件提供了一种方法。 Visualforce标记可以与HTML标记,CSS样式和JavaScript库自由混合,为您实现应用的用户界面提供了相当大的灵活性。

您可以在Salesforce中以多种不同方式查看,创建和编辑Visualforce页面。也可以使用Salesforce API创建和修改Visualforce页面,从而启用各种外部工具。

在开发者控制台中创建Visualforce页面

使用开发者控制台创建和编辑Visualforce页面,访问其他强大的Force.com开发工具。
开发人员控制台具有自动语法高亮显示,标记对匹配,自动建议和自动完成功能,智能缩进功能以及许多其他功能,旨在使其用于编辑标记和代码。这是在同一页面上工作一段时间时使用的最好的内置工具,或者是带有自定义控制器的Visualforce页面,更长,更复杂的代码等等。

按照以下步骤在开发者控制台中创建一个Visualforce页面。

  1. 打开您的名字下的开发者控制台或快速访问菜单(设置齿轮图标Setup gear icon)。
    开发者控制台在新窗口中打开。
  2. 单击 File | New | Visualforce Page.
  3. 输入HelloWorld作为新页面的名称,然后单击确定。
    开发者控制台中会打开一个新的空白Visualforce页面。
  4. 在编辑器中,为页面输入以下标记。
    <apex:page> 
        <h1>Hello World</h1> 
    </apex:page>
  5. 单击 File | Save.
  6. 要查看您的新页面,请单击 Preview.
    呈现的页面在新窗口中打开。请注意,此页面预览会显示没有Salesforce样式的页面。要在Lightning Experience环境中查看您的页面,请打开浏览器的JavaScript控制台并输入以下代码。不要忘记用你的页面名称来替换pageName:

    $A.get("e.force:navigateToURL").setParams(
        {"url": "/apex/pageName"}).fire();

    这个JavaScript触发了Lightning Experience的navigateToURL事件,相当于输入了经典的/ apex / PageName的URL – 你甚至可以在代码中看到这个URL模式。

  7. 在编辑器中,向页面添加一些额外的文本,并保存。
    The Force.com Developer Console
    预览窗口自动刷新以反映您在保存页面时的更改。我们将在以后省略保存说明,但是应该将步骤之间的页面保存起来。

单击 File | Open 以查看现有Visualforce页面的列表。双击一个页面将其打开。您还可以打开其他Salesforce实体,例如Apex类和触发器,Visualforce组件等。

使用自动建议添加属性

在Visualforce组件上设置属性以自定义其行为。使用自动建议快速将属性和值添加到Visualforce组件标签。
按照以下步骤在Visualforce标签上添加和修改属性。

  1. 在您的HelloWorld页面中,在关闭“>”之前,单击打开的<apex:page>标记内部。键入一个空格,然后“s”。
    自动建议提供了您键入的可能完成列表。当您键入其他字符时,建议列表将被简化为只匹配值。

    Auto-suggest for Visualforce attribute values
  2. 按向下箭头键,直到选择“侧边栏”。按回车键。
    侧边栏属性被添加到您的标记中的<apex:page>标记,自动建议为其提供了可能的值。
  3. 使用箭头键或键入“f”选择false,然后按回车键。
    你的代码应该像这样。

    <apex:page sidebar="false"> 
        <h1>Hello World</h1> 
    </apex:page>
  4. 保存您的更改。
  5. 重复上述步骤,将showHeader =“false”添加到<apex:page>标签,并保存更改。
    你的代码应该像这样。

    <apex:page sidebar="false" showHeader="false"> 
        <h1>Hello World</h1> 
    </apex:page>
    当你已经知道你想使用什么组件,以及每个属性是什么和做什么的时候,自动建议是非常棒的。特别是在你还在学习Visualforce的时候,你会经常引用标准组件参考,以了解什么组件存在,它们做什么以及如何使用和定制它们。

超越基础

请注意,sidebar和showHeader属性在Lightning Experience中没有任何效果,并且没有办法抑制Lightning Experience标题。虽然showHeader的默认值是true,但它对Lightning Experience没有任何影响。

该页面仍然包含一些Salesforce样式表,这些表格可以让您匹配Salesforce字体,大小等选项。要禁止所有Salesforce输出,请添加standardStylesheets =“false”以删除样式。

添加和撰写组件以形成页面结构

将组件添加到Visualforce页面,并安排它们构建页面的结构。
按照以下步骤将新的Visualforce标记添加到您的页面,并使用它们为页面创建一个结构。
  1. 在HelloWorld页面中,在文本“Hello World”下添加一个<apex:pageBlock>组件。
    <apex:pageBlock>是一个结构化的用户界面元素,用于对页面上的相关项进行分组。使用自动建议添加它,并将标题属性设置为“块标题”。
  2. 在<apex:pageBlock>组件中添加一个<apex:pageBlockSection>组件。将标题属性设置为“A部分标题”。
    <apex:pageBlockSection>是另一个将结构和层次结构添加到页面的组件。呈现时,用户可以折叠<apex:pageBlockSection>元素以隐藏除标题以外的所有内容。
  3. 在<apex:pageBlockSection>组件中添加一些文本,例如“我是三个深度的组件”。
    你的代码应该像这样。

    <apex:page> 
    
        <h1>Hello World</h1> 
        
        <apex:pageBlock title="A Block Title">
            <apex:pageBlockSection title="A Section Title">
                I'm three components deep!
            </apex:pageBlockSection>
        </apex:pageBlock>
    
    </apex:page>
    您有一个显示一些结构的页面,包含顶级标题,带有标题的可折叠部分以及一些纯文本。

    A simple page with nested components
  4. 在第一个之后添加另一个<apex:pageBlockSection>,并将标题设置为“A New Section”。将一些文本添加到组件正文中,就像您对第一个<apex:pageBlockSection>所做的那样。
    你的代码应该像这样。

    <apex:page> 
    
        <h1>Hello World</h1> 
        
        <apex:pageBlock title="A Block Title">
            <apex:pageBlockSection title="A Section Title">
                I'm three components deep!
            </apex:pageBlockSection>
            
            <apex:pageBlockSection title="A New Section">
                This is another section.
            </apex:pageBlockSection>
        </apex:pageBlock>
    
    </apex:page>
    注意<apex:pageBlockSection>标签是如何嵌套在<apex:pageBlock>标签中的。您不能将小孩<apex:pageBlockSection>标签放在父标签<apex:pageBlock>标签内。
您已经学习了将页面放在一起的所有基本知识,包括创建页面,添加属性和组件,以及将组件组织在一起,为页面提供结构和设计。


告诉我更多…

开发者控制台是您的Salesforce组织内Force.com开发功能最强大,功能最齐全的工具。
另外还有两种内置方法可以在Salesforce中创建和编辑Visualforce页面。
  • 开发模式“快速修复”和页脚是快速创建新页面或对现有页面进行简短编辑的快速方法。对于快速更改或者当你想创建一个简短的页面来测试一些空白页面上的一些新的代码,然后将它们合并到你的应用程序页面,这是非常好的。
  • 在“快速查找”框中输入Visualforce页面,然后选择“Visualforce页面”的“设置”编辑器是最基本的编辑器,但它提供了访问开发者控制台或开发模式页脚中不可用的页面设置的权限。

还有一些可用的外部工具,例如用于Eclipse的Force.com IDE插件和用于SublimeText的MavensMate,它们可以连接到您的Salesforce组织并用于Visualforce开发。

您添加到页面的<apex:pageBlock>和<apex:pageBlockSection>组件将呈现与Salesforce Classic界面元素相匹配的用户界面。还有其他组件也可以让您匹配平台视觉样式,包括<apex:pageBlockSectionItem>和<apex:pageBlockButtons>。你能猜到哪一个嵌套在<apex:pageBlockSection>内?

Visualforce包括近150个内置组件,可提供各种用户界面元素和行为。 Visualforce标准组件参考列出了这些组件,并记录了它们的属性,包括如何使用该组件的示例代码。

Salesforce Visualforce (基础1)介绍

学习目标

完成本单元后,您将能够:

  • 描述什么是Visualforce,以及它的用途。
  • 列出三个或更多可以使用Visualforce的地方。

Visualforce简介

Visualforce是一个Web开发框架,使开发人员能够为可以在Force.com平台上托管的移动和桌面应用程序构建复杂的自定义用户界面。您可以使用Visualforce构建与Lightning Experience风格对应的应用程序,以及您自己的完全自定义界面。
Visualforce使开发人员能够扩展Salesforce的内置功能,将其替换为新功能,并构建全新的应用程序。使用强大的内置标准控制器功能,或在Apex中编写自己的自定义业务逻辑。您可以为自己的组织构建功能,或者在AppExchange中创建出售应用程序。

任何已经构建Web应用程序的人都会熟悉Visualforce应用程序开发。开发人员通过组合组件,HTML和可选的样式元素来创建Visualforce页面。 Visualforce可以与任何标准的Web技术或JavaScript框架进行集成,以实现更多动画和丰富的用户界面。每个页面都可以通过一个唯一的URL访问。当有人访问页面时,服务器执行页面所需的任何数据处理,将页面呈现为HTML,并将结果返回给浏览器进行显示。

Visualforce request processing overview

示例Visualforce页面

以下是Visualforce工作页面的简短示例。
<apex:page standardController="Contact" >
    <apex:form >
        
        <apex:pageBlock title="Edit Contact">

            <apex:pageBlockSection columns="1">
                <apex:inputField value="{!Contact.FirstName}"/>
                <apex:inputField value="{!Contact.LastName}"/>
                <apex:inputField value="{!Contact.Email}"/>
                <apex:inputField value="{!Contact.Birthdate}"/>
            </apex:pageBlockSection>

            <apex:pageBlockButtons >
                <apex:commandButton action="{!save}" value="Save"/>
            </apex:pageBlockButtons>

        </apex:pageBlock>
        
    </apex:form>
</apex:page>
此页面显示联系人数据输入表单。
Edit contact form
在十几行的标记中,这个页面做了很多。

  • 它连接到Visualforce标准控制器,Visualforce框架的一部分,提供自动数据访问和修改,标准操作等等。
  • 当没有记录ID访问时,页面显示空白数据输入表单。当您单击保存时,从表单数据创建一个新的记录。
  • 当用记录ID访问时,页面将查找该联系人记录的数据,并以可编辑的形式显示。当您单击保存时,对联系人所做的更改将保存回数据库。
  • 每个输入字段都是如何呈现其价值的。
    • 电子邮件字段知道什么是有效的电子邮件地址,如果输入了无效的电子邮件,则显示错误。
    • 日期字段显示一个日期小部件,当你点击字段,使输入日期更容易。
  • 保存按钮调用保存操作方法,这是标准控制器提供的许多标准操作之一。

你可以在哪里使用Visualforce

Salesforce提供了一系列可以在组织中使用Visualforce的方法。您可以扩展Salesforce的内置功能,将其替换为新功能,并构建全新的应用程序。
以下是可以将Visualforce添加到组织的一些方法。

从应用启动器打开一个Visualforce页面

您的Visualforce应用程序和自定义选项卡均可从应用程序启动器获得,您可以通过单击标题中的应用程序启动器图标App Launcher icon来访问该应用程序。
App Launcher apps and tabs

点击一个自定义的应用程序(1)来激活它。应用程序中的项目会显示在导航栏中,包括您添加到应用程序的任何Visualforce选项卡。请注意,您需要将Visualforce页面添加到选项卡,以便在应用启动器中访问它们。所有项目(2)中均可找到不在应用程序中的Visualforce选项卡。

将一个Visualforce页面添加到导航栏

如上例所述,您可以将Visualforce选项卡添加到应用程序,并在应用程序的导航栏中显示为项目。

Navigation bar with Visualforce tab

在标准页面布局中显示Visualforce页面

通过在其上嵌入Visualforce页面来扩展页面布局,以在标准页面上显示完全自定义的内容。除了您需要查看记录的详细信息以查看页面布局之外,此处的行为与Salesforce Classic相同。

Visualforce on a Lightning Experience page layout

在Lightning App Builder中添加Visualforce页面作为组件

在Lightning App Builder中创建自定义应用程序页面时,可以使用Visualforce组件将Visualforce页面添加到页面。

Add a Visualforce page to a Lightning App Builder page

注意

您必须为“闪电体验”,“Salesforce应用”和“闪电社区”启用Visualforce页面才能使其在Lightning App Builder中可用。

启动Visualforce页面作为快速操作

Global action in Lighning Experience
虽然他们在Lightning Experience用户界面中的位置与Salesforce Classic大不相同,但添加快速操作的过程大致相同。将它们添加到对象页面布局上的相应发布者区域。

Adding quick actions to a page layout

通过覆盖标准按钮或链接来显示Visualforce页面

您可以使用Visualforce页面覆盖对象上可用的操作。当用户单击已被覆盖的按钮或链接时,将显示页面而不是标准页面。设置这个与Salesforce Classic非常相似。事实上,在定义一个动作覆盖的时候,你很难说出你正在使用Lightning Experience。

Override the Edit action on Contact object

使用自定义按钮或链接显示Visualforce页面

您可以通过按钮和链接的形式为对象创建新的动作,方法是在对象上定义它们。 Lightning Experience不支持JavaScript按钮和链接,但Visualforce(和URL)项目是。定义Visualforce按钮和链接的过程与Salesforce Classic中的相同,所以我们不打扰在此处显示。

Salesforce Lighting(面向销售16)AI-挖掘老客户新机会

学习目标

完成本单元后,您将能够:

  • 描述与现有客户保持关系的挑战。
  • 解释爱因斯坦客户洞察如何使您的销售团队在维护客户时更加智能。

照顾你的客户花园

你已经成功地说服了Ava和其他Honeydew的领导者,AI可以帮助提高生产力并增强销售。销售云爱因斯坦让你看起来像个天才。掌握了所有这些数据后,爱因斯坦引领评分帮助团队建立了管道,而爱因斯坦机遇洞察力帮助团队以创纪录的速度完成交易。时间来庆祝?当然。但不要让成功让你头痛。我们都知道,新政结束后,这不是结束,而只是一个开始。

把你的客户群想象成一个花园。花园开始需要很多工作。你投入大量的种子(引导),并花费大量的精力培育最强壮的幼苗,以便它们能够长成强健的植物(机会)。由于你的承诺和辛勤的劳动,这些植物变成了美味的食物(客户)。 (这只是一个比喻,请不要吃你的客户。)你用你的劳动水果和蔬菜庆祝第一次收获 – 字面意思。但是你不要把这个花园拆掉,下个赛季从头开始。当然不是。那将浪费你已经花费的时间和资源。另外,如果有适当的照顾,你们的许多工厂将在下个季节再次生产。但是要从你的花园得到最大的赏金,你必须去倾听它。 (好吧,比喻一下)重点是,如果你想让你的客户回来,你需要花时间和关注他们,甚至预测他们的需求。

你有什么新闻?

您拥有的客户越多,重复业务的机会就越大。蜜瓜一直在快速增长,这意味着更多的客户。而且有了这么多的新客户,而且没有额外的销售代表,这个团队很难让每个客户都感到特别。

太多的信息被稀释,重要的金块会在众多的谈话中迷失。爱因斯坦的活动捕捉绝对有助于保持电子邮件和事件记录在相关记录。但是,即使代理商设法跟上客户通过直接沟通的方式告诉他们,客户不告诉代理商的情况如何呢?

就在昨天,蜜露的关系经理汤姆·阿托(Tom Ato)正在下班的火车上读报纸。 (他把报纸从地上摘下来,避免看着对面的那个人,他穿着一件巨大的番茄酱瓶,番茄酱让汤姆感到不舒服)。在商业部门的背页上,他读到他的一个客户Food&Stuff正在谈判收购竞争对手Meals&Things。

今天早上,汤姆闯进你的办公室,对他如何在Food&Stuff打电话给他的联系人,试图达成一项新协议来整合他们的业务。他怎么能保持最新的他的所有客户?你向他保证你已经照顾好了。您和销售云爱因斯坦有一个更多的技巧,你的袖珍 – 客户见解。

介绍爱因斯坦的客户见解

爱因斯坦的客户见解通过让团队了解影响客户的关键业务发展,帮助您的销售团队保持与客户的关系。了解什么影响你的客户的公司给你的销售团队决定客户是否开放销售和如何进行的优势。公司正在扩张吗?改变行政领导?收购竞争对手?爱因斯坦客户洞察提供来自知名来源的新闻文章,让您的销售团队完整的图片。

所以,现在,Tom不需要梳理各种报纸的业务部分,而是每天早晨Tom所需要做的就是登录到Salesforce,并在他的主页上查看Einstein组件。在那里,他看到了他拥有的客户和客户拥有的客户的见解。他点击一个有关“食品和材料”已经在兼并和收购谈判中被提及的见解,并看到包括他在火车上阅读的一些新闻文章。汤姆给你寄一些花,然后拿起电话打电话。

Account Insights

爱因斯坦的“客户见解”还包括关于公司扩张的新闻价值发展。在主页上,团队可以将这些见解通过电子邮件发送给其他人或通过Chatter与其他用户和组分享 – 这样,每个人都可以保持最新状态。代表可以消除他们不想看到的见解,或留下关于个人见解的相关性的反馈。爱因斯坦客户洞察也在客户详细信息页面上,因此当您专注于特定客户时,信息保持方便。

而且,如果您使用爱因斯坦活动捕捉,则可以从与客户相关的最近电子邮件和事件中识别活动相关的见解(例如,当联系人提及竞争对手或正在离开其公司时)。

通过全面了解客户的业务环境,您的销售团队可以更好地选择如何接近每个客户。他们将很好地建立强大而持久的关系。

结论

所以,现在您已经看到了人工智能如何优化销售团队,特别是销售云爱因斯坦如何忙于工作,猜测是否能够摆脱销售流程,并用生产力和见解取而代之。放心吧,AI永远不会取代销售团队,但它会让他们在整个过程的每一步都变得更加聪明。

Salesforce Lighting(面向销售15)AI-关闭更多交易

学习目标

完成本单元后,您将能够:

  • 列出销售代表在尝试关闭机会时遇到的挑战。
  • 解释爱因斯坦机遇洞察如何帮助您的销售团队赢得更多交易。

应对最后的挑战

销售云爱因斯坦已经能够为Honeydew的销售过程做的一切印象深刻。人工智能似乎能够有效地记录和显示关键数据点,实现活动自动化,并将线索转化为机会。但是在你跟胡椒谈话之后,你知道真正的考验还在后面。

这项工作全部用于核桃,如果它不利于公司的底线。卖并不容易。 Pepper和其他管理人员都有很好的销售团队,但他们仍然在与其他公司遇到的同样的问题上挣扎。

  • 更多交易的决策时间更长。销售代表很容易忘记他们在不同的交易。
  • 失去交易延迟。当一个代表正在处理几个机会的时候,要知道什么时候再联系一个联系人可能很难。
  • 对于经理来说,处理销售团队的交易是一个挑战。有了这么多的噪音,他们可能很难知道去哪里帮助。

AI如何帮助完成交易

那天下午,你向艾娃介绍了人工智能在销售过程的交易结束阶段可以提供的所有好处。

  • 人工智能可以根据您公司现有的机会数据确定趋势。因此,销售代表可以根据最近的活动来查看哪些交易或多或少地关闭。
  • 通过智能系统,可以提醒销售代表在没有超过一定时间的活动时跟进。他们也可以在交易中的关键时刻得到通知。
  • 对于管理人员来说,人工智能可以提供对团队管线的可见性,而不需要询问个别销售代表,然后在太迟之前避免交易灾难。

您在Honeydew使用AI关闭更多交易的答案?是的 – 销售云爱因斯坦。具体来说,机会见解功能。

介绍爱因斯坦的机会见解

你解释一下,爱因斯坦机会洞察使用机器学习和情感分析来帮助销售代表接近更多的交易。用于记录客户数据和识别最佳线索的相同数据收集也可以移动销售线。洞察力是根据贵组织特定的模式和数据量身定制的。

Competitor mentioned insight

Einstein Opportunity Insights提供了精确的预测和后续的不同机会。洞察力是特定于您的组织和团队的,他们出现在主页,机会记录和列表视图中。

销售代表可以在主页上查看与其交易相关的所有信息。主页还具有与不同机会相关的操作,例如编辑机会的关闭日期或通过电子邮件发送未响应请求的联系人。代表可以消除见解或留下关于个人见解的相关性的反馈。

Insights on the home page

在机会记录上,代表可以看到与机会有关的所有见解。管理员还可以自定义列表视图来显示洞察。

三种见解

通过描述爱因斯坦机会观点中包含的三种不同的洞察力,您完成您的演讲。

  1. 交易预测 – 您的代表会根据最近的活动和现有的机会数据来查看预测。例如,交易是否可能结束,交易似乎不太可能及时结束。
  2. 后续提醒 – 如果联系人在一段时间内没有回复,代表会提醒跟进。如果在很长一段时间内没有任何关于重要机会的交流,他们也会得到提醒。
  3. 关键时刻 – 在与交易相关的关键时刻通知代表,例如联系人提及竞争对手或离开公司时。

艾娃的印象深刻。

她说:“看起来很好笑。 “我肯定这个执行团队会过得很好。”

Salesforce Lighting(面向销售14)AI-最佳潜在客户

学习目标

完成本单元后,您将能够:

  • 列出销售代表在尝试优先处理销售线索时面临的挑战。
  • 解释如何爱因斯坦潜在客户得分让你的销售团队更聪明的工作线索。
  • 解释销售代表将如何知道主要分数来自哪里。

如何处理所有这些线索

你已经向艾娃解释了销售云爱因斯坦如何实现销售团队的繁忙工作。现在,您必须展示AI如何帮助销售代表在培育潜在客户的重要工作上更加智能地工作。

你上楼去拜访你的同事胡椒黑,其中一个Honeydew的高级销售经理。你问Pepper,她和她的团队在试图把一堆新的潜在客户转化为潜在交易时面临着什么样的关键挑战。

Pepper告诉你,虽然她的销售团队有一个收集潜在客户的有效过程,但核心挑战是知道哪些潜在客户需要优先考虑。如果没有这些知识,她的团队会花费大量的时间处理那些不能平息的潜在客户。当你按下她的更多细节时,她解释了她面临的挑战。

  • 她的销售团队比他们有更多的线索。
  • 他们不知道哪个主要特征表明交易的机会更大。
  • 他们优先考虑的努力取得了不同的成功。
  • 他们不确定哪种优先方法最适合Honeydew的业务。

她的一些销售代表有足够的经验知道哪些线索最有可能购买。例如,他们专注于城市地区或某些食品企业的线索。但是这种方法还不够完善,许多代表经验不足以具备这种感受。

他们已经尝试了基于规则的优先级,但是他们使用的规则也主要基于受过教育的猜测和直觉。他们试图通过地理或潜在客户源来排序,但是这些方法让潜在的热点导致无人看管。他们提出的规则缺乏复杂性。

最后,Pepper提到,市场部门甚至试图在得分方面得分,但只有数字得分。销售代表并不清楚特定主管如何获得分数。不知道分数真的来自哪里,让代表很难相信分数。他们希望得到更多关于什么引起热点的信息,这些信息可能会帮助他们在第一次通话期间破冰。

当你听到Pepper对这些挑战的描述时,你可以告诉她她没有注意到你脸上的笑容越来越大。你在微笑,因为销售云爱因斯坦可以真正帮助她的团队更快地把他们的线索变成机会。

介绍爱因斯坦潜在客户得分

最后,辣椒吸了一口气。你把她加入你的项目中,把AI添加到Honeydew的秘密酱汁中。你告诉她,销售云爱因斯坦包括爱因斯坦潜在客户的得分。这个功能应用AI的强大功能来分析您的潜在客户转化历史,并找到您可能不知道的转换模式。而且,因为销售云爱因斯坦已经了解了您的潜在客户和机会数据的格式,所以您可以在开启后立即开始分析和查找模式。

胡椒的兴趣是激动人心的。她问道:“那么一旦爱因斯坦得分模式发现,爱因斯坦的得分究竟如何呢?

你解释一下,爱因斯坦潜在客户的得分是根据它与你公司特定的潜在客户转换模式的匹配程度来给每一个潜在客户得分。得分越高,领先的就越热。您所有的销售代表所要做的就是按照分数排序他们的销售线索,并从列表顶部开始。

Lead Insights hover在典型的潜在客户列表视图(1)中的潜在客户分数以及得分(2)背后的原因。锁(3)显示主角分数是只读的。

胡椒仍然有点怀疑。她想知道她的销售代表如何确信他们可以相信分数。你告诉她,爱因斯坦潜在客户的评分显示了每个潜在客户的哪个细节对其评分有最大的影响。因此,您的销售代表可以看到一直隐藏在数据中的模式。这些是真正的见解。

潜在客户分数和预测因素不仅在列表视图中可见,而且在细节页面上也是可见的。所以信息保持方便,无论是代表排序线索或准备打电话或发送电子邮件。

Lead detail

导致详细信息页面上的爱因斯坦组件。领导的每个见解都会显示潜在客户字段值是否对乐谱具有正面影响(1)或负面影响(2)。

随着您的团队不断转换更多线索,Predictive Lead Scoring会不断调整其分析,以发现出现的新模式。

胡椒开始想知道,如果你能衡量潜在客户业务的总体影响。 你能否容易地分辨高分的线索是否实际上以较高的比率转换? 你爱能够赋予她每一个愿望。 你告诉她,爱因斯坦潜在客户的评分包括一个仪表板,其中包含报告,根据潜在客户的来源显示你的转化率和潜在客户平均分数。 甚至可以显示转化率和丢失率的分布。 所以很容易看到主角分数如何与您的底线相关联。

胡椒印象深刻。 她开始认为爱因斯坦的得分能够真正激发她的球队的进程和底线。 现在她想知道销售云爱因斯坦可以贡献给她的工具箱。 爱因斯坦是否能够帮助她的团队改变主角之后呢?

Salesforce Lighting(面向销售13)AI-销售活动自动化

学习目标

完成本单元后,您将能够:

  • 解释为什么数据对人工智能如此重要。
  • 解释销售云爱因斯坦如何消除繁琐的工作,使销售代表更有效率。

AI消除忙碌

销售云爱因斯坦等人工智能解决方案如何使销售代表更有效率?这是你需要解决的谜题,以说服你的经理,艾娃,AI可以提高你的团队的销售生产力。不幸的是,回答这个问题就像吃过熟的肉丸一样困难。

你快速走下大厅到HoneyEdw的销售代表Chip Endip的桌子。你问Chip:“如果通过外包你工作的一部分可以提高生产力,那会是什么?

你可以想象他的答案可能是确定最好的线索,找出哪些交易最需要关注,或者确定订阅有没有被更新的危险。但是,Chip用两个简单的词语来回答:数据输入。

大家都知道:销售代表讨厌忙碌。创建客户关系管理记录,更新联系人信息以及记录活动都会缩短关键销售活动(如开发客户关系)的时间。

芯片并不孤单。报告显示,销售代表的实际销售时间不到他们实际销售时间的50%。 (记录在案)这意味着他们大部分时间都花在管理任务上,如记录活动和输入联系人。

最近对Honeydew销售代表的调查结果显示,在繁忙工作上浪费了多少时间。代表们报告说,他们平均花费近三分之一的时间记录销售活动。

How reps spend their time

幸运的是,您告诉芯片,销售云爱因斯坦包括自动记录销售活动和创建新的联系人的功能。

AI只和数据一样好

为了提高销售代表的生产力,销售云爱因斯坦审查他们的活动,并提供建议和见解,引导他们在正确的方向。但是,伟大的建议和见解的关键是伟大的数据。

数据对AI解决方案有多重要?人工智能专家Peter Norvig表示,与数据较少的优秀算法相比,具有更多数据的平庸算法会获得更好的结果。根据计算机世界,人工智能的增长主要是由于大数据集的可用性,这导致更好的人工智能。

在过去,人工智能解决方案需要数据厨师的整个测试厨房,他们在将食谱混合在一起之前,先挑选,清理和合并数据。然后,几个月或几年后,出炉的销售代表突然出现了可操作的见解。如今,电子邮件,日历,客户关系管理(CRM),电话等等都可以创造数万亿的数据点。实际上,全球数字数据的90%是去年创造的。这些信息包括所有销售代表活动的数据:他们与潜在客户的电话,联系人的电子邮件,客户中的CRM数据等等。销售云爱因斯坦利用所有的数据,并将其提供给一个灵活的算法。几乎立即,你得到的结果。通过销售Cloud Einstein,您可以使用Easy-Bake AI烤箱更换测试厨房。

(要详细了解数据质量的重要性以及如何评估和改进组织的数据质量,请查看数据质量模块。)

在Honeydew,您的销售代表每隔一个工作日都会不断创建和更新数据。您可以快速清点所有这些数据。

表1.销售活动的清单
销售活动 数据示例 资源
电子邮件 与潜在客户石榴交换电子邮件 Gmail
事件 与石榴首席技术官Chet R. Cheez共进午餐 Google Calendar
呼叫 跟切特通电话 Skype
Note 会见切特的注意事项 Salesforce
任务 提醒安排下次与切特在素食餐厅会面 Salesforce
潜在客户 记录切特 Salesforce

您的销售团队已经创建了销售云爱因斯坦等AI解决方案所需的全部数据。那么现在怎么办?

介绍爱因斯坦活动捕捉

你很高兴地告诉芯片销售云爱因斯坦,就像云中的一些精灵,已经实现了他的愿望。借助爱因斯坦活动捕捉功能,Sales Cloud Einstein终于让Chip和他的团队告别了伐木活动耗费时间的繁重工作。

销售代表只需将他们的电子邮件和日历连接到Salesforce即可。然后,他们的活动将自动添加到相关的Salesforce记录。此外,从Salesforce发送的电子邮件通过他们的常规电子邮件客户。

爱因斯坦活动捕捉让Chip和他的团队能够自动在Salesforce中的业务和个人客户,联系人,潜在客户,机会,报价和合同中显示来自这些客户的任何Google™或Microsoft®Office365®客户和活动。

你可以看到他的团队顶级代表之一Sally Cho是如何工作的。她与主要业务合作伙伴首席技术官Sarah Loehr的电子邮件和活动将自动添加到Sarah在Salesforce中的记录中。

Activity timeline芯片首先是关于该功能的月球。

芯片首先关注的是:安全性。 Honeydew代表与潜在客户进行交流的许多电子邮件都包含敏感信息。他不希望这些提供给每个人。

幸运的是,爱因斯坦活动捕捉可以让您的代表控制哪些活动被添加到Salesforce中,谁可以看到它们。销售代表可以随时从Salesforce或其收件箱更新这些控件。

芯片的第二个关注:报告。 Honeydew的销售活动可以存储在一个地方,这真是太好了。但是Chip和他的同事们没有时间去创造一套全新的销售活动报告。

幸运的是,销售云爱因斯坦也负责报告。爱因斯坦活动捕捉包括活动报告,提供您的团队的销售活动摘要,以便您可以轻松地跟踪您的销售团队正在工作的一切。你为他的一些代表,包括萨莉,展示了一份报告,他给人留下了深刻的印象。

Activity report

但是等等,还有更多。

介绍爱因斯坦自动化联系人

爱因斯坦活动捕捉不只是自动记录你的活动,并称之为一天。不,这只是莴苣的一角。爱因斯坦使用所有的电子邮件和事件数据来进一步提高生产力。你把手放在Chip上,冷静地问他是否准备好了。他的眼睛一亮,但你停下来让预期建立。当你认为芯片不能再忍受的时候,你就低声说:“爱因斯坦自动化联系人”。

爱因斯坦自动联系人使用电子邮件和事件活动来查找要添加到Salesforce的新联系人和机会联系人角色。根据管理员如何设置功能,爱因斯坦可以建议新的数据或自动添加它。无论哪种方式,销售代表仍然专注于销售。

建议新建数据时,只需点击几下,即可轻松将其添加到Salesforce。联系建议Contact suggestion

当新数据自动添加到Salesforce中时,会在Einstein添加新数据时通知代表。对于新的联系人,列表视图显示他们哪些联系人是由爱因斯坦添加的。爱因斯坦通知Einstein notification

您可以与Ava分享您在销售Cloud Einstein方面的知识。想象一下,如果销售代表不必记录活动或手动输入数据,就可节省时间!艾娃看到的好处,你的勤奋印象深刻,但她还没有信服。消除忙碌的工作非常棒,但是每个销售代表的主要工作是怎样的:与客户一起完成销售过程的一部分。她问道:“销售云爱因斯坦如何真正让销售代表在销售过程的每一步都更有效率?”她问道。

听起来又是一个挑战。你知道该做什么。

请继续阅读,看AI是否真的能够在销售过程的每个阶段改变生产力。