Salesforce Classic迁移到Lightning(3)

现在,Lightning Experience已在您的环境中启用,现在是您的Lightning Experience用户使用自定义应用程序Dreamhouse Classic的时候了。

如果您刚开始使用Lightning Experience并想探索您的经典应用的外观,只需点击几下鼠标即可完成。不过,尽管这是一种在Lightning Experience中使您的经典应用可见的快捷方式,但它仍然有一些限制。稍后,我们将通过为Dreamhouse创建一个全新的Lightning应用程序来完成我们的Lightning Experience迁移。

切换到闪电体验
首先,切换到自己的闪电体验,所以你可以开始探索和建设。当您为自己和您的用户启用Lightning Experience时,所有用户仍然可以选择在配置文件菜单中来回切换Lightning Experience和Salesforce Classic体验:

  1. 在您的Lightning Now DE中,在菜单中点击您的名字,然后选择切换到闪电体验。

screenshot

在闪电体验中创建一个经典的应用程序
现在我们将使我们的经典应用程序在Lightning Experience中可见,并且还将添加一些其他导航栏项目。

这不会影响我们的Salesforce Classic用户的应用程序体验,只会让我们的Lightning Experience在App Launcher中显示当前的经典应用程序。

注意

在应用程序管理器中还有一个选项来“升级”您的自定义应用程序。我们不在项目中使用它,但是这可以让您创建一个新的Lightning应用程序作为您的经典应用程序的克隆。

  1. 点击并选择设置。
  2. 从设置中,在快速查找中输入应用程序管理器,然后选择应用程序管
  3. 点击Dreamhouse Classic App的下拉菜单图标,然后选择编辑。
  4. 选中“在Lightning Experience中显示”框(默认情况下可能已经选中)。
  5. 在选择选项卡框中,选择以下选项卡,然后单击添加图标将它们移动到选定的选项卡框:
    • 仪表板
    • 报告
    • 帐号
  6. 点击 Save.

只需点击几下,您就可以在Lightning Experience中看到您的经典应用程序。在下一步,我们使用这个应用程序来检查闪电体验的功能。

Salesforce Classic迁移到Lightning(2)

在为最终用户推出Lightning Experience并开始构建应用程序之前,让我们花点时间熟悉Lightning Experience界面并定义用户访问权限。在安装程序中提供的Lightning Experience Migration Assistant中,可以找到帮助您的工具。这些工具包括学习路径,功能比较图表,以及在Lightning Experience中预览自定义的方法。此外,还有一些工具可以帮助您启用关键的Lightning Experience功能,如Notes和News,以及如何启用Lightning Experience本身。

在这一步我们回顾我们的DE中的移民助理。但是,您可以在您的生产Salesforce组织中使用所有这些工具,以详细了解Lightning Experience中的功能和自定义内容。 “迁移助理”最重要的部分是预览工具和准备就绪检查:

  • 预览工具可让您在启用Lightning Experience之前查看您的应用程序。
  • 准备就绪检查为您提供准备就绪报告。此报告包含您使用的功能的详细列表以及您创建的自定义。另外,请解释他们如何在Lightning Experience中获得支持,以及是否需要进行额外的审查。
评估你的组织准备好闪电体验
让我们花点时间了解Lightning Experience,为用户定义Lightning Experience访问权限,为您的组织启用Lightning Experience。

在闪电体验中预览你的组织

使用预览工具预览您的组织在Lightning Experience中的样子将非常容易。

  1. 在标题中,单击“设置”。
  2. 在Lightning Experience迁移助理下,单击开始。
  3. 点击预览标签,然后点击预览。
  4. 在Lightning Experience中点击您的环境。使用此预览可查看您的Salesforce应用程序在Lightning Experience中的外观。
  5. 点击导航栏中的商机。
  6. 选择“所有机会”列表视图,然后单击伯灵顿纺织织造厂发电机来打开这个机会。
  7. 点击机会页面来探索Lightning Experience的外观和感觉。例如,使用路径将机会
  8. 阶段更改为价值主张。
  9. 单击退出并返回到迁移助理。

运行闪电体验就绪检查和审查您的准备情况报告

“闪电体验准备报告”可帮助管理员在开启“闪电体验”之前了解更多关于要考虑的事项。此外,根据组织目前使用的功能,“准备情况报告”包含有关下一步工作的建议。虽然闪电体验准备情况报告不能识别Lightning Experience中的所有不受支持的功能和定制,但它可以帮助您了解您的组织如何准备好转换。

要在您自己的生产环境或沙箱环境中运行“闪电体验就绪报告”:

  1. 从设置中,在Lightning Experience迁移助理中,单击检查准备情况选项卡,然后单击检查准备情况。
  2. 单击允许,销售云,然后检查准备就绪,然后关闭窗口。随时等待报告完成后,观看“迁移到闪电体验视频的技巧”视频。
  3. 当您收到准备情况报告电子邮件时,打开它并查看突出显示差异功能的方式。

注意

报告可能需要几分钟才会显示在您的收件箱中。如果您没有看到它,请尝试搜索您的电子邮件“准备就绪”。同时,请等待您的报告完成后,随时观看“迁移到闪电体验的提示”。

建立对闪电体验的访问
现在我们已经探索了Lightning Experience的外观和感觉,让我们继续,打开Lightning Experience,授予对特定用户的访问权限,并为我们的环境启用Lightning Experience。

我们将为用户提供Lightning Experience两个部分:

  • 设置用户权限
  • 启用闪电体验
设置用户权限
您可能想要为您的用户的子集首次实施Lightning Experience。因此,通过配置文件或权限集授予对Lightning Experience的访问权限是最佳做法。所有标准配置文件默认都启用Lightning Experience User权限,所以我们的用户已经被分配到一个自定义配置文件(Dreamhouse用户)。我们将为访问Lightning Experience创建一个新的权限集,并将其分配给我们的用户。

为闪电体验创建一个许可集

  1. 从“设置”中,在“快速查找”框中输入权限集,然后选择权限集。
  2. 单击新建并创建一个新的权限集,如下所示:
    • 标签:闪电体验用户
    • API名称:Lightning_Experience_User
    • 许可证: – 无 –
  3. 点击 Save

接下来,我们将向此权限集添加Lightning Experience User权限。

  1. 滚动到“系统”部分,然后单击“系统权限”。
  2. 点击修改。
  3. 检查Lightning Experience用户框。
  4. 点击保存。

为用户分配权限集

现在你已经创建了一个权限集,现在是审查谁可以访问闪电体验的好时机。

  1. 从安装程序中,在快速查找框中输入用户,然后选择用户(在管理用户下)。
  2. 点击Randy Realtor的用户记录。

您的最终用户Randy Realtor拥有指定的Dreamhouse用户自定义配置文件。看看配置文件,并检查是否启用了Lightning Experience。

  1. 从Randy的用户记录中,点击Dreamhouse User profile链接。
  2. 滚动到“管理权限”部分,注意不会选中“闪电体验”。

这意味着当你为你的组织开启闪电体验时,兰迪将无法使用闪电体验。当然,除非你改变自己的个人资料,或者把他加入到启用闪电体验许可的权限集中。

兰迪是我们最初推出的闪电体验的一部分,所以我们想让他访问它,而不修改他的自定义配置文件。当我们为他分配新的权限集时,它将覆盖他现有的配置文件,并允许他访问Lightning Edition。

  1. 从“设置”中,在“快速查找”框中输入用户,然后选择用户(在管理用户下)
  2. 点击兰迪房地产经纪人。
  3. 滚动到权限集分配,然后单击编辑分配。
  4. 将闪电体验用户权限设置为“已启用权限集”列。
  5. 点击保存。
启用闪电体验
现在您已经查看并授予了Lightning Experience的使用权限,现在是启用Lightning Experience和相关功能的时候了。

screenshot

  1. 从“设置”下的“Lightning Experience迁移助理”下,单击“开始”。
  2. 单击优化与功能选项卡,然后单击以下按钮启用功能:
    • 新闻
    • 笔记
  3. 向上滚动到顶部,点击打开它,然后点击禁用启用闪电体验(这一步可能已经完成了)。
  4. 单击完成启用闪电体验。

您的组织现在启用闪电体验!

Salesforce Classic迁移到Lightning(1)

这个以管理员为中心的Lightning Experience项目向您展示了如何将经典应用程序转换为闪电应用程序 – 所有这些都是点击无法编码的!您将学习如何:

  • 评估您的组织对于Lightning Experience的准备情况。
  • 启用闪电体验。
  • 在Lightning Experience中提供经典应用程序。
  • 为Lightning定制业务流程和报告功能。
  • 创建一个闪电控制台应用程序。
  • 根据应用和用户配置文件向用户显示不同的体验。

令人兴奋的东西对吗?让我们滚动。首先要做的是注册一个特殊的环境,我们将在整个项目中使用。它有你将使用的经典应用程序。

注册Lightning Now开发者版组织
对于此项目,您不能使用现有的开发人员版(DE)组织。您必须注册一个特殊的DE,因为它带有您将在此项目中使用的自定义项。

  1. 注册Lightning Now开发者版(DE)组织。
  2. 用有效的电子邮件地址填写表格。您的用户名也必须看起来像电子邮件地址,并且是唯一的,但不一定是有效的电子邮件帐户。例如,您的用户名可以是yourname@lightningnow.de,或者您可以输入公司名称。
  3. 填写完表单后,请点击“注册”。出现确认消息。
  4. 当您收到激活邮件时,打开它并点击验证帐户。
  5. 填写注册表单 – 设置您的密码并输入安全答案。
  6. 点击更改密码。您将登录到您的DE并重定向到设置页面。
  7. 现在将您的Lightning Now DE连接到Trailhead,以便您可以通过此项目中的挑战:
    1. 滚动到页面底部,然后单击验证步骤旁边的下拉列表,然后选择登录到Developer Edition。
    2. 输入您的Lightning Now DE用户名和密码,然后单击登录。
    3. 点击允许,然后是!保存。
    4. 点击Launch打开您的DE。

注意:要登录到您的Lightning Now DE并随时播放,请转到login.salesforce.com并输入刚刚设置的凭据。

接下来进入这个维基百科页面,右键单击图像,并将其保存到桌面。我们稍后将使用它作为一个新的闪电应用程序的图标。

Salesforce Lightning (Javascript按钮 – 3)

学习目标

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

  • 创建Lightning组件并根据用户输入填充字段,并向用户提供反馈消息。
  • 创建与第三方系统集成的Lightning组件和操作。
  • 开始将您的JavaScript自定义按钮功能迁移到适合Lightning的替代方案。

闪电行动:智能,快速和移动

我们已经介绍了在Lightning Experience和Salesforce Classic中都可以使用的几种解决方案,这些解决方案是JavaScript按钮的绝佳替代品。但是我们认识到,这些声明性和程序性解决方案并不涉及每个用例。好消息是有更多的东西可以解决。引入闪电行动:称为闪电组件的快速行动。
闪电行动是建立在你已经采用的现有闪电组件框架之上的。您可以轻松地将您现有的Lightning组件转换为操作,并在Salesforce应用程序和Lightning Experience中使用它们。

通过将两个接口之一添加到组件,您可以将Lightning组件作为操作进行调用:force:lightningQuickAction或force:lightningQuickActionWithoutHeader。第一个界面添加标准的标题与保存和取消按钮闪电动作覆盖,而另一个不。

另一个有用的Lightning动作接口是force:hasRecordId,它从记录页面调用时向组件提供记录上下文。如果您将Lightning操作设置为全局快速操作,则不需要记录上下文。但是,如果要访问记录的数据或元数据,则必须实施force:hasRecordId。

注意

如果您之前没有构建Lightning组件,请访问Lightning开发中心,执行Lightning组件快速启动项目,并完成Lightning组件基础知识模块。

让我们深入闪电行动。接下来,我们将讨论一些可以用Lightning操作来解决的JavaScript按钮功能。

  • 根据用户输入填充字段并在数据输入期间提供反馈消息
  • 集成第三方API

根据用户输入填充字段并向用户提供反馈消息

假设您使用JavaScript按钮来验证或操作数据,并在用户使用记录时为用户提供反馈或说明。下面是一个例子,说明在用户创建或更新记录之前,您可以轻松地验证或操作Lightning组件中的数据。
我们在我们的示例组织中构建了一个名为“案例研究”的自定义对象,我们用它来跟踪不同的研究项目。当我们添加新的测试用户时,我们会捕获他们的姓名和电子邮件地址由于电子邮件地址是我们的主要联系方式,因此我们要确保输入正确。我们也想为测试用户创建一个独特的昵称,以便他们保持匿名。

我们将创建一个闪电操作,显示名称和电子邮件地址字段,验证电子邮件地址,并使用名字和随机数自动创建昵称。

这是Lightning操作调用的组件的代码。

  • CreateUser.cmp – 打开操作时看到的Lightning组件。它包含UI实现,其中包括文本字段,按钮,动作标题等。
  • CreateUserController.js – 监听组件以及发生的所有UI事件(如初始加载,文本输入和按钮单击)的控制器。它的功能是将这些事件委托给辅助类CreateUserHelper.js。
  • CreateUserHelper.js – 处理所有业务逻辑的代码,例如验证密码和电子邮件字段,以及与保存数据的服务器端Apex控制器进行通信。
  • SaveTestUser.apxc – 处理创建测试用户的请求的简单的Apex控制器。

CreateUser.cmp

<aura:component implements="force:lightningQuickActionWithoutHeader,force:hasRecordId" controller="SaveTestUser" >
   <aura:attribute name="user" type="Test_User__c" default="{ 'sobjectType': 'Test_User__c' }"/>
   <aura:attribute name="hasErrors" type="Boolean" description="Indicate whether there were failures or not" />
   <aura:attribute name="caseStudy" type="String" />
   <aura:attribute name="recordId" type="String"/>

   <aura:handler name="init" value="{!this}" action="{!c.init}" />

   <div class="slds-page-header" role="banner">
      <p class="slds-text-heading--label">Case Study</p>
      <h1 class="slds-page-header__title slds-m-right--small slds-truncate slds-align-left" title="Case Study Title">{!v.caseStudy}</h1>
   </div>
   <br/>

   <aura:if isTrue="{!v.hasErrors}">
      <!-- Load error -->
      <div class="userCreateError">
         <ui:message title="Error" severity="error" closable="true">
            Please review the error messages.
         </ui:message>
      </div>
   </aura:if>

   <div class="slds-form--stacked">

      <div class="slds-form-element">
         <label class="slds-form-element__label" for="firstName">Enter first name: </label>
         <div class="slds-form-element__control">
            <ui:inputText class="slds-input" aura:id="firstName" value="{!v.user.first}" required="true" keydown="{!c.updateNickname}" updateOn="keydown"/>
         </div>
      </div>

      <div class="slds-form-element">
         <label class="slds-form-element__label" for="lastName">Enter last name: </label>
         <div class="slds-form-element__control">
            <ui:inputText class="slds-input" aura:id="lastName" value="{!v.user.last}" required="true" />
         </div>
      </div>

      <div class="slds-form-element">
         <label class="slds-form-element__label" for="nickname">Enter nickname: </label>
         <div class="slds-form-element__control">
            <ui:inputText class="slds-input" aura:id="nickname" value="{!v.user.nickname}" required="false"/>
         </div>
      </div>

      <div class="slds-form-element">
         <label class="slds-form-element__label" for="userEmail">Enter user's email:</label>
         <div class="slds-form-element__control">
            <ui:inputEmail class="slds-input" aura:id="userEmail" value="{!v.user.Email__c}" required="true"/>
         </div>
      </div>

      <div class="slds-form-element">
         <label class="slds-form-element__label" for="userPassword">Enter user's password:</label>
         <div class="slds-form-element__control">
            <ui:inputSecret class="slds-input" aura:id="userPassword" value="{!v.user.Password__c}" required="true"/>
         </div>
      </div>

      <div class="slds-form-element">
         <ui:button class="slds-button slds-button--neutral" press="{!c.cancel}" label="Cancel" />
         <ui:button class="slds-button slds-button--brand" press="{!c.saveUserForm}" label="Save User" />
      </div>
   </div>

</aura:component>
CreateUserController.js
({    
   init : function(component, event, helper) {
      var action = component.get("c.getCaseStudy");
      action.setParams({"recordId": component.get("v.recordId")});
    
      action.setCallback(this, function(response) {
         var state = response.getState();
         if(component.isValid() && state == "SUCCESS"){
             component.set("v.caseStudy", response.getReturnValue());
          } else {
             console.log('There was a problem and the state is: '+state);
          }
      });
      $A.enqueueAction(action);
   },
    
   updateNickname: function(component, event, helper) {
      // Update the nickname field when 'tab' is pressed
      if (event.getParams().keyCode == 9) {
         var nameInput = component.find("firstName");
         var nameValue = nameInput.get("v.value");
         var nickName = component.find("nickname");
         var today = new Date();
         nickName.set("v.value", nameValue + today.valueOf(today));   
      }
   },
 
   saveUserForm : function(component, event, helper) {
      var name = component.get("v.user.first");
      var last = component.get("v.user.last");
      var password = component.get("v.user.Password__c");
      var email = component.get("v.user.Email__c");
      var nickname = component.get("v.user.nickname");
        
      var passwordCmp = component.find("userPassword");
      var emailCmp = component.find("userEmail");
        
      helper.validatePassword(component, event, helper);
      helper.validateEmail(component, event, helper);

      if (passwordCmp.get("v.errors") == null && emailCmp.get("v.errors") == null) {
         component.set("v.hasErrors", false);
         helper.save(component,name + " " + last,password,email,nickname);         
      } else {
         component.set("v.hasErrors", true);
      }
   },
    
   cancel : function(component, event, helper) {
      $A.get("e.force:closeQuickAction").fire();
   }
})
CreateUserHelper.js
({
   save: function(component, name, password, email, nickname) {
      //Save the user and close the panel
      var action = component.get("c.saveUser");
         action.setParams({
            "name": name,
            "password": password,
            "email": email,
            "nickname": nickname,
            "caseStudy": component.get("v.recordId")
         });

      action.setCallback(this, function(a) {
         var response = a.getReturnValue();
         var state = action.getState();
         if(component.isValid() && state == "SUCCESS"){
            $A.get("e.force:closeQuickAction").fire();
            var toastEvent = $A.get("e.force:showToast");
            toastEvent.setParams({
                  "title": "Success!",
               "message": "The test user has been created."
            });
            toastEvent.fire();
            $A.get('e.force:refreshView').fire();
         } else if (state == "ERROR") {
            console.log('There was a problem and the state is: '+ action.getState());
         }
      });
      $A.enqueueAction(action);
      },

   validatePassword : function(component, event, helper) {
      var inputCmp = component.find("userPassword");
      var value = inputCmp.get("v.value");

      if (value == undefined) {
         inputCmp.set("v.errors", [{message: "You must enter a password."}]);
      } else if (value.length < 7 || value.length > 15) {
         inputCmp.set("v.errors", [{message: "The password is the wrong length: " + value}]);
      } else if (value.search(/[0-9]+/) == -1) {
         inputCmp.set("v.errors", [{message: "The password must contain at least one number: " + value}]);
      } else if (value.search(/[a-zA-Z]+/) == -1) {
         inputCmp.set("v.errors", [{message: "The password must contain at least one letter: " + value}]);
      } else {
         inputCmp.set("v.errors", null);
      }
      },

   validateEmail : function(component, event, helper) {
      var inputCmp = component.find("userEmail");
      var value = inputCmp.get("v.value");

      if (value == undefined) {
         inputCmp.set("v.errors", [{message: "You must enter an email."}]);
         return;
      }

      var apos = value.indexOf("@");
      var dotpos = value.lastIndexOf(".");

      if (apos<1||dotpos-apos<2){
         inputCmp.set("v.errors", [{message: "Email is not in the correct format: " + value}]);
      } else if (value.substring(apos+1, dotpos) != "gmail") {
         inputCmp.set("v.errors", [{message: "Email must be a gmail account: " + value.substring(apos+1, dotpos)}]);
      } else {
         inputCmp.set("v.errors", null);
      }
      }

})
SaveTestUser.apxc
public class SaveTestUser {
    
    @AuraEnabled 
    public static Test_User__c saveUser(String name, String password, String email, String caseStudy, String nickname) {  
    
        Test_User__c testUser = new Test_User__c(Name=name, Password__c=password, Email__c=email, Nickname__c=nickname, Case_Study__c=caseStudy);

        upsert testUser;
        return testUser;
    }
    
    @AuraEnabled
    public static String getCaseStudy(String recordId) {
        Case_Study__c caseStudyInstance = [SELECT Name FROM Case_Study__c WHERE id=:recordId];
        return caseStudyInstance.Name;
    }

}

在创建Lightning组件之后,我们将其分配给一个动作。在案例研究的对象管理设置中,我们转到“按钮,链接和操作”,单击“新建操作”,然后使用这些参数配置操作。

字段 值Value
Object Name Case Study
Action Type Lightning Component
Lightning Component c:CreateUser
Height 500px
Label Create Test User
Name CreateUser

然后,我们将新的Lightning操作添加到案例研究页面布局。当用户从案例研究记录页面调用它时,他们会看到我们创建的Lightning操作。

Create Test User Lightning action overlay

关于这个闪电行动的好处是,它也可以在Salesforce应用程序中运行。

Case Study action in the Salesforce app

集成第三方API

也许你使用JavaScript按钮来与第三方系统集成。你可以使用闪电行动吗?你当然可以。主要区别在于,使用Lightning操作进行集成时,必须使用服务器端控制器。作为回报,您可以更好地处理安全证书,并能够使用Apex进行异步和批处理API调用。
我们来看看如何与Twilio集成来发送短信。在这个例子中,我们在奢侈旅行业务,我们处理名人和贵宾。我们希望我们的客户服务代理能够与客户沟通,但我们不希望将客户的个人联系信息暴露给任何人。我们在Contact对象上创建一个Lightning动作,这样代理可以在不看到联系人的电话号码的情况下发送消息。

就像在我们的案例研究中,我们将创建Lightning组件和helper类,然后创建一个快速的操作来调用组件。

SMS Lightning action overlay

这个Lightning动作由Lightning组件,JavaScript控制器和Apex控制器组成,它们引用处理Twilio集成的库类。

SendTwilioSMS.cmp

<aura:component controller="TwilioSendSMSController" implements="flexipage:availableForAllPageTypes,force:hasRecordId,force:lightningQuickAction" >
   <aura:attribute name="textMessage" type="String" />
   <aura:attribute name="destinationNumber" type="String" />
   <aura:attribute name="messageError" type="Boolean" />
   <aura:attribute name="recordId" type="String" />

      <aura:handler name="init" value="{!this}" action="{!c.init}" />

   <aura:if isTrue="{!v.messageError}">
      <!-- Load error -->
      <div class="userCreateError">
         <ui:message title="Error" severity="error" closable="true">
            Unable to send message. Please review your data and try again.
         </ui:message>
      </div>
   </aura:if>

   <div class="slds-form--stacked">
      <label class="slds-form-element__label" for="instructMsg">Please enter the message (max 160 char) below: </label>
      <br/>
      <div class="slds-form-element__control">
         <ui:inputText class="slds-input" aura:id="message" label="Text Message" value="{!v.textMessage}" required="true" maxlength="160" size="165" />
      </div>
      <div class="centered">
         <ui:button class="slds-button slds-button--brand" press="{!c.sendMessage}" label="Send Message"/>
      </div>
   </div>
</aura:component>

SendTwilioSmsController.js

({
   init : function(component, event, helper) {
      var action = component.get("c.getPhoneNumber");
      action.setParams({"contactId": component.get("v.recordId")});
      action.setCallback(this, function(response) {
         var state = response.getState();
         if(component.isValid() && state == "SUCCESS"){
            component.set("v.destinationNumber", response.getReturnValue());
         } else {
            component.set("v.messageError", true);
         }
      });
      $A.enqueueAction(action);
   },

      sendMessage : function(component, event, helper) {
      var smsMessage = component.get("v.textMessage");
      var number = component.get("v.destinationNumber");
      var recordId = component.get("v.recordId")

      var action = component.get("c.sendMessages");
      action.setParams({"mobNumber": number, "message": smsMessage, "contactId": component.get("v.recordId")});
      action.setCallback(this, function(response) {
         var state = response.getState();
         if(component.isValid() && state == "SUCCESS"){
            $A.get("e.force:closeQuickAction").fire();
            var toastEvent = $A.get("e.force:showToast");
            toastEvent.setParams({
               "title": "Success!",
               "message": "SMS has been sent woo hoo!"
            });
            toastEvent.fire();
         } else {
            component.set("v.messageError", true);
         }
      });
      $A.enqueueAction(action);
   }
})

SendTwilioSmsController.apxc

/*
* Apex controller that currently contains only one method to send sms message
*/
global class TwilioSendSMSController {

   /*
   * This method uses the Twilio for Salesforce library class and method to
   * send the message using the Twilio api.
   */
   @AuraEnabled
      webService static String sendMessages(String mobNumber, String message, Id contactId) {
         System.debug('the mobNumber is: '+ mobNumber + ' and the message is: '+ message + ' and contactId is: ' + contactId);

         if (mobNumber == null) {
            mobNumber = getPhoneNumber(contactId);
         }

         try {
            TwilioRestClient client = TwilioAPI.getDefaultClient();

            Map<String,String> params = new Map<String,String> {
               'To' => mobNumber,
               'From' => '15555551234',
               'Body' => message
               };
            TwilioSMS sms = client.getAccount().getSMSMessages().create(params);
            return sms.getStatus();
         } catch(exception ex) {
            System.debug('oh no, it failed: '+ex);
            return 'failed';
         }
      }

      @AuraEnabled
      public static String getPhoneNumber(Id contactId) {
         Contact currentRecord = [SELECT Phone FROM Contact WHERE Id = :contactId];
         return currentRecord.Phone.replace(' ', '').replace('-', '').replace(')', '').replace('(', '');
   }
}

创建组件后,我们创建一个Lightning动作。这次我们将其添加到联系页面布局,以便代理可以访问它。

再一次,很酷的是,这个动作也可以在Salesforce应用程序中使用。如果汽车服务提供商试图在机场与客户联系,则驾驶员可以使用移动设备轻松地接触到客户。

SMS Lightning action in the Salesforce app

闪电行动是闪电体验计划行动的未来。我们希望您开始将这套解决方案作为JavaScript按钮的更好替代方案。

如果您依赖于使用JavaScript按钮的合作伙伴应用程序,则很高兴知道我们的许多合作伙伴已经开始将其应用程序迁移并升级到Lightning。您可以在AppExchange上找到更新的Lightning Experience更多应用程序。

超越基础

如果您想自己尝试使用Twilio,则可以在Salesforce Github库中的第三方集成示例中找到用于Salesforce库类的Twilio的非托管包:https://github.com/twilio/twilio-销售队伍

在使用Twilio for Salesforce和Twilio API之前,请创建一个Twilio帐户,设置一个电话号码,并将您的帐户连接到Salesforce。有关更详细的说明,请参阅Github库中的TwilioApi.cls。

Salesforce Lightning (Javascript按钮 – 2)

学习目标

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

  • 创建快速操作(而不是使用JavaScript)来验证字段,创建具有预填充值的记录,并重定向到Visualforce页面。
  • 描述如何使用自定义URL按钮来实现与JavaScript按钮相同的导航和重定向功能。
  • 使用Visualforce自定义按钮而不是JavaScript按钮来处理列表中的多个记录。

你有按钮?我们有替代品

以前,我们解释了为什么要迁移到Lightning Experience,那里有很棒的新功能可以让你移动到JavaScript按钮。接下来,我们将解释如何使用Salesforce Classic和Lightning Experience中的解决方案轻松迁移自定义JavaScript按钮功能。
此表将JavaScript按钮的使用情况映射到替代方案 – 在大多数情况下,这些方案是Lightning中更好的解决方案。
JavaScript按钮顶级用例 闪电的选择 声明/编程
验证字段(预存) 快速操作(使用默认值和/或公式) D
Apex 触发 P
用预填充值创建记录 快速操作(使用默认值和/或公式) D
重定向到一个记录页面 自定义网址按钮 D
重定向到Visualforce页面 Visualforce快速操作 P
Lightning 行动 P
根据输入预先填充值 Lightning 行动 P
确认弹出式屏幕 Lightning 行动 P
API调用(Salesforce和第三方) Lightning 行动 P
反馈弹出屏幕 Lightning 行动 P
第三方集成 Lightning 行动 P
列表视图记录上的批量操作 列表视图上的自定义Visualforce按钮 P

如您所见,Salesforce提供了几个用于转换JavaScript自定义按钮功能的声明性工具。

快速操作

快速操作支持JavaScript按钮的许多常见用途。快速操作可以基于特定的对象,也可以是全局的,也就是说,它们更加通用,可以从任何记录或Chatter提要访问。 Salesforce中的任何操作都可以快速执行。这里有些例子。

验证字段值

有时,当用户创建或更新记录时,您需要确保填写特定的字段或填入特定的条件。

假设您想创建一个关闭任务的操作,而不需要用户去完整的编辑页面。但是你也想确保任务有一个截止日期,然后才能关闭。

您可以通过为Task对象创建一个快速操作来满足所有这些要求。

  1. 从安装程序中的对象管理器,单击任务,然后单击按钮,链接和操作。
  2. 点击 New Action.
  3. 对于操作类型,请选择 Update a Record.
  4. 对于标签,输入关闭任务。
  5. 点击 Save.

现在我们选择我们想要在关闭任务快速操作中出现的字段。您可以通过其字段属性轻松地创建所需字段或只读字段。

Action field properties

在动作布局上设置字段后,可以为任务记录上的任何字段添加预定义的字段值。在这个例子中,我们根据需要标记了到期日期字段。我们还为“状态”字段添加了一个预定义的值,将其更改为“已完成”。

Set predefined field value for Status

现在我们已经完成配置操作,我们将其添加到任务页面布局。然后用户可以从Lightning Experience和Salesforce应用程序的任务记录页面访问它。以下是“任务”页面上的“关闭任务”操作示例。

Close Task action on the Tasks page

点击关闭任务会弹出用户可以快速执行并保存的操作。

Close Task action overlay

这是Salesforce应用程序中的外观。

Close Task action in the Salesforce app

用值预填充字段

更高级的用例是当你想让用户创建一个记录,但是你也希望一个或者多个字段能够根据依赖字段中的值自动填充。

例如,假设内部销售团队的典型季度配额是去年客户收入的四分之一,增长了10%。因为这个简单的公式并不总是适用的,所以你想要预先填充机会数量的值,但也让用户修改它。创建一个操作,以便用户可以快速有效地修改该字段,而无需转到完整的机会记录页面。

要创建此示例操作,请按照与之前相同的步骤创建机会快速操作。

  1. 从安装程序中的对象管理器中,单击帐户,然后单击按钮,链接和操作。
  2. 点击新建操作。
  3. 对于“操作类型”,选择“创建记录”。
  4. 对于目标对象,选择机会。
  5. 选择适当的记录类型。
  6. 对于标签,请输入New Oppty。
  7. 点击保存。

选择操作布局的字段后,可以为“金额”字段添加预定义的值。在我们的例子中,我们使用了这个公式:

Account.Last_Year_Revenue_Generated__c  * 1.10  / 4
将此操作添加到帐户页面布局。当用户调用它时,他们会看到一个预填充在他们可以接受或覆盖的字段中的值。

New Opportunity action overlay

关于这个动作的一个很酷的事情是,你可以从机会的客户户中提取数据来创建机会。 Salesforce还支持记录遍历,所以如果您拥有分层客户,则可以像这样从父客户中提取收入:

Account.Parent.Last_Year_Revenue_Generated__c

不要担心回忆公式的格式;快速操作是声明式的,并使用Salesforce公式构建器。

根据输入值重定向到Visualforce页面

您可以创建Visualforce页面来增强您的业务流程。用户可以通过各种方式导航到这些Visualforce页面,例如使用自定义按钮,操作覆盖和选项卡。

Visualforce页面的一个好处是,通过使用标准控制器,您可以创建自定义记录页面并添加预验证,预填充字段,公式等等。

Salesforce Classic中通常使用JavaScript按钮来读取记录中的值并将其传递到URL,然后将用户重定向到Visualforce页面。您还可以通过快速操作让您的用户访问Visualforce页面。创建Visualforce快速操作非常简单,而且与我们已经介绍的过程类似。唯一的区别是您选择自定义Visualforce作为操作类型。

Create a Visualforce action

对于特定于对象的Visualforce快速操作,必须在Visualforce页面中包含该对象的standardController才能访问记录数据,并使Visualforce页面显示在快速操作选项列表中。

自定义网址按钮和链接

也许您使用JavaScript按钮进行导航,用命令window.open(URL)和一些变量将用户重定向到另一个页面。在大多数情况下,您可以使用Lightning Experience中的自定义URL按钮或链接。
以下是不同URL按钮和链接的列表,以及Lightning Experience中的重定向行为。
自定义网址按钮或链接 闪电体验行为
External URL

www.google.com
网址在新标签页中打开
相对Salesforce URL,查看

/{!Account.Id}
Record home page opens in existing tab
相对Salesforce URL,查看

/{!Account.Id}/e
Edit overlay pops up on the existing page
相对Salesforce URL,查看

/001/o
Object home page opens in existing tab
$Action URL, View

{!URLFOR($Action.Account.View, Account.Id)}
Record home page opens in existing tab
$Action URL, Edit

{!URLFOR($Action.Account.Edit, Account.Id)}
Edit overlay pops up on the existing page

Apex 触发器

您可能熟悉Apex触发器;他们已经在我们的平台上得到了多年的支持。可以将Apex触发器配置为在用户单击记录上的保存之前或之后执行。
当您需要预先验证,计算和字段填充时,请考虑使用Apex触发器。它们对第三方集成特别有用,因为这些规则是通过Salesforce API,Lightning Experience和Salesforce应用程序实施的。

有关Apex触发器的更多信息,可以查看“Apex开发人员指南”或获取Apex触发器徽章。

自定义Visualforce按钮

Lightning Experience中的另一个重要功能是支持在列表视图中使用Visualforce按钮。使用此功能,您可以使用Lightning中的现有Visualforce操作,并使用列表中的多个记录。就是这样。
  1. 创建您的Visualforce页面。

    以下是用于编辑多个机会的舞台和关闭日期的示例代码:

    <apex:page standardController="Opportunity" recordSetVar="opportunities" extensions="tenPageSizeExt">
       <apex:form>
          <apex:pageBlock title="Edit Stage and Close Date" mode="edit">
             <apex:pageMessages />
             <apex:pageBlockButtons location="top">
                <apex:commandButton value="Save" action="{!save}"/>
                <apex:commandButton value="Cancel" action="{!cancel}"/>
             </apex:pageBlockButtons>
             <apex:pageBlockTable value="{!selected}" var="opp">
                <apex:column value="{!opp.name}"/>
                <apex:column headerValue="Stage">
                   <apex:inputField value="{!opp.stageName}"/>
                </apex:column>
                <apex:column headerValue="Close Date">
                   <apex:inputField value="{!opp.closeDate}"/>
                </apex:column>
             </apex:pageBlockTable>
          </apex:pageBlock>
       </apex:form>
    </apex:page>
  2. 创建一个引用您的Visualforce页面的自定义按钮。
  3. 将该操作添加到您的列表视图。

    注意

    最近查看的记录列表上不支持批量操作。它们只在列表视图中可用。

例子

这就是闪电体验中出现的动作。

Visualforce custom button in Lightning Experience

从我们的示例中可以看到,Salesforce具有很多功能,允许您迁移JavaScript按钮功能并转到Lightning Experience。

现在,您可能会有很多在您的组织中积累的JavaScript按钮。您可能预期迁移或转换过程需要很长时间。但是这个工作可能不像你想象的那么艰难。我们对Salesforce内部的所有员工使用的JavaScript按钮进行了分析。我们发现许多按钮已经过时或很少被用户调用。其他人只是重复 – 同一个按钮,但在不同的对象。通过列表后,我们发现许多JavaScript按钮可以转换为我们目前所看到的解决方案。其余的,我们可以用新的闪电行动解决不少问题。

您可能注意到了编程解决方案列表中的闪电行为,作为许多JavaScript按钮用例的常见替代品。闪电行动很容易建立,因为他们是基于快速行动框架。您将它们设置为与Visualforce快速操作类似。接下来我们将更深入地介绍闪电行动。

Salesforce Lightning (Javascript按钮 – 1)

学习目标

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

  • 描述使用JavaScript的安全挑战。
  • 列出JavaScript自定义按钮的常用用例。

JavaScript按钮:现在是时候了

我们知道您喜欢JavaScript按钮,并且已经在Salesforce Classic中使用了多年。实际上,您可能不愿意迁移到Lightning Experience,因为JavaScript按钮不受支持。但Lightning Experience比Salesforce Classic提供更多,而且是未来。我们认识到,您期望并依靠我们始终将现有功能迁移到新功能和UI,但对于JavaScript按钮,我们相信即使没有JavaScript按钮支持,Lightning Experience的未来也会更加光明。在这个模块中,我们会告诉你为什么。
JavaScript按钮和链接是Salesforce Classic UI中的操作类型,可让您创建内嵌JavaScript代码,可通过嵌入记录或列表页面的按钮或链接调用该代码。例如,也许你在创建时用数据预填充新记录,并根据其他逻辑更新字段中的值。或者,您可能是使用自定义按钮与您的平台集成的Salesforce合作伙伴。

如果JavaScript按钮非常有用,为什么我们不能在Lightning Experience中支持它们?因为将来自多个来源和作者的不可信JavaScript与应用程序源代码结合在一起,同时保持信任,因此存在重大的安全挑战。

我们将介绍这些安全和功能方面的挑战,并与您分享移动和闪电友好的JavaScript按钮的替代方案。我们还将看看Salesforce中的功能,您可以使用这些功能来迁移使用自定义按钮构建的功能。

我们致力于解决客户端定制和集成问题。让我们向您展示一种思考Lightning Experience中的JavaScript按钮功能的新方法。

JavaScript按钮安全问题和用例

Lightning Experience最酷的好处之一就是可以将自定义的Lightning组件添加到记录,主页和其他页面。例如,您可以选择将地图组件添加到帐户记录页面。或者,您可以为您的AppExchange应用程序提供一个可添加到主页或商机记录的组件。
但是,如果没有一些保护措施,组件就可以访问彼此的数据,共享对窗口和事件结构的访问,并可以访问任何客户端API。例如,当两个组件位于同一页面上时,合作伙伴的HIPAA合规性或财务信息组件可以由不同来源的组件访问。正如您所想象的,这种跨组件访问可能会导致安全和监管问题。

什么是内联JavaScript

在讨论Salesforce针对Lightning组件安全性的保护措施之前,让我们重点介绍一下在线JavaScript的一些问题。 JavaScript是一种松散类型的编程语言,由所有现代Web浏览器支持而无需插件。它可以通过cookie和存储API来保存数据和状态,并且可以通过浏览器访问事件,URL和cookie。什么使得JavaScript既有用也是危险的是它能够完全访问文档对象模型(DOM)和浏览器对象模型(BOM)。

通过访问DOM,程序员可以添加,更改或删除HTML或XML文档中找到的任何内容。在右手中,这很有用,因为JavaScript提供了一个用于处理文本,日期和正则表达式的API,因此使用JavaScript片段添加客户端功能非常容易,从而增强了基本的用户界面。但是,这也是一个明显的漏洞,因为使用跨站点脚本(XSS),恶意角色可以通过JavaScript访问DOM或BOM,并造成严重破坏。

当网站启用动态内容时,黑客可以使用XSS将恶意客户端代码注入普通用户查看的网页中。然后,黑客可以利用用户的会话和cookie来运行脚本来提取数据,记录击键,操纵表单条目,甚至访问API。

LockerService:使闪电组件更安全

好消息是,Salesforce已经在制定一个解决方案,使Lightning组件更加安全,并限制了JavaScript的不受限制的访问。该解决方案是LockerService,它使用旨在防止的各种技术和技术:

  • XSS和类似的安全问题
  • 无限制的DOM访问
  • 调用未记录/私有API

同时,LockerService的功能还可以:

  • 客户端API版本控制
  • 更快的安全审查(AppExchange)
  • 更好的JavaScript开发实践
  • 轻松更新安全功能和策略

所以你现在知道Lightning组件的构建更安全。但是,如何从使用它们中受益,以及如何在Lightning Experience中重新创建JavaScript按钮功能?我们会很快给你看但首先,我们来看看如何在Salesforce Classic中使用JavaScript按钮。

什么人正在做的JavaScript按钮

我们听到很多客户的说法,其中一些在其组织中有数百个JavaScript按钮。我们还与合作伙伴讨论了他们的JavaScript按钮用例。我们把我们学到的东西整理成了一套更广泛的行动。以下是JavaScript按钮最常见的用例。

  • 在保存之前使用或操作记录上的值
    • 验证字段 – 确保值填充和/或符合标准
    • 基于其他字段中的输入预填充值
    • 根据输入值重定向到Visualforce页面
    • 显示确认弹出式屏幕
  • 用预填充值创建记录
  • 从Visual Workflow触发流程
  • 呼叫Salesforce或外部API
  • 与第三方整合
  • 对列表中的记录执行批量操作
  • 直接的方法和程序通过反馈弹出屏幕为用户

还有更多的场景,以及一些对组织非常特殊的用例,他们不可能将其分类。接下来,我们将介绍可用于解决我们提到的所有用例的功能,并将JavaScript按钮功能迁移到Salesforce应用程序和Lightning Experience。

Salesforce Lightning 创建应用(5)

学习目标

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

  • 安装一个自定义Lightning组件
  • 使用您的移动设备在Salesforce应用程序中预览您的应用程序

Lightning App Builder中的自定义Lightning组件

创建一个自定义的Lightning组件需要编程技巧。或者,您可以从AppExchange安装现有的Lightning组件。

重要

点击点击管理员,你可以做这个单位!我们正在为您提供已配置的自定义组件。所以不要担心你不需要编程技能来获得这个徽章。

要了解如何创建自定义Lightning组件,请参阅Lightning组件模块。

您的组织中为Lightning App Builder配置的自定义组件出现在“Lightning组件”窗格中。

Lightning App Builder component pane
您的自定义Lightning组件不会自动在Lightning页面或Lightning App Builder中工作。为了使自定义组件在两个都可用,您需要:

  1. 配置组件及其组件包,使其与Lightning App Builder和Lightning页面兼容。有关详细信息,请参阅“Lightning组件开发者指南”。
    在您的组织中部署我的域。

我们为这个模块提供的自定义组件已经为Lightning App Builder配置好了。然而,在你使用它之前,你需要注意第二步。

在您的组织中启用我的域

在我们开始创建Lightning组件之前,让我们使用Salesforce My Domain来设置一个子域。设置我的域名是一个要求吗?是的,如果您想在Lightning标签,Lightning页面或独立应用程序中使用Lightning组件。 Salesforce需要我的域作为安全措施来帮助防止恶意攻击,以防万一安全漏洞隐藏在第三方或自定义组件中。
如果您的DE组织已经启用了“我的域”,或者使用了Trailhead Playground组织,请跳过本节和下一节。您已经设置了“我的域名”。

如果你还没有一个子域名,很容易设置一个子域名。

每个Salesforce组织都使用像https://na30.salesforce.com这样的URL在salesforce.com域中设置。通过我的域名,您可以在salesforce.com域中定义自己的域名或子域名。您的新网址如下所示:https://yourDomain.my.salesforce.com.

使用“我的域”向导来创建一个子域。My Domain wizard

  1. 从设置中,在快速查找框中输入我的域名,然后选择我的域名。
  2. 在https://之后输入您的子域的名称,然后单击“检查可用性”。通常情况下,一个子域名是你的公司名称,但只要它是唯一的,你可以使用任何名称。如果这个名字已经被使用,请选择另一个。
  3. 点击 Register Domain.

Salesforce使用您的新子域更新其域注册表。完成之后,您会收到一封电子邮件,其中包含“您的开发人员版本域准备好进行测试”这个主题。只需几分钟。

重要

你是否抓住了最后一部分?可能需要几分钟时间才能使用您的域名。在获得激活邮件之前,您无法进入下一步。

将我的域名发布到您的组织

你有没有收到你的激活邮件?从电子邮件中,单击链接返回到“我的域”向导。它会将您带到第3步,在此步骤中,您可以在将子域推出到您的组织之前测试指向您的子域URL的链接。即使您没有用户将其部署到您的DE组织中,仍然必须部署“我的域”以使您的Lightning页面,Lightning App Builder中以及独立应用程序都可以使用您的自定义Lightning组件。
My Domain Wizard
  1. 点击激活电子邮件中的链接以登录到您的Salesforce子域。它会将您带到您的Salesforce组织。
    请注意,浏览器地址栏中的网址显示新的子域名。现在,你是唯一拥有这个URL的人。URL of subdomain
  2. 点击您的组织,确保链接指向您的新域名。您可能还没有在您的DE组织中创建链接,所以我们可以继续。 (在生产组织中创建域时,这个重要步骤很容易被忽略。)
  3. 在“我的域”页面上,单击“部署到用户”,然后单击“确定”。部署子域在整个组织中推出新的子域URL。现在,所有用户都可以在浏览器地址栏中看到子域名网址。
  4. 向导的第4步显示配置选项,我们现在可以忽略它。
恭喜,你已经建立了我的域名!在生产组织中设置“我的域”时,您还需要执行一些步骤。通过完成“用户验证”模块的“我的域”单元了解更多信息。现在,您已经对子域的组织进行了保护并将其品牌化,接下来让我们继续。


安装自定义闪电组件

我们提供了一个自定义的机会警报闪电组件,您可以添加到您的闪电页面。让我们把它安装到你的组织中。

  1. 将https://login.salesforce.com/packaging/installPackage.apexp?p0=04tj0000001mMYP复制并粘贴到浏览器的导航栏中,然后按Enter。
  2. 点击 Install.
    安装过程需要一些时间。
  3. 点击 Done.

安装完成后,是时候将组件添加到您的页面。

将自定义闪电组件添加到您的应用程序页面

  1. 从安装程序中,将App Builder输入到快速查找框中,然后单击Lightning App Builder。
  2. 点击热门客户和商机页面旁边的修改。
  3. 将OpportunityAlert组件拖到页面顶部。
  4. 在属性窗格中,将上次修改后的天数更改为6。
    你有没有注意到组件内部的文本改变了匹配新的字段值?
  5. 点击 Save.

    提示

    因为您以前激活了该页面,所以不必再次激活它。

    好吧!您所做的更改可立即在Lightning Experience和移动应用程序中使用。让我们看看现在的页面是什么样的。

测试自定义组件

我们将首先在Salesforce应用程序中查看它。
  1. 在您的移动设备上打开应用程序。
  2. 如有必要,请使用Developer Edition凭据登录。
  3. 转到Top Accounts and Opportunities页面。
  4. Test Your Custom Component in Salesforce1
  5. 回到您的DE组织,查看Lightning Experience中的Top Accounts and Opportunities页面。
    由于您使用“两列”模板创建了该页面,因此在桌面或平板电脑上查看该页面时会使用双列格式。

    Test Your Custom Component in Lightning Experience
恭喜!您使用Lightning App Builder创建应用页面,个性化您的Lightning Experience主页,并自定义Lightning Experience记录页面。
现在,您已掌握了使Salesforce应用程序和Lightning体验更加便捷,功能更强大的技能。前往和定制!

Salesforce Lightning 创建应用(4)

学习目标

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

  • 将组件添加到Lightning页面
  • 配置Lightning页面和Lightning组件的属性
  • 将操作添加到Lightning页面
  • 为Lightning Experience和移动应用添加闪电页面

应用程序主页闪电页

将应用程序的自定义主页添加到Salesforce应用程序导航列表和Lightning Experience应用程序导航栏,以便用户轻松访问该应用程序中最重要的对象和项目。
Your App Home Page

创建一个App页面

让我们为销售团队构建一个应用程序主页。

您的销售团队需要看到最热门的交易,通过一个可视界面,可以轻松吸收关键细节。他们希望看到他们已经查看的最新机会,并能够通过一次点击或点击钻取记录详情。而且他们希望功能可以记录呼叫,并在旅途中创建客户和机会。

让我们开始吧!

  1. 从设置中,在快速查找框中输入App Builder,然后选择Lightning App Builder。
  2. 点击新建。
  3. 选择应用程序页面,然后单击下一步。
  4. 为您的闪电页面命名最重要的客户和机会。
  5. 选择两列模板,然后单击完成。
    如果Lightning App Builder演练弹出,请将其解除。
    虽然您选择了两列模板,但画布仅显示一列。当您创建应用程序页面时,该模式默认为电话。
  6. 将列表视图组件拖到顶部区域。
  7. 在属性窗格中,选择Platinum和Gold SLA Customers视图。
  8. 将最近的项目组件添加到第二个区域。
  9. 在“最近项目”组件的属性窗格中,单击“选择”,然后向其添加“商机”对象。
  10. 在属性窗格中,单击页面,单击选择,然后将这些操作添加到页面。
  • Log a Call
  • New Account
  • New Opportunity

您只能将全局操作添加到闪电页面。

  1. 从工具栏中,将电话视图更改为Tablet-Landscape。
  2. 单击 Save,然后单击 Not Yet.

App Home Lightning Page

现在您已经创建了您的页面,您几乎已经准备好将其添加到Lightning Experience和移动应用程序中。

将您的应用程序页面添加到Lightning Experience和Salesforce应用程序

就像其他页面一样,您的用户在激活之前不能访问您的应用程序页面。在激活期间,您可以自定义页面的自定义选项卡标签,调整其可见性,并将其在Salesforce应用程序导航列表和Lightning Experience应用程序导航栏中的位置设置在同一位置。

  1. 点击 Activation.
  2. 不要更改应用程序名称。
    默认情况下,您给Lightning页面的标签将用作其自定义选项卡的标签。
  3. 将图标更改为蓝色闪电图标。
    您在此处选择的图标用作应用程序的图标,以及Lightning Experience中的页面。
  4. 保持标签的可见性对所有用户开放。

    提示

    在“闪电”页面上工作时,仅激活系统管理员配置文件设置很有用。将页面限制为管理员只意味着您可以查看和测试页面,但是只有在您准备好将其展示给用户之后,用户才能看到它。

  5. 点击Lightning Experience标签。
  6. 选择一个闪电应用程序,然后点击 Add page to app.
    Activate app page for Lightning Experience
    您要添加到菜单中的页面默认显示在第二个位置。让我们把它留在那里。如果您将其置于最高位置,则会成为所有Lightning Experience用户的登录页面。
  7. 点击Salesforce标签。
  8. 选择 Salesforce Navigation Menu, 然后单击 Add page to app.
    默认情况下,添加到Salesforce应用程序菜单的新页面显示在“智能搜索项目”菜单项下。如果您离开“热门客户和机会”页面,它将出现在菜单的“应用程序”部分。我们不要那个,所以让我们把它移开。
  9. 将页面拖到“今日”菜单项下方。
    Activate Your Lightning Page
  10. 点击 Save.
您的应用程序主页现在已经准备好为您的移动和闪电体验用户!

在Salesforce应用程序中测试您的应用程序页面

您已经创建了页面并将其激活。现在让我们看看它的行动!

  1. 在您的移动设备上打开Salesforce应用程序。
  2. 使用Developer Edition凭据登录。
  3. 点击Salesforce App NavSalesforce App Nav以访问导航菜单。
  4. 选择 Top Accounts and Opportunities.

    这是您的闪电页面!它具有您选择的闪电图标,并且您添加的三个操作位于操作栏中。

    App Home on a Phone
  5. 玩你的网页。上下滚动查看组件,然后点击一个操作图标查看发生了什么。

在Lightning Experience中测试您的应用程序页面

现在我们来看看Lightning Experience。

  1. 回到您的桌面浏览器和您的开发者组织。
  2. 如果您仍在App Builder中,请单击“上一步”返回到“安装”。
  3. 从应用程序启动器(应用程序启动器图标App Launcher icon),打开您分配页面的闪电应用程序。
  4. 点击应用导航栏中的热门客户和机会。
    这是您的闪电页面!闪电图标也出现在这里,你添加的三个动作是在高

    Your app page in Lightning Experience

Salesforce Lightning 创建应用(3)

学习目标

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

  • 为Lightning Experience创建一个自定义的对象记录页面。
  • 将可见性规则添加到记录页面组件。
  • 为您的用户激活自定义记录页面。

那些闪电体验记录页面?你也可以自定义他们!

使用Lightning App Builder在记录页面上添加,删除或重新排序组件,为用户提供每个对象记录的定制视图。更酷的是,您可以自定义记录页面并将其分配给特定的Lightning应用程序,以使您的用户可以访问专门针对他们正在工作的应用程序环境定制的独特记录页面。

Your Record Page

就像主页一样,您可以通过两种方式创建自定义记录页面:使用模板从头创建,或编辑现有页面。我们将使用模板创建一个记录页面。

创建自定义闪电记录页面

让我们从头开始建立一个自定义的机会记录页面。

我们将稍微调整一下标准的记录页面布局,这样你就可以感觉到事情的一起了。一旦你对此感到满意,你可以去任何你喜欢的方式定制自己的记录页面。让我们开始吧。

  1. 从设置中,在快速查找框中输入App Builder,然后选择Lightning App Builder。
  2. 点击 New.
  3. 选择 Record Page.
  4. 为您的页面命名新机会页面,然后选择 Opportunity.
  5. 在下一个屏幕上选择Header,Subheader,Right Sidebar模板,然后单击Finish。
    在组件窗格中,您将看到所有可用于机会记录页面的标准组件以及您在组织中安装的任何自定义组件。
  6. 将Highlights Panel组件拖到页面的顶部区域。
    在组件属性窗格中单击查看工作原理以找出突出显示面板内容的来源。
  7. 将路径组件添加到高亮面板下的区域。
  8. 将Chatter组件添加到右下角的区域。
  9. 将制表符组件添加到左下区域。
    Add Tabs Component

    Tabs组件带有一些默认的选项卡。让我们添加更多。

  10. 在“选项卡组件详细信息”窗格中,单击添加选项卡。
    默认情况下,添加其他详细信息选项卡。但是既然我们已经有了一个,让我们把这个新的改成其他的东西。
  11. 点击第二个详情标签。从“标签标签”下拉菜单中选择“自定义”,然后为标签添加一个新标签:最近的项目。
    Add a new tab
  12. 点击完成。
  13. 创建一个活动选项卡。
  14. “最近的项目”选项卡现在位于选项卡组件的第一个位置。您可以在选项卡之间单击,但没有任何更改,因为选项卡没有任何组件分配给它们。他们是空的。我们来解决这个问题。
    要将组件添加到选项卡,请选择画布上的选项卡,然后在其下方直接拖放组件。
  15. 选择详细信息选项卡。
  16. 将“详细信息”选项卡下面的“记录详细信息”组件拖到绿色突出显示的区域
    Add detail component
  17. 将“相关列表”组件添加到“相关”选项卡,将“活动”组件添加到“活动”选项卡,将“最近项目”组件添加到“最近项目”
  18. 选择画布上的选项卡组件,然后在属性窗格中,将选项卡的顺序更改为:“细节”,“活动”,“最近项目”和“相关”。
    您不能拖动组件内的选项卡来移动它们。您只能在属性窗格中调整它们。
  19. 点击保存。

使您的记录页面动态

你知道你可以控制一个组件出现在闪电记录页面吗?您可以通过向其属性添加组件可见性过滤条件和逻辑。
当您在Lightning App Builder中选择记录页面上的组件时,会显示组件可见性属性。标准组件,自定义组件和来自AppExchange的组件都是如此。不需要添加任何东西到您的自定义组件。这一切都由Lightning App Builder处理。如果您未定义过滤器,则组件照常显示在闪电记录页面上。定义一个或多个过滤器并为组件设置过滤器逻辑时,该组件将被隐藏,直到符合过滤器逻辑标准。

让我们试试看当机会的金额大于或等于100万美元时,我们将构建过滤器以使富文本组件显示,并且其阶段已关闭。

  1. 在页面上的Chatter组件上方添加一个Rich Text组件。
  2. 在组件中输入这个文本:一百万美元的机会关闭!哦耶!
  3. 在组件属性中,使文本粗体和居中,18磅的大小,并改变字体为吸引你的东西。
  4. 保持显示选择卡。
  5. 这个设置使得文本在Lightning页面上更加可读,通过给它添加一个白色的背景而不是透明的背景。关闭设置并重新开启以查看我们的意思。
  6. 点击添加过滤器。
  7. 将字段设置为金额,将运算符设置为大于或等于,并将值设置为1000000。
    Component visibility settings
  8. 点击完成。
  9. 再次单击“添加过滤器”,然后为Stage字段创建另一个等于Closed Won的过滤器。
  10. 再次保存页面,然后点击激活。

将您的自定义记录页面展示给您的闪电体验用户

是时候传播真棒!让我们激活页面。这很容易。

Record page activation

你有三个激活选项。

  • 使页面成为对象的默认值。
  • 使页面成为特定Lightning应用程序的默认对象记录页面。
  • 将页面分配给Lightning应用程序,记录类型和配置文件的组合。

让我们把这个页面分配给一个特定的应用程序,记录类型和配置文件。

  1. 单击应用程序,记录类型和配置文件选项卡。
  2. 点击 Assign to Apps, Record Types, and Profiles.
  3. 将页面分配给销售应用程序,主记录类型和系统管理员配置文件。
  4. 检查页面分配。
    “新建页面”列填充了我们正在激活的页面的名称:“新建商机”页面。
  5. 点击 Save.
看到?十分简单。您的自定义记录页面现在已经生效。我们去看看吧。

提示

你可能会想,“这很好,但如果我改变了主意呢?我如何停用我的自定义页面?“这也很简单。单击激活,单击应用程序,记录类型和配置文件选项卡,然后 Remove Assignments.

看看你在那里做什么?

您已经创建了一个页面并将其激活。现在让我们看看它的行动。

  1. 在App Builder标题中点击返回。
  2. 从应用程序启动器(应用程序启动器图标App Launcher icon)打开销售应用程序,然后单击商机选项卡。
  3. 选择金额低于$ 1,000,000的任何商机。
    您可能需要刷新记录页面更改的机会页面才能显示。
    这是定制记录页面的样子,使用示例公司United Oil Refinery Generators。因为您将记录页面分配给系统管理员配置文件,您可以看到它,但组织中没有其他用户可以。您可以通过创建自定义记录页面并根据应用程序,记录类型和用户配置文件分配自定义您的不同用户的体验。给销售经理一个与你的销售代表不同的机会观点。配置非营利帐户页面不同于标准的商业帐户页面。

    Sample opportunity record

    没有看到您添加到页面的富文本组件?那是因为机会不符合你设定的​​标准。让我们改变这一点。

  4. 在“突出显示”面板的页面级别操作中,选择编辑。
  5. 将机会金额更改为1,000,000美元,将舞台更改为已结束赢取,然后单击保存。
    呜呼,看那个!你甚至不必刷新页面。只要保存更改并符合筛选条件,页面就会自动更新以显示富文本组件及其消息。

    There's the component!

你做到了!你已经迈出了一个更大的世界。
我们继续前往应用页面。

Salesforce Lightning 创建应用(2)

学习目标

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

  • 为您的Lightning Experience用户创建一个自定义主页
  • 将不同的主页分配给不同的配置文件
  • 设置默认主页

是的,弗吉尼亚州,你可以定制你的闪电体验主页

给您的用户提供他们需要的一切,从Lightning Experience的主页管理他们的一天。您的销售代表可以查看他们的季度业绩摘要,并获得关键任务和机会的重要更新。您还可以为不同类型的用户自定义页面,并为不同的配置文件分配自定义页面。

Your Record Page

您可以通过两种方式创建自定义主页:使用模板从头开始创建,或编辑现有页面。

要编辑现有页面,您可以从主页中单击设置齿轮按钮setup gear button,然后选择编辑页面以创建要编辑的当前页面的副本。如果自定义页面存在且处于活动状态,则选择编辑页面打开该页面进行编辑。

我们将从头开始创建一个主页。

超越基础

当您首次选择“编辑页面”时,Salesforce将制作标准页面的副本。这个副本就是你在Lightning App Builder中编辑的内容。以这种方式创建的页面(作为副本)保留对标准页面的引用,这意味着Salesforce将来可以使用新功能为您升级页面副本。如果您从头开始创建页面,则您完全拥有该页面,并且Salesforce的新页面功能将不会自动出现。

创建一个自定义主页

我们将稍微调整标准主页布局上组件的位置,以便让您了解什么是可能的。

让我们开始吧!

  1. 从设置中,在快速查找框中输入App Builder,然后选择Lightning App Builder。
  2. 单击新建,然后选择主页。
  3. 单击向导,并将页面命名为New Home Page,选择标准主页模板,然后单击Finish。
    组件窗格包含可用于主页的所有标准组件。
  4. 将Assistant组件拖到右上角的区域。
  5. 将季度表现拖到左上角的区域。
  6. 将“今日活动”添加到左下方区域,并将“最佳交易”添加到右下方区域。
  7. 在助手上方添加今天的任务。
  8. 点击保存。
    Save Your Home Page

    但是等等,这是什么?还有更多?就在这里。保存页面不足以将其发送给用户。闪电页面必须在用户看到之前激活。

    通常情况下,如果您的页面没有完成,或者尚未准备好公开,则可以单击“Not Yet”(未还)来保存页面并返回到App Builder。但那不是我们。我们大胆!我们已经完成了我们的网页,现在想把它给我们的用户!

  9. 点击激活,我们将做到这一点。

    提示

    如果您以前保存过但没有激活页面,则可以单击工具栏中的“激活”按钮为下一部分做好准备。

将您的自定义主页展示给您的闪电体验用户

激活主页时,您有两种选择:您可以将其设置为所有人的默认设置,或将其分配给一个或多个配置文件,让您的用户访问专为其角色设计的页面。

Activate Your Home Page

让我们把这个主页分配给系统管理员配置文件,以便我们可以在以后看看。

  1. 选择将此主页分配给特定的配置文件,然后单击下一步。
  2. 向下滚动配置文件列表并选择系统管理员。
  3. 单击下一步,检查分配,然后单击激活。
而已。我们去看看。


看看你的手艺

仅供参考,以下是标准默认主页的示例。把这个想象成这个主页改造的“之前”。

Default Home Page

现在,我们将它与我们所做的相比较。

  1. 导航到Lightning Experience主页。
    以下是主页现在的样子:

    Default Home Page

  2. 沉浸在您新发现的页面定制技能的荣耀中。
好吧!我们继续记录页面。