了解您的分析主页

学习目标

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

  • 浏览桌面界面。
  • 描述不同的Analytics资产,例如应用,信息中心,镜头和数据集。
  • 描述将数据导入Analytics的不同方法。
  • 创建一个应用程序
  • 自定义Analytics主页。
  • 组织Analytics演示文稿。

开放分析

现在您已经拥有了支持Analytics的特殊开发人员版组织,请继续打开Analytics。

应用启动器图标

单击应用程序启动器(),然后单击Analytics Studio磁贴。

注意

注意

如果未打开Analytics Studio,请检查您的弹出窗口阻止程序是否已启用。如果是这样,请更改设置以允许您的组织弹出窗口。

小费

小费

单击问号以打开Analytics Studio“帮助”菜单

首次打开Analytics Studio时,将显示“欢迎”屏幕,提供可帮助您入门的资源。您可以立即将其关闭,并随时从“帮助”菜单再次打开它。单击右上角的问号以打开菜单。然后选择 欢迎使用Analytics

浏览分析资产

Analytics会打开主页,您可以在其中查看所有Analytics资产:应用,信息中心,镜头和数据集。但这些资产是什么?我们花几分钟时间讨论每种资产类型。

应用程序图标

应用应用程序是一组专门针对您业务的特定领域的分析和答案。借助应用程序,您可以提供有关数据的精选路径,以及用于自发深入探索的强大工具。创建仪表板,镜头和数据集后,您可以在应用程序中组织它们以按相关顺序显示仪表板,然后与适当的组共享应用程序。默认情况下,您将获得以下应用程序。

私人应用程序图标

我的私人应用这个应用程序是你可见的,只有你。您无法与任何人分享我的私人应用程序。这是一个存储资产的好地方,这些资产包含您尚未准备好向其他人展示的敏感数据或正在进行中的仪表板。

共享应用程序图标

共享应用这个应用程序与我的私人应用程序相反。您的组织中有权访问Analytics的任何人都可以访问共享应用。虽然每个人都可以访问它,但您仍然可以通过行级安全性确保更严格的数据集安全性,您可以在“ 分析安全实施指南”中了解这些安全性

DTC Sales应用程序的图标

我的DTC销售这是我们在Developer Edition org中提供的示例应用程序,可帮助您开始使用Analytics。您将在稍后的路径中使用此应用程序。您可以创建其他应用并控制对每个应用的访问权限。如果同事可以访问应用程序,他们可以查看该应用程序中的所有数据集,镜头和仪表板。例如,您可能希望根据需要为不同的团队创建不同的应用程序。为每个团队创建应用程序允许您为每个部门提供自定义的体验。

Wave仪表板的图标

仪表板仪表板是一组精选的图表,指标和表格,为您提供业务数据的交互式视图。等到你看到这些东西可以做什么。哇!

Wave镜头的图标

镜头镜头是一种保存的探索。当您进行第一次探索时,您将在后面的路径中更深入地了解镜头。

Wave数据集的图标

数据集数据集是一组特殊格式的源数据,针对交互式探索进行了优化。

单击选项卡可过滤主页中显示的资产类型。

要按类型过滤资产,请单击选项卡。

要快速查找资产,请根据名称执行搜索。不要忘记搜索 – 当你的组织中有很多资产时它会很有用!

用于输入搜索词的文本框
切换到平铺视图的图标
切换到列表视图的图标
操作菜单图标

Analytics主页的另一个功能是用于在tile视图()和列表视图()之间切换的视图切换。在平铺视图中,您可以通过缩略图图像来标识资产。在列表视图中,您可以查看有关每个资产的其他信息。在平铺视图中,将鼠标悬停在资产的右上角以找到下拉菜单。在列表视图中,将鼠标悬停在该行的右侧以找到下拉菜单。菜单根据资产有不同的操作。

前进!尝试从平铺视图切换到列表视图并返回。将鼠标悬停在资源上并找到菜单。

帮助图标

在获得Analytics徽章时,您将了解该产品的基础知识。但是,请记住,如果您需要帮助或想了解更多信息,您可以随时点击右上角。

现在,为了准备进一步的分析探索,让我们谈谈数据吧!

了解导入数据和分析数据集

Analytics提供了多种方式从Salesforce和外部源导入数据。例如,您可以使用分析工具(如数据流或数据集构建器)来导入Salesforce数据。

数据集构建器具有点击式界面。数据流使您可以执行更高级的任务。要导入外部数据,您可以使用CSV上载界面手动导入,也可以使用外部数据API以编程方式导入。此外,您可以使用第三方工具导入数据。有关集成数据的详细信息,请参阅“ Analytics数据集成指南”

需要了解的主要内容是导入的数据作为数据集保存在Analytics中。从数据集中,您可以构建镜头,仪表板和应用程序。但是,您现在不必进行任何导入,因为我们已经为您完成了此操作。让我们直接进入下一个任务 – 创建一个应用程序。

创建您的第一个分析应用

应用程序允许用户组织和控制其数据集,镜头和仪表板的共享。您想创建一些镜头,只与您的团队分享。您不希望将它们保存在共享应用中,因为您的组织中的所有Analytics用户都可以看到它们。要与一组选定的用户共享资产,让我们为他们创建一个新的应用程序。

  1. 在Analytics中,单击右上角的“ 创建”按钮,然后选择“ 应用”
  2. 选择Blank App并单击Continue
  3. 输入My Exploration您的应用名称。
  4. 点击创建。您创建了一个应用程序,它显示在新标签中!
  5. 让我们添加一个描述,以便您的同事了解应用程序的用途和内容。单击“ 详细信息”,然后单击描述区域中的铅笔。在显示的框中键入说明。
  6. 为了更容易与其他应用区分,请更改应用的默认图标。单击图标,然后从库中选择一个新图标。

很棒的工作,你创建了你的第一个应用程序!稍后,您将创建探索以从此应用程序共享。但首先,您需要了解有关Analytics应用的更多信息。

自定义您的Analytics主页

既然您已经创建了第一个Analytics应用,那么您就可以自定义自己的Analytics主页了!

  1. 首先,点击“ Analytics Studio”标签。在左侧,您可以看到过滤器和可自定义的视图。最近包括所有资产,但按最近查看的资产组织您的主页。要过滤资产以便于访问,您可以单击“ 由我创建”或“ 与我共享”。您的Analytics主页还有两个可以自定义的区域,一个用于您喜欢的应用,另一个用于跟踪您的通知。通知是当达到,超出或低于您的分数时,Analytics可以向您发送的警报。您可以在主页上设置通知以跟踪目标进度。我们将在下一个模块中收到通知,现在您想专注于应用程序。
  2. 单击左侧面板中的固定应用程序
  3. 单击右上角的Pin Apps按钮。
  4. 单击我的探索我的DTC销售以固定它们。请注意,我的私人应用程序不在列表中。那是因为它用于存储您不会分享的资产。固定应用程序用于运行和显示仪表板。由于您不会从共享应用程序中显示,因此您决定不将其固定到主页。您始终可以在“近期”视图中查看“我的私人应用”和“共享应用”
  5. 单击“完成”

看起来不错!现在,您可以在主页上的固定应用下轻松访问您需要的两个应用程序。

注意

注意

应用按照您固定的顺序显示在Analytics主页上。

从Analytics Apps运行演示文稿

分析应用程序是您运行仪表板和镜头的地方。

  1. 如果您还不在,请点击Analytics主页上的固定应用
  2. 单击我的DTC销售。这将打开应用程序的浏览页面,您可以在其中查看应用程序的资产。(在Analytics主页上,您可以浏览所有资源,但在浏览应用时,您只能查看该应用中的资源。)
  3. 单击“ 运行应用程序”按钮注意如果第一次尝试时未加载应用程序,请关闭该选项卡,然后使用以下链接重新登录:login.salesforce.com。该应用程序将打开其导航列表中的第一个仪表板。请注意,仪表板的上半部分具有仪表板的名称以及用于运行仪表板和应用程序的控件。带有三个点的图标打开一个带有其他选项的下拉菜单。在Analytics Studio中运行信息中心时,您可以:
    • 在仪表板设计器中编辑仪表板
    • 从仪表板共享
    • 全屏显示
    • 打开通知面板并在仪表板小组件上创建通知
    • 打开注释面板并注释仪表板小部件
    • 在新选项卡中克隆仪表板
    • 保存仪表板的修改视图
    • 将仪表板返回到其初始视图
    • 导航到应用程序中的其他仪表板和镜头
    • 此外,如果您有经理访问仪表板,您可以:
      • 保存仪表板
      • 删除仪表板
      • 打印或保存仪表板的PDF文件
      • 使用仪表板检查器工具评估性能运行仪表板时可以做很多事情!随着我们的进展,我们将涵盖其中的大部分内容。首先,让我们学习如何在应用程序中浏览资产并设置演示文稿。
  4. 单击仪表板标题旁边的向下箭头以打开导航列表。该列表在应用程序中有可用于呈现的仪表板和镜头。只需单击仪表板名称即可在演示文稿中运行仪表板。由于DTC管理员会将您设置为此应用程序的管理员,因此您可以访问用于设置演示文稿的控件。
  5. 单击“ 编辑列表”以排列演示文稿。“ 选定的资产”列显示演示文稿的顺序。您可以重新排列订单,或将资产移动到可用列,以便它们不会显示在导航列表中。
  6. 单击“商机详细信息”,然后单击向左箭头。如果此时保存了应用程序,则可以与不应查看机会详细信息的个人或组共享该应用程序。您可以向他们授予对该应用的查看者访问权限。对于其他同事,您可以授予编辑或管理员访问权限,具体取决于您希望他们拥有的控制量。有关共享应用程序的更多信息,请参阅 应用程序级别共享
  7. 单击“区域销售”,然后单击向上箭头以使其更改具有“商机详细信息”的位置。随意练习重新排列导航列表。但只需花一点时间,因为在与经理会面之前,您需要转到下一个模块以了解有关Analytics仪表板的更多信息!
  8. 准备好后,单击取消将导航设置为原来的 样式

准备发现分析

花一点时间拍拍自己的背部!在此模块中,您注册了启用Analytics的Developer Edition组织,并了解了Analytics环境。您创建了自己的可共享应用程序,设置了主页,并了解了应用程序演示文稿。你做得很好!

但是,您只是在学习分析的力量。在即将推出的模块中,您将导航示例应用程序中的仪表板,然后跳转到桌面和移动设备上的真实数据探索。

Lightning Experience推广专家

学习目标

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

  1. 为开发人员,管理员和用户阐明Lightning Experience的价值主张
  2. 解释Lightning Experience Readiness Check和Salesforce Optimizer报告
  3. 推出闪电体验
  4. 自定义Lightning应用程序的导航样式,以便快速访问关键数据
  5. 配置Lightning报告和仪表板
  6. 自定义主页,记录和应用页面
  7. 将文档迁移到文件
  8. 配置闪电知识

在此测试的概念

  • Lightning Experience用户界面
  • Lightning Experience推出最佳实践
  • Lightning Experience报告和仪表板
  • Lightning体验销售和服务功能
  • Lightning Experience主页,记录和应用页面定制

前期工作和笔记

  • 您可能希望在阅读要求时记下笔记(除非您有照片记忆)。所以现在就拿一支笔和纸(或电子替代品)。
  • 为这个superbadge创建一个新的Trailhead Playground。如果您使用现有组织,则在验证挑战时会遇到问题。请注意,您的Trailhead Playground已启用“我的网域”。请勿编辑“我的域”设置。
  • 安装这个非托管的superbadge包unmanaged superbadge package。该软件包包含完成挑战所需的架构。如果从AppExchange安装托管或非托管程序包或应用程序时遇到问题,请按照本文中的步骤操作article
  • 您的Trailhead Playground将在Lightning Experience中打开,但您需要切换到Salesforce Classic以执行一些预先设置的任务。您还需要在Lightning Experience和Salesforce Classic之间来回切换,以配置和测试挑战中指定的一些功能。
  • 准备好您的Trailhead游乐场,以应对这种超级挑战。
    1. 从Salesforce Classic中的“设置”中,使用“Account”选项卡“Visualforce”页面覆盖帐户选项卡,该页面包含在先前安装的superbadge软件包中。
    2. 同样在Salesforce Classic中,将TrailheaDX组件添加到DE Default Home Page布局中。
    3. 从Salesforce Classic或Lightning Experience中的设置:创建名为John Wiseman的用户,并将其分配给Salesforce用户许可证和Custom:Sales Profile配置文件。
    4. 创建名为Paloma Espinoza的第二个用户,并将她分配给Salesforce Platform用户许可证和标准平台用户配置文件。
  • 使用“Business and Technical Requirements”部分中指定的命名约定来确保成功完成挑战。

用例

有些人穿鞋从A点到B点。其他人穿着鞋子在A,B和C点看到.Lusso Scarpe(发音为loo-so scar-peh)的客户绝对属于第二类。 Lusso在线和高档精品店销售精选的设计师鞋类系列,并将Salesforce用于其所有销售和服务运营。

Lusso Scarpe还拥有一个成功的批发业务部门。但是,有大量新的竞争对手专门针对他们的一些关键细分市场。直接面向消费者的在线业务有一群忠诚的常客,但增长速度比整个市场慢。

Salesforce Lightning Experience拥有推动生产力的新功能,是Lusso Scarpe应对这些挑战的战略的关键组成部分。

您是幸运的专家,为Lusso Scarpe的所有Salesforce需求提供咨询(并且您获得了广受欢迎的员工折扣)。如果您选择接受它,您的任务就是将公司的组织从Salesforce Classic转移到Lightning Experience。

您不仅可以帮助公司尽可能顺利地推出,还可以确保销售和服务代表能够快速使用可提高生产效率的新功能。

Lusso的人习惯了奢侈品。让我们给他们白手套服务。

标准对象

Lusso Scarpe使用标准的Salesforce对象来存储其所有数据。以下是您将要使用的对象。

  • Account – Lusso Scarpe与之合作的公司,包括经销商和供应商。
  • Contact – Lusso Scarpe客户的直接客户或员工。
  • Opportunity – 潜在的批发交易。
  • Campaigns – 针对性的营销活动主要针对在线客户。
  • Cases – 账户提出的查询或投诉。

您的Lightning Experience部署策略不包括任何向架构添加关系或对象的计划。为什么要创造复杂性吧?

Lightning Experience 评估

为了帮助定义将Lightning Experience推广到Lusso Scarpe的要求,请评估它们当前实现在新界面中的工作方式,并查看是否存在需要解决的功能差距或问题。

看看如何准备好 Lusso Scarpe

任何Lightning Experience Rollout专家都值得他们做的第一件事就是运行Lightning Experience Readiness Check。当有自动化工具设计用于此时,谁想手动梳理组织寻找问题?

查看生成的报告,以便了解准备切换的用户,可以使用的功能和自定义以及您可能需要解决的任何技术问题。

通过一些弹簧清洁简化部署

Salesforce Optimizer是您推出武器库中另一个非常棒的工具,因为它可以降低复杂性。而且您的一切都是为用户提供简化,高效的体验。 (另外,你的工作也少了,所以奖金。)

运行优化程序然后查看优化程序报告,以查看Lusso是否具有未使用的功能,包括字段,页面布局,记录类型和验证规则,您可以留下这些功能。

为冠军用户启用Lightning体验

真实世界的使用是了解Lightning Experience如何在Lusso Scarpe中“开箱即用”,或者在要求Lusso员工使用新界面之前应该解决哪些功能和定制的最佳指南。作为评估的一部分,为您最热情,最值得信赖的用户(您的支持者!)启用Lightning Experience,并获得一些快速,可操作的反馈。

来自“哪些用户准备好了?”准备报告的一部分,你知道Lusso的用户配置文件还没有为Lightning Experience做好准备。但John Wiseman是Lusso最大的Salesforce粉丝,他期待着潜入Lightning Experience。此外,作为一名经常出现解决客户问题的销售经理,他对销售和支持团队的需求非常了解。他是一个简短的事实调查试点项目的理想冠军!让John访问Lightning Experience,看看他的想法。

由于Lusso是销售团队的沟通负责人,Paloma Espinoza负责管理公司的Chatter小组并与Lusso的顶级账户进行沟通。在飞行员中加入Paloma,这样您就可以获得她的观点和反馈。她希望全力投入Lightning Experience,因此无法访问Salesforce Classic。

Lusso Scarpe的闪电体验部署计划

Lusso Scarpe的每个人都需要使用闪电体验,他们都希望昨天采取行动。但是你知道将最初的热情转化为全心全意的采用的最好方法是分阶段推出新的界面。从Lightning Experience为其业务需求提供良好服务的小团体开始。然后收集反馈,微调事物,并推广到另一个小组。冲洗并重复。这是确保每一位Lusso Scarpe用户从第一天起都富有成效并取得成功的最佳方式。

基于Lusso的业务优先级 – 以及Lightning体验准备报告的指导以及两位飞行员用户的反馈,John和Paloma – 您决定最佳策略是分两个阶段推出Lightning Experience。首先,你将转变Lusso的销售团队。稍后,您将移动支持团队。

业务和技术要求

根据您对Lightss Experience中Lusso Scarpe组织的评估,您的冠军的反馈以及Lusso利益相关者对必要业务流程的意见,您的推出计划包括这些要求。

第1阶段要求

Lusso Scarpe想做什么?当然,更快地销售更多豪华的鞋子。准备Lightning Experience,以便随时推出Lusso的销售团队。

解决最重要的技术问题

在Lightning Experience Readiness Report中,您看到Salesforce不打算支持Lightning Experience中的文档。但是,Lusso Scarpe销售团队经常使用Documents,因此在开始第一阶段推出之前解决这一差距非常重要。您需要弄清楚如何使Lightning Experience中的Salesforce Classic中的文档库中存储的资源可用。

根据试点计划的反馈,您可以放心解决准备报告中提到的其他问题,直到您推出的后期阶段。但John和Paloma都表示,在Lightning Experience的Accounts主页上工作令人困惑,因为该页面看起来像Salesforce Classic。 Lusso用Visualforce页面覆盖了Accounts主页。该页面在Lightning Experience中正常工作,但您需要重新设置它以使其具有Lightning Experience外观。

满足业务需求并确保最佳用户生产力

要让销售团队从正确的位置上解决,请确保Lightning Experience针对部署的第1阶段处理这些用例。

优化商机工作空间以实现销售成功

Lusso的新赛季系列已经淘汰出局,并且受到了巨大的打击,尤其是那些生活中缺乏闪亮鞋子的人。参加米兰的时装周肯定得到了回报。随着大量的询问进入,尤其是批发业务部门,销售经理需要确保销售代表专注于重要任务,以便他们能够快速完成交易。

为帮助销售代表成功完成销售,在管道的每个阶段提供适当的指导。在Opportunities对象中包含以下指导:

Stage Fields Guidance for Success
Qualification Account Name, Opportunity Name, Description  – 分享我们目录中最合适的部分。
– 分享时尚达人的推荐信。
– 向买家展示我们最受欢迎的系列。
Needs Analysis Expected Revenue, Main Competitor(s), Next Step, Probability(%) – 问:“还有什么你想知道或需要继续购买吗?”
– 设定后续日期。
Negotiation/Review Amount, Quantity, Stage  – 如果买家似乎可以放弃交易,可以优惠5%。
– 跟进买家的问题或需求。
Closed Lost Close Date, Next Step  – 创建丢单笔记。
– 从今天起设定一年的跟进日期。
Closed Won Close Date, Delivery/Installation Status – 在Chatter庆祝!
– 与客户团队核实付款处理。
使用经常需要的详细信息增强帐户记录页面

Lusso Scarpe的大多数Salesforce用户定期处理帐户记录。使用John和其他销售团队利益相关者的反馈,您已确定销售代表最重要的帐户详细信息是:

  • 帐户的名称
  • 有多少员工在该帐户工作
  • 用于呼叫帐户的电话号码
  • 评估与此帐户开展业务的难易程度

但Paloma告诉您,在与顶级帐户进行通信时,一些不同的字段会很有用。 Paloma在处理账户时的优先事项是:

  • 帐户的名称
  • 帐户类型
  • 用于呼叫帐户的电话号码
  • 父帐户名称(如果有)

自定义帐户,以便销售代表看到他们最关心的细节的亮点,而Paloma看到她关心的细节的一个亮点。

让Reps轻松访问他们最常使用的对象

在试点计划期间,John报告说,当使用名为Sales的Lightning应用程序时,他必须进行大量额外点击才能获得销售代表最常访问的项目。在对销售团队进行快速调查之后,您知道代表经常使用这些页面和对象:主页,帐户,机会,活动,潜在客户,联系人,报告和仪表板。配置销售应用程序,以便销售代表可以快速访问这些关键项目,而无需进行大量额外的导航。

销售代表还要求销售应用程序中的页面可以:

  • 跟踪他们最近查看过的联系人,机会和潜在客户。
  • 每周查看他们的新帐户列表。
  • 快速创建新的机会并记录对联系人的呼叫。

创建一个名为Key Sales Data的页面,该页面满足这些要求并将其包含在Sales应用程序中。

Paloma与其他销售团队有不同的需求。她经常使用Accounts,Chatter,Reports和Dashboards。为Paloma创建一个新的Lightning应用程序,让她专注于这些项目。设置新应用,这是她的个人资料的默认设置。

促进与Chatter组的协作

Lusso Scarpe的领导团队始终培养着开放和诚实的文化。有什么比Chatter更好的工具呢?公司的新用户加入部门和团队小组进行协作和发布公告。

创建一个名为 All Lusso Scarpe Employees 小组,并向小组提供此描述: This group is for all Lusso Scarpe employees to collaborate and receive company announcements. 所有员工都可以加入该组。

该小组应在页面右侧显示以下信息:recommended groups and individuals to follow and the most popular topics currently under discussion.

为销售经理设置报告

Lusso转向Lightning Experience的一个主要原因是惊人的分析功能。创建正确的报告和仪表板可以避免决策过程中的猜测,并使销售经理能够评估销售运营的有效性。

Lusso的销售经理希望密切关注每个帐户的机会。查看帐户时,他们希望查看按阶段显示商机数量的漏斗图表。他们还想要一个仪表板,向他们展示一些事项:逐个机会的概率,赢得的机会产生的收入,以及他们的业务有多少是新的以及存在多少。

在Lightning Experience中设置报告,以便销售经理获得所需的信息。首先创建一个报告,显示所有时间的数据并按阶段显示机会。调用报告Opportunities Pipeline。在报告中添加漏斗图表。

然后将报告图表添加到帐户记录中。通过Stage调用嵌入式报表图表 Opps by Stage.

接下来,创建一个名为Sales Operations的仪表板,其中包含所请求的组件:

  • 水平条形图 为Opp Probability by Stage, 显示probability by stage
  • Gauge called Sum of Opportunity Amount, 显示 the sum of revenue generated by all opportunities
  • Donut called New and Existing Business, 显示the sum of revenue generated by new and existing business

让用户按阶段过滤仪表板。将过滤器命名为 Stage value

Lusso的销售经理提醒您,当人们查看仪表板时,他们应该只看到他们通常可以在Salesforce中查看的数据。

最后,John Wiseman希望每周审查一次机会管道报告。设置它以便他每周一上午8:00通过电子邮件收到刷新的报告结果。

第2阶段要求

您成功为销售团队推出了Lightning Experience。现在是时候解决推出的第二阶段了。

在这个阶段,您将为Lusso的支持团队推出Lightning Experience。此外,您一直在监控您是否达到了销售团队的成功指标,并且您一直在收集销售代表和经理的定期反馈。因此,您已经确定了另一组更新,这些更新将有助于消除痛点并提高工作效率。

为Lusso的支持团队定制闪电体验

Lusso Scarpe的支持代表为他们为客户查询和投诉提供快速有效服务的记录感到自豪。 Lightning Experience在Lightning Knowledge中提供增强的搜索功能,这是一个新的控制台知识侧边栏,以及许多其他增强功能。 Lightning Knowledge主页还提供了知识列表视图(是的!),并允许代表搜索,查看,创作和管理文章 – 所有这些都来自同一个地方。

将Lusso Scarpe的支持团队转移到Lightning Experience是您推出第2阶段的主要优先事项。为了帮助支持代表简化知识库管理,他们可以花更多时间帮助客户,在Lightning Experience中启用Lightning Knowledge。

设置Lightning Knowledge以满足支持团队的需求。

  • 在查看文章时,需要明确问题和相关答案是什么。添加名为Question and Answer的自定义文本字段以存储此数据。在“答案”字段中,允许支持代表格式化文本并输入图像。
  • Lusso的支持团队创建了多种类型的文章,包括常见问题,产品相关文章和社区文章。虽然所有这些文章中都有一些常见信息,但每种类型都有唯一的字段,操作和相关列表。配置Lightning Knowledge以包含这三种类型的文章。
  • 每种类型的文章都需要显示“Record Type ”字段和自定义“Question and Answer”字段。允许知识用户在创建或编辑文章时选择文章类型。

随着Lusso的知识文章准备就绪,为代表提供了一个高效的工作环境。他们需要同时查看列表视图,处理其他记录,并在同一屏幕上查看多个记录及其相关记录。通过设置名为Lightning Knowledge的Lightning应用程序来完成此操作。

如果销售代表可以在这些主要标签的上下文中看到他们最近访问过的主要标签,以及他们的子标签,那会不会很棒?肯定会,所以请确保他们可以在新的Lightning Knowledge应用程序中访问此功能。

在Lightning Knowledge应用程序中包含Lightning Experience主页。但默认主页对于Lusso的支持团队来说并不是最佳选择。你收集了Lusso的支持代表关于他们理想主页的意见,这是他们想要的:

  • 查看Chatter摘要。
  • 查看他们的日常任务和预定活动。
  • 快速访问他们最近使用过的记录。
  • 查看最近使用过的项目列表。

他们不需要助理,他们也不需要跟踪季度表现或查看最高交易列表。更新主页以满足这些要求。将其命名为Org Home并将其设置为每个人的默认设置。

解决准备报告中确定的更多技术问题

您偶尔会重新运行Lightning Experience Readiness Check,以了解新的Salesforce版本和您的开发工作对Lusso Scarpe的准​​备情况的影响。根据您从Lusso销售团队获得的持续反馈,您已决定需要在第2阶段的当前准备情况报告中解决这些问题:

  1. Salesforce Classic主页上的TrailheaDX侧边栏组件在Lightning Experience中不可用。您将收到销售代表经常切换回经典界面以使用侧边栏组件的反馈。通过在名为Sales的Lightning应用程序中提供TrailheaDX来消除这种低效率。
  2. 提供准备报告中标识的自定义链接的替代方案。值得庆幸的是,Lusso的Salesforce开发人员已经创建了一个Apex类,一个测试类和一个Lightning组件,以使您的生活更轻松。

That’s a Wrap

恭喜!随着第二阶段的成功完成,Lusso Scarpe的每个人现在都在使用Lightning Experience。

原文:https://trailhead.salesforce.com/en/content/learn/superbadges/superbadge_lex_rollout

开始探索分析

学习目标

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

  • 描述Salesforce Analytics是什么。
  • 说明Analytics如何为您的业务带来益处。
  • 注册一个特殊的Analytics Developer Edition组织。

介绍Salesforce Analytics

分析为您团队中的每个成员带来即时洞察力。

您的公司数据位于不同的位置,例如Salesforce,ERP,数据仓库和日志文件。在一起查看时,所有这些数据都可以成为金矿,改变您对业务的看法并改善客户的整体体验。分析解决了将所有这些信息结合起来以回答业务用户的关键问题的挑战。

分析是Salesforce安全,可信,可扩展,当然还有移动!它使您组织中的每个人都能通过其直观的点击式可视界面立即访问强大的数据洞察。无论您使用的是桌面浏览器还是移动设备,都可以从数据中获得所需的答案,以便开展业务。

Examples of Analytics on smartphones

支持分析的技术可以改变游戏规则,让您可以为您的团队带来自助式商业智能。无需等待IT处理数据并创建复杂查询。不需要设计模式。无需安装。刚进去!弄脏!立即通过Analytics获取答案!

Examples of Analytics used across platforms

你可以用分析做什么?

Analytics是一种自助服务应用程序,可让您了解大量数据。您可以浏览数据以发现新的意外见解。获得即时可视化,展示您的业务如何运作,甚至凝视未来,看看未来几个月可能会带来什么。并创建仪表板,以根据最新数据持续监控关键业务指标。
它是如何工作的?通过将不同的数据 – Salesforce或外部数据加载到数据集中,然后对数据进行切片和切块,以获得运行业务所需的答案,从而创建聚合视图。所有Salesforce内部。保存您的见解,与他人分享,并在Chatter中开始讨论它们。

Product overview diagram

开始探索您的数据

当您开始使用Analytics时,我们将探索仪表板,然后向您展示在桌面和移动设备上探索,可视化和共享的难易程度。

因为在没有目标的情况下分析数据毫无意义,我们将引导您完成基于具体业务用例的探索,所有这些都在故事的背景下进行。探索旨在帮助您更好地了解业务并制定数据驱动的决策。在这个故事中,探索将向您展示如何提出问题并从您的数据中获得答案。当您正在探索数据时,您会发现新问题经常出现。您无需等待某人提供答案,而是可以使用Analytics立即回答新问题。

让我们深入了解这个故事。

欢迎来到您的新工作!

您刚刚加入DTC Electronics的销售经理,DTC Electronics是笔记本电脑,平板电脑和其他硬件设备的领先供应商。欢迎加入团队 – 在Analytics的帮助下,您注定要成为一名优秀的销售经理!

您的首要目标之一是帮助您的团队根据数据分析做出决策。 DTC选择了Analytics,因为它是一个自助服务应用程序,可以快速实现价值。您在Salesforce中已经有大量销售数据要使用Analytics进行探索。稍后,您可能需要引入其他Salesforce数据(例如案例以及外部数据),以便为您提供360度的业务视图。

所以,你准备好了吗?为了完成这些探索并获得跟踪徽章,我们将为您提供Analytics附带的特殊开发人员版组织,其中包含来自新公司的示例数据和示例应用程序。我们将介绍如何获得下一个特殊组织。

尝试使用Developer Edition组织进行分析

一个免费的开发人员版组织是一个安全的环境,你可以练习你正在学习的技能,当你在Trailhead上应对挑战时,你肯定需要一个。

重要

对于此跟踪,您不能使用现有的Developer Edition组织。您必须注册此特殊的开发人员版,因为它附带有限的Analytics Platform许可证,并包含此跟踪所需的示例Analytics应用和数据。即使您已经拥有支持Analytics的开发人员版组织,也请立即注册新版本。较旧的支持Analytics的开发人员版组织不会获得最近发布的功能,因此注册新功能可确保您获得最新且最好的功能。

让我们为您设置,以便您可以登录并开始使用Analytics。

  1. 转到 developer.salesforce.com/promotions/orgs/wave-de.
  2. 使用有效的电子邮件地址填写表单。您的用户名也必须看起来像电子邮件地址并且是唯一的,但它不必是有效的电子邮件帐户。例如,您的用户名可以是yourname@waverocks.de,或者您可以输入公司名称。
  3. 填写表单后,单击“  Sign me up ”。出现确认消息。
  4. 出现确认消息,要求您检查电子邮件。
  5. 完成注册,并设置密码和质询问题。
  6. 单击Save.
    您将登录Developer Edition组织并重定向到“设置”页面。

路要走!您现在拥有一个Salesforce组织,其中包含您的DTC Electronics销售应用和数据!

公平地说,我们通过创建一个已经准备好了各种各样的好东西的组织,让你在这条路上变得更容易一些。该组织已启用Analytics,它已定义所有必要的权限,并且它包含一个带有一些预加载测试数据的Analytics应用。如果您想了解启用和设置Analytics的管理工作,请查看名为Build and Administer Analytics的跟踪。

还有一件事要做:将新组织连接到Trailhead。

  1. 确保您已登录到Trailhead帐户。
  2. 在本页底部的“挑战”部分中,从“Trailhead Playground”选项列表中选择“Log into a Developer Edition”。
  3. 在登录屏幕上,输入您刚刚设置的Developer Edition的用户名和密码。
  4. 在允许访问? 屏幕,单击Allow。
  5. 想要连接这个组织进行实际操作的挑战吗? 屏幕,单击 Yes! Save it. 。 您将被重定向回挑战页面并准备好使用新的开发人员版来获得此徽章。

现在,您已准备好完成下面的动手挑战,然后跳转到下一个单元,了解您在新的Analytics主页上的方法。

ALBERT EINSTEIN的版权包括经耶路撒冷希伯来大学许可使用。 由Greenlight独家代理。

Salesforce中国个人身份信息(PII)的技术选择

学习目标

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

  • 利用Mashup (Canvas or Image)实现无PII数据存储或途径Salesforce
  • 利用Salesforce Connect实现无PII数据存储但途径Salesforce
  • 利用Platform Encryption实现PII数据存储在salesforce
  • 利用Tokenization实现PII数据存储在salesforce

Mashup – Canvas

Canvas使您可以轻松地在Salesforce中集成第三方应用程序。 Canvas是一组工具和JavaScript API,可用于将应用程序公开为画布应用程序。这意味着您可以将新的或现有的应用程序作为Salesforce体验的一部分提供给用户。

Canvas使用场景

从高级视图来看,有两种常见的Canvas实现方案。

  • 应用程序集成 – 您是构建云应用程序的合作伙伴,系统集成商或客户,您希望将这些应用程序与Salesforce集成。
  • 应用程序合理化/企业桌面 – 您是一个大型组织,除了Salesforce之外,还有许多用户可以访问的现有应用程序。您希望将这些应用程序集成到Salesforce中,以便用户可以在一个位置完成所有任务。

公民的个人身份信息客户的本地数据中心

详细参考:http://www.ponybai.com/category/integrate/canvas/

用于公民的个人身份信息数据调用的Web App
Force.com Canvas SDK

Canvas 画面显示效果

Mashup – 图片

Salesforce支持的字段定义 – 指向个人身份信息Web Service以进行数据检索的图像公式。

PII客户的本地数据中心,用于数据调用的Web Services

图片混搭画面显示效果

Canvas和图片混搭比较

Canvas和图片混搭比较图像混搭Canvas画布 
MethodSalesforce支持的字段定义 – 指向PII Web Service以进行数据检索的图像公式。启用外部Web应用程序作为Salesforce UI中使用的连接应用程序(Canvas)。
View PII不改变字段安排的页面布局。在页面加载时检索PII数据元素并显示为图像。对现有用户体验的最小影响。将外部网络应用程序嵌入页面中的iframe。
页面布局需要更改。
用户体验发生了变化,需要更多的工作才能适应浏览器和移动访问。
Create / Modify PII 带有标注PII Web服务的自定义Visualforce页面。 对现有用户体验的最小影响。将外部网络应用程序嵌入页面中的iframe。用户体验发生了变化,需要更多的工作才能适应浏览器和移动访问。
Security白名单Salesforce IP范围或基于证书的信任身份验证。通过Connected App进行OAuth身份验证。
Performance & Scalability基于API,图像有效负载从浏览器到本地PII数据中心,中国网络内的流量。Web App,有效载荷从浏览器到本地PII数据中心,中国网络内的流量。
Usage in other Salesforce standard functions可以在所有仅查看功能中使用OOTB,例如,记录视图,列表视图,相关列表和报告等。不能用于搜索,SOQL和任何规则标准,过滤,报告分组等。不能用于OOTB功能。

利用Salesforce Connect

Salesforce Connect是一个使您能够查看,搜索和修改存储在Salesforce组织外部的数据的框架。例如,您可能拥有存储在企业资源规划(ERP)系统中的数据。您可以使用外部对象通过Web服务标注实时访问数据,而不是将数据复制到您的组织中。

Salesforce Connect应用场景

  • 您有大量不想复制到Salesforce组织中的数据。
  • 您在任何时候都需要少量的数据。
  • 您需要实时访问最新的数据。
  • 您将数据存储在云或后台系统中,但希望显示或处理Salesforce组织中的数据。

PII数据存储在本地数据中心,Salesforce Services Cache。

外部数据源画面效果显示

分类External Objects
Method在Salesforce中定义为外部对象,映射到外部数据源(PII数据表)。每个外部对象的字段都映射到外部数据源(PII数据字段)上的列。
View PII使用间接查找关系在标准/自定义对象中显示为相关列表,例如,帐户,页面布局。
Create / Modify PII 创建/修改PII可以定义为“可写外部对象”,以允许用户创建,更新和删除与外部数据源关联的外部对象的记录。
默认情况下,外部对象是只读的。
Security密码或OAuth身份验证。 (可选)基于证书的双向SSL。
Performance & Scalability实时检索数据。 应用Apex调速器限制。
OData标注率限制:
https://help.salesforce.com/articleView?id=platform_connect_considerations_query_rate_limits.htm&type=0&language=en_US
大量数据量注意事项:
https://help.salesforce.com/articleView?id=odata_considerations_high_data_volume.htm&type=0
用于其他Salesforce标准功能可以在所有仅查看功能中使用OOTB,例如,记录视图,列表视图,相关列表和报告等。可用于搜索,SOQL和有限的Chatter Feed功能。
字段历史记录跟踪不可用。

Salesforce Platform Encryption 平台加密

分类Platform Encryption
MethodPII数据存储在具有加密字段数据类型的Salesforce中。 客户可以管理自己的加密密钥。
View PII具有“查看加密数据”权限的用户可以清楚地查看PII数据值。 未经许可的其他人将数据值视为“******”。
Create / Modify PII 创建/修改PII具有适当访问权限的用户可以创建和修改PII数据。
Security应用正常的Salesforce用户访问权限和对象/记录/ FLS安全性。 具有“查看加密数据”权限的用户可以清楚地查看PII数据值。
Performance & Scalability用户无需额外开销即可访问PII数据。
用于其他Salesforce标准功能可用于大多数功能,限制应用。
General Shield平台加密注意事项和限制:
https://developer.salesforce.com/docs/atlas.en-us.securityImplGuide.meta/securityImplGuide/security_pe_considerations_general.htm

Tokenization密钥加密解密

PII数据保存在客户本地,用于调用PII数据 Web Services调用

画布开发(9)Salesforce App中的Canvas

学习目标

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

  • 设置Canvas应用程序位置并将其添加到导航菜单
  • Salesforce App上下文注意事项
  • Salesforce App Access注意事项
  • Salesforce App自定义图标
  • 适用于Canvas应用程序的Salesforce App导航方法

Canvas使您可以在Salesforce应用程序中公开您的画布应用程序。 Salesforce应用程序是随时随地的Salesforce。这款企业级移动应用程序可让您实时访问在办公室中看到的相同信息,但它可以帮助您在离开办公桌时完成工作。就像在完整的Salesforce站点中一样,用户可以访问发布者和Chatter订阅源项,包括Canvas应用。

开发人员可以在Salesforce应用中使用画布应用来:

  • 将画布应用程序公开为动作。图标表示画布应用程序。您可以使用默认拼图图标或上传相关操作的自定义图标。
  • 从Salesforce中的画布应用程序或Chatter API发布到Feed。
  • 在Salesforce应用程序内的Feed项目中显示画布应用程序。图标表示画布应用程序。您可以使用默认拼图图标或在Feed项中提供缩略图URL来显示自定义图标。
  • 在导航菜单中添加画布应用程序作为选项。图标表示画布应用程序。您可以使用默认拼图图标或在画布应用程序的连接应用程序设置中提供自定义图标URL。

注意:Canvas应用程序不会出现在Salesforce for Android的应用程序导航菜单中。要在导航菜单中查看画布应用程序,请登录Salesforce移动Web。

例如,您可能拥有仓库员工用于处理移动设备上的订单的画布应用程序。您可以创建一个从设备图标访问应用程序的操作,允许员工提取客户订单列表。处理订单后,应用程序会在Salesforce中设置订单状态,并将Feed项目发布到关联的客户帐户。

用户仍然可以在台式机上的Salesforce中访问您的画布应用程序。 Salesforce提供的移动设备的附加功能不会影响或限制现有功能。

设置Canvas应用程序位置并将其添加到导航菜单

要添加要在Salesforce应用程序导航菜单中显示的画布应用程序,您必须设置位置并将其添加到移动导航。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“Apps”。
  2. 在“已连接的应用程序”相关列表中,单击导航窗格中要提供的应用程序,然后单击“Edit”。
  3. 在“Canvas应用程序设置”部分中,选择“Canvas”。
  4. 在“位置”字段中,选择“Mobile Nav”,然后单击“Add”。
  5. 单击“Save”。
  6. 要使画布应用程序显示在导航菜单中,您必须将其添加到移动导航中。从设置中,输入导航在“快速查找”框中,选择“Salesforce Navigation”。
  7. 从可用的菜单项中,选择您的应用,然后单击“Add”。
  8. 单击“Save”。

Salesforce App上下文注意事项

在Salesforce应用程序内显示画布应用程序时,请记住这些注意事项。

在Feed或发布者中显示画布应用程序时,您收到的画布上下文(来自签名请求或来自getContext调用)包含特定于Salesforce应用程序发布者的信息。

  • 您可以通过查看环境部分中的displayLocation值来验证您是在Feed还是发布者上。对于发布者,displayLocation设置为Publisher。对于Feed,displayLocation设置为ChatterFeed。
  • 创建Canvas订阅源项时,可以将JSON字符串指定为参数的值。发送上下文时,feed项的参数字段中的任何值都将在上下文的environment部分的参数中发送。
  • 与任何画布应用程序一样,上下文包含有关应用程序维度的信息。由于Salesforce是专为移动设备设计的,因此我们为其提供的尺寸与我们为完整Salesforce网站提供的尺寸不同。
  • 要创建单指触摸滚动体验:
    1. 确保最外面的div元素包含以下属性。
      • 最小高度:250px;
      • 溢出:滚动;
      • 宽度:100%;
      • -webkit-overflow-scrolling:touch;
      • -webkit-transform:translated(0%,0px,0px);
    2. 将height属性设置为签名请求中提供的clientHeight值。例如:
      // Where sr is a parsed signed request object.
      var h = parseInt(sr.context.environment.dimensions.clientHeight, 10);
      Sfdc.canvas.byId(‘divElementId’).style.height = h;
    3. clientHeight值可能非常小,特别是在手机的横向模式下,用户可能无法看到任何内容。将min-height设置为所需的高度(以像素为单位),以确保良好的用户体验。
    4. 在导航菜单中,默认拼图图标大小为60像素乘60像素。

Salesforce App Access注意事项

修改Salesforce应用程序中显示的画布应用程序时,请记住这些注意事项。

必要时,Salesforce应用程序布局与您习惯使用的完整Salesforce站点布局不同。在创建用于Salesforce应用程序的画布应用程序时,请记住以下内容。

  • 由于画布应用程序旨在在Salesforce中显示第三方应用程序,因此设备必须能够访问画布应用程序URL。如果您的应用只能在防火墙后面访问,那么移动设备也必须位于防火墙后面。如果用户无权访问画布URL,则会收到错误 – 可能是404或500错误。
  • 当您将画布应用程序作为操作访问时,如果画布应用程序使用“您在做什么”标题,则标题将固定在页面顶部,并且画布应用程序滚动区域将位于标题文本框下方。
  • Feed中的画布应用程序链接和说明可能显示的字符数少于完整Salesforce站点中显示的字符数。
  • 根据您使用的设备,如果旋转设备,进纸屏幕可能会发生变化。如果可能,您的画布应用应支持旋转。使用orientation事件处理设备方向的更改。
  • Salesforce应用程序和完整Salesforce站点中使用的高度不同。使用签名请求中的Dimensions对象在发布者中正确呈现您的操作。
  • 在操作菜单中,可能会截断长动作标签。
  • Feed布局与完整Salesforce站点的布局不同。而不是在Feed中打开应用程序,将打开一个页面,在整个屏幕上显示画布应用程序。要返回Salesforce应用,请点按。
  • 当您查看操作栏或Feed时,将显示画布应用程序的默认Canvas拼图图标。您可以使用您提供的图像覆盖此默认操作图标。
  • 当画布应用程序在导航菜单中显示为选项时,将使用默认的Canvas拼图图标。您可以在画布应用程序的连接应用程序设置中自定义图标。
  • 当用户脱机访问Salesforce时,Canvas应用程序不可用。

Salesforce应用程序自定义图标

自定义图标有助于区分Salesforce应用中的应用。如果您没有自定义应用程序的图标,您将获得默认的拼图图标。

您可以自定义Salesforce导航菜单中使用的图标。您可以在画布应用程序的连接应用程序设置的“基本信息”部分的“图标URL”条目中设置此图标。在“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”并单击“编辑”以连接应用。图标URL必须是指向图标图像文件的安全HTTPS URL。图像文件必须是GIF,JPG或PNG文件格式。对于Salesforce导航菜单,图标不能大于60像素高,60像素宽。

Salesforce导航菜单中使用的自定义图标也用于Chatter选项卡和Canvas App Previewer。如果您的画布应用程序将显示在导航菜单中,我们建议您使用60×60像素大小的图标,让Salesforce自动将图标调整为Chatter选项卡和Canvas App Previewer所需的较小尺寸。

您还可以自定义画布应用程序的Salesforce操作栏和操作菜单中使用的图标。操作栏使用为访问画布应用程序的操作设置的自定义图标,而不是与连接的应用程序关联的自定义图标。您可以通过上载自定义图标的静态资源文件然后使用此静态资源作为全局操作的图标来设置操作图标。静态资源图标文件应为PNG格式,大小为120像素高,120像素宽。有关自定义操作图标的更多指南,请参阅“Salesforce App开发人员指南”中的“自定义图标指南和最佳实践”。

用于Canvas应用程序的Salesforce App导航方法

Canvas框架包含可用于在canvas应用程序和Salesforce应用程序之间平滑集成导航的方法,而无需使用Visualforce。

以前,绕过包含画布应用程序的iframe的导航限制的唯一方法是使用Visualforce页面。这些Canvas方法提供了一种更简单的替代方法,用于控制Salesforce应用程序中的画布应用程序的导航。

例如,您的画布应用程序代码可以调用Salesforce“创建记录”逻辑以导航到“Create Account”按钮所在的页面。单击该按钮会触发导航方法以转到创建页面,该页面位于画布应用程序之外。

Canvas框架中的这些方法是驻留在JavaScript库中的事件。从画布代码调用其中一种导航方法时,会向Salesforce发送一个事件,该事件将读取有效内容并将用户定向到指定的目标。

从画布应用程序调用方法与从Visualforce页面调用函数略有不同,因为这些方法通过Canvas跨域API代理到Salesforce容器。

将导航方法引用为具有名称和有效负载的事件变量。例如:

var event = {name:”s1.createRecord”, payload: {entityName: “Account”, recordTypeId: “00h300000001234”}};

下表显示了Salesforce中导航方法的名称,有效负载和用途。

FunctionDescription
back([refresh])导航到sforce.one历史记录中保存的先前状态。它相当于单击浏览器的“后退”按钮。
刷新是可选的。默认情况下,页面不刷新。如果可能,传递true以刷新页面。
navigateToSObject(recordId [, view])导航到由recordId指定的sObject记录。此记录“主页”有多个视图,Salesforce应用程序中的视图可用作用户可以在其间滑动的幻灯片。
view是可选的,默认为detail。 view指定记录主页中最初显示的幻灯片。
注意:不支持与ContentNote SObject对应的记录ID。可能的值如下。
•detail:记录详细信息幻灯片
•chatter:Chatter幻灯片
•related:相关幻灯片的视图
navigateToURL(url[, isredirect])导航到指定的URL。
支持相对和绝对URL。相对URL相对于Lightning域,并保留导航历史记录。外部URL – 即Lightning域外的URL – 在单独的浏览器窗口中打开。
注意:根据用户的设备平台,设备设置,Salesforce版本以及要打开的外部URL的身份验证要求,单独的浏览器窗口可能需要身份验证或重新身份验证。
使用相对网址导航到应用内的不同屏幕。使用外部URL允许用户访问其他站点或应用程序,他们可以在其中执行不需要在应用程序中保留的操作。要返回到您的应用,必须在用户完成其他应用时关闭由外部URL打开的单独窗口。新窗口与您的应用程序具有单独的历史记录,并且在关闭窗口时将丢弃此历史记录。这也意味着用户无法单击“后退”按钮返回到您的应用程序;用户必须关闭新窗口。
mailto:, tel:, geo:, 和其他URL方案支持启动外部应用程序并尝试“做正确的事情。”但是,支持因移动平台和设备而异。 mailto:和tel:是可靠的,但我们建议您测试一系列预期设备上的任何其他URL。
isredirect 是可选的,默认为false。将其设置为true以指示新URL应替换导航历史记录中的当前URL。
注意:在 <apex:commandButton>或任何 <button type=”submit”> or<input type=”submit”>的onClick处理程序中使用navigateToURL时要小心. 即使isredirect = true,命令按钮的默认单击操作也是表单帖子。 在此方案中,命令按钮执行表单发布和navigateToURL操作,要求用户单击后退按钮两次以导航到上一页。 要阻止默认单击操作,请将onClick处理程序配置为调用
event.preventDefault()或返回false。
注意:不支持与ContentNote SObject对应的URL。
navigateToFeed(subjectId, type)导航到指定类型的Feed,作用域为subjectId。对于某些Feed类型,subjectId是必需的但是被忽略。对于这些Feed类型,将当前用户的ID作为subjectId传递。
type是Feed类型。可能的值如下。
•BOOKMARKS:包含上下文用户保存为书签的所有Feed项。将当前用户的ID作为subjectId传递。
•COMPANY:包含除TrackedChange类型的Feed项目之外的所有Feed项目。要查看订阅源项,用户必须具有对其父项的共享访问权限。将当前用户的ID作为subjectId传递。
•文件:包含所有包含上下文用户遵循的人员或组发布的文件的源项目。将当前用户的ID作为subjectId传递。
•GROUPS:包含上下文用户拥有或属于其成员的所有组中的所有Feed项。将当前用户的ID作为subjectId传递。
•新闻:包含上下文用户遵循的所有更新,用户所属的组以及用户所关注的文件和记录。包含父级为上下文用户的记录的所有更新。包含提及上下文用户或提及上下文用户所属的组的每个提要项和注释。将当前用户的ID作为subjectId传递。
•PEOPLE:包含上下文用户遵循的所有人发布的所有Feed项。将当前用户的ID作为subjectId传递。
•RECORD:包含父级为指定记录的所有订阅源项,可以是组,用户,对象,文件或任何其他标准或自定义对象。当记录是一个组时,该提要还包含提及该组的提要项。当记录是用户时,该Feed仅包含该用户的Feed项。您可以获取其他用户的记录Feed。将记录的ID作为subjectId传递。
•TO:包含上下文用户提及的所有Feed项。包含上下文用户注释的订阅源项以及由评论的上下文用户创建的订阅源项。将当前用户的ID作为subjectId传递。
•TOPICS:包含包含指定主题的所有Feed项。将主题的ID作为subjectId传递。仅Salesforce for Mobile Web支持此值。 Salesforce for iOS或Salesforce for Android中不提供主题
navigateToFeedItemDetail( feedItemId)导航到特定的源项,feedItemId和任何关联的注释。
navigateToRelatedList( relatedListId, parentRecordId)导航到parentRecordId的相关列表。 例如,要显示Warehouse对象的相关列表,parentRecordId是Warehouse c.Id.
relatedListId是要显示的相关列表的API名称或ID。
navigateToList(listViewId
, listViewName, scope)
导航到listViewId指定的列表视图,该列表视图是要显示的列表视图的ID。
listViewName设置列表视图的标题。 它不需要匹配为列表视图保存的实际名称。 要使用保存的名称,请将listViewName设置为null。
将范围设置为视图中sObject的名称,例如“Account”或“MyObject c”。
createRecord(entityName[, recordTypeId][, defaultFieldValues])打开页面以为指定的entityName创建记录,例如“Account”或“MyObject c”。
recordTypeId是可选的,它指定创建的对象的记录类型。调用
createRecord而不提供recordTypeId可能会导致错误。
defaultFieldValues是可选的,如果提供,则预填充记录创建面板上的字段,包括面板上未显示的字段。 用户必须具有对具有预填充值的字段的创建访问权限。 保存期间由字段访问限制引起的错误不会显示错误消息。
editRecord(recordId)打开页面以编辑recordId指定的记录。

有关与Visualforce一起使用的导航方法的信息,请参阅Salesforce App Developer’s Guide。

画布开发(8)Chatter Feed中的Canvas应用程序

学习目标

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

  • Chatter Feed上下文注意事项
  • Chatter Feed Canvas应用访问注意事项

Canvas使您可以将画布应用程序公开为Feed项。该Feed为用户提供有关Salesforce内部发生的信息以及他们所关注的记录和组的信息。

开发人员可以在Feed中使用画布应用来:

  • 从发布者的画布应用程序或Chatter API发布到Chatter摘要。
  • 在Chatter摘要项目中显示画布应用程序。

创建画布应用程序Chatter订阅源项时,它包含缩略图图像,链接标题和说明。在Salesforce Classic中,当用户单击链接或说明时,画布应用会在Feed中打开。如果用户再次点击该链接,则内容会折叠,从而为用户提供在其Feed中工作的无缝体验。在Lightning Experience中,当用户单击链接或描述时,用户将被重定向到专用的画布应用页面。

例如,您可能有一个画布应用程序,允许用户记录他们的工作时间。您现在可以以编程方式创建一个显示画布应用程序的供稿项,该应用程序向用户显示当前记录的小时数。

此外,Feed项可以显示取决于当前用户的操作。因此,画布应用程序可以将供稿项目发布给用户的经理,经理可以批准或拒绝记录的小时数。由于内容是从canvas应用程序提供的,因此开发人员可以完全控制该行为。

Chatter Feed上下文注意事项

当您在Feed项目中显示画布应用程序时,您从签名请求或getContext()调用中收到的上下文信息包含特定于Feed的信息:

  • 位置 – 如果画布应用程序位于Feed中,则Environment.displayLocation字段包含该值ChatterFeed。
  • 参数 – 创建包含画布应用程序的订阅源项时,可以指定JSON字符串作为参数值。当canvas应用程序接收上下文时,feed项中的参数将包含在Environment.Parameters对象中。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度默认为100像素。
    2. 画布应用程序宽度默认为420像素,这与Feed中画布应用程序的最大宽度相同。
    3. Feed中画布应用的最大高度为400像素。
    4. Feed中画布应用的最大宽度为420像素。
    5. 此代码段显示Feed中画布应用的默认大小值:
      “dimensions”:
      {
      “width”: “420px”,
      “height”: “100px”, “maxHeight”: “400px”, “maxWidth”: “420px”
      }
    6. Feed的固定宽度为420像素。例如,如果将画布应用的大小调整为200像素,则Feed宽度仍为420像素。
    7. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Chatter Feed Canvas应用访问注意事项

修改Feed中显示的画布应用时,请记住以下注意事项:

  • 如果删除了画布应用程序且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,则会收到canvas应用程序不存在的错误。
  • 如果删除用户对画布应用程序的访问权限且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,他们将收到一条错误消息,表明他们无权访问画布应用。
  • 通过发布者操作或Chatter API创建画布应用程序源项时,Salesforce会检查画布应用程序是否存在以及用户是否具有该权限。
    1. 如果画布应用程序不存在,则无法创建订阅源项并返回错误。
    2. 如果画布应用程序存在,但尝试创建订阅源项的用户无权访问画布应用程序,则会创建订阅源项。但是,用户将无法查看订阅源项并返回错误。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。然后,画布应用程序应将错误转发给用户。

画布开发(7)Publisher中的Canvas应用程序

学习目标

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

  • 设置Canvas应用程序位置并创建操作
  • 手动创建操作
  • Canvas SDK Publisher事件
  • 发布者上下文注意事项
  • Publisher Canvas App Access注意事项

Canvas使您可以将画布应用程序公开为快速操作。 发布者允许用户访问组织中最常见的操作。 您可以将发布者扩展为包含画布应用程序,以便用户可以利用画布应用程序的常见自定义操作。 然后,这些操作可以与Feed集成,并创建特定于已执行操作的Feed帖子。

开发人员可以使用发布商中的画布应用来:

  • 将Web应用程序中的内容添加到Chatter发布者中。
  • 创建一个公开画布应用程序的自定义操作。
  • 将画布应用程序直接集成到发布者生命周期中:从画布应用程序发布到Chatter摘要中,使用“共享”按钮功能,并指定发布消息的位置。

例如,您可能拥有一个用户用来记录工作时间的画布应用程序。 您可以创建一个快速操作,允许用户在发布者中打开该画布应用程序,以便他们可以在发布者中快速提交时间记录。

用户仍然可以以标准方式访问画布应用程序以获得完整功能; 但是,发布者中的画布应用程序可以快速访问应用程序的最常见功能。 用户可以选择快速操作并创建Chatter订阅源项,该项可以是文本帖子,链接帖子,甚至是画布帖子。

设置Canvas应用程序位置并创建操作

要将画布应用程序添加到发布者或操作栏,您必须设置位置并在创建画布应用程序时创建操作。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击New。填写画布应用的基本字段。请参阅创建画布应用程序。
  3. 在Canvas App设置中,选择Canvas,然后在Locations字段中选择Publisher。您必须为画布应用选择此位置,以使其显示在完整Salesforce站点中的发布者和Salesforce应用程序的操作栏中。
  4. 选择“自动创建操作”字段。这为画布应用程序创建了一个快速操作。
  5. 隐藏发布商标题,其中包含“您在做什么?”文本,选择隐藏Publisher标题。这会在完整的Salesforce站点和Salesforce应用程序中隐藏标题。
  6. 要在完整Salesforce站点和Salesforce应用程序中隐藏用户的发布者“共享”按钮,请选择“隐藏发布者共享按钮”。仅当选择了“隐藏发布者标题”时,才会启用此复选框。

要使画布应用程序显示为操作,您必须将操作添加到全局发布者布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

手动创建操作

如果在创建画布应用程序时未选择“自动创建操作”字段,则需要手动创建操作。

  1. 从“设置”中,在“快速查找”框中输入“Actions”,然后选择“Global Actions”
  2. 单击“New Action”。
  3. 在“操作类型”字段中,选择“自定义画布”。
  4. 在“画布应用程序”字段中,选择要作为操作显示的画布应用程序。只有具有Publisher位置的画布应用才会显示在此字段中。
  5. 在“高度”字段中,输入画布应用程序的高度(以像素为单位)。
    这是画布应用在出版商中出现时的初始高度。您可以使用Canvas SDK resize()方法将高度更改为最大500像素。
  6. 在“标签”字段中,输入一个值。
    此值在用户界面中显示为快速操作标题。
  7. 在“名称”字段中,输入不带空格的唯一值。
  8. 或者,在“图标”字段中,您可以通过单击“ Change Icon”上载图标。您必须先将图标作为静态资源上传,然后才能在此处进行更改。
  9. 单击“Save”。

要使画布应用程序显示为快速操作,您必须将操作添加到全局布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

Canvas SDK Publisher事件

在发布者中公开画布应用程序时,可以使用定义良好的事件来启用画布应用程序和发布者之间的通信。

您的画布应用程序可以订阅和发布这些事件,以便与发布者框架更紧密地集成。例如,您可以激活标准Chatter共享按钮以发布Chatter摘要项。您还可以访问用户在“您在做什么”中输入的帖子文本?发布商中的字段,并将其与您应用中的内容相结合。

FieldDescription
publisher.clearPanelState在停用或隐藏画布应用程序时由发布者触发。当用户在发布者中选择其他应用程序或单击“共享”按钮后,可能会发生这种情况。 Visualforce页面也可以侦听此事件。
publisher.failure遇到错误情况时由发布者触发,例如提交无效数据时。例如:
•Feed中的文字太长
•您尝试发布到Feed的画布应用程序不存在
•画布应用程序URL无效
画布应用程序应该侦听此事件并提醒用户发生了错误并且未创建帖子。
publisher.getPayload单击“共享”按钮时由发布者触发。有效负载包含诸如输入到您正在使用的内容中的文本等信息。字段以及与之共享订阅源项的人员。
publisher.setupPanel最初加载Chatter摘要页时由发布者触发。
publisher.setPayload由画布应用程序触发,以向发布者表明发送给发布者的内容应该在订阅源项目中共享。此事件是对publisher.getPayload的响应,包含有关您尝试创建的Feed项的信息。您可以创建三种Feed项类型:
•TextPost
•LinkPost
•CanvasPost
publisher.setValidForSubmit由画布应用程序触发,向发布者表明画布应用程序已准备好提交有效负载。触发此事件后,“共享”按钮将变为活动状态。
此代码段启用“共享”按钮:
$$.client.publish(sr.client,
{name : ‘publisher.setValidForSubmit’, payload : true});
publisher.showPanel当用户在发布者中选择画布应用时,由发布者触发。此事件表示正在显示画布应用程序。 Visualforce页面也可以侦听此事件。
publisher.success单击“共享”按钮并成功提交数据后,由发布者触发。

发布者事件的顺序

以下是从画布应用程序角度看发布者事件的顺序:

  1. 画布应用程序侦听pu​​blisher.setupPanel。
  2. 画布应用程序侦听pu​​blisher.showPanel。
  3. 用户与画布应用程序交互,例如,单击按钮或输入一些文本。 canvas应用程序执行所需的任何验证,然后触发publisher.setValidForSubmit。结果,发布者然后启用“共享”按钮。
  4. 画布应用程序侦听pu​​blisher.getPayload。
  5. canvas应用程序触发publisher.setPayload。
  6. 画布应用程序侦听pu​​blisher.success。
  7. canvas应用程序侦听pu​​blisher.failure。
  8. 画布应用程序侦听pu​​blisher.clearPanelState。

发布者上下文注意事项

当您在发布者中显示画布应用程序时,您从签名请求或从
getContext()调用包含特定于发布者的信息:

  • Location – 如果画布应用程序位于发布者中,则Environment.displayLocation字段包含值Publisher。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度将是您在创建的快速操作中指定的高度。
    2. 如果在创建画布应用程序时选择了“自动创建操作”,则画布应用程序高度默认为200像素。
    3. 画布应用程序宽度默认为521像素,这与发布者中画布应用程序的最大宽度相同。
    4. 发布者中画布应用的最大高度为500像素。
    5. 发布者中画布应用的最大宽度为521像素。
    6. 此代码段显示发布商中画布应用的默认大小值:
      “dimensions”:{“width”:“521px”,“height”:“200px”,“maxHeight”:“500px”,“maxWidth”:“521px”}
    7. 发布商的固定宽度为521像素。例如,如果将画布应用程序的大小调整为400像素,则发布者宽度仍为521像素。
    8. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Publisher Canvas App Access注意事项

修改发布者中显示的画布应用时,请记住以下注意事项:

  • 如果画布应用程序具有与之关联的快速操作,则无法删除画布应用程序或删除Publisher位置。 您必须先删除快速操作。
  • 如果用户无法通过配置文件或权限集访问画布应用程序,并且他们在发布者中选择了应用程序,则会收到错误消息。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。 例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。 然后,画布应用程序应将错误转发给用户。

画布开发(6)页面布局或移动卡中的画布应用程序

学习目标

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

  • Canvas应用程序出现在页面布局中的位置
  • 将Canvas应用程序添加到页面布局

您可以将画布应用程序添加到任何标准或自定义对象的页面布局。 要在编辑页面布局时显示在选项板中的“画布应用程序”类别,必须在Salesforce应用程序中创建画布应用程序时将画布应用程序位置设置为“布局”和“移动卡”。

Canvas应用程序出现在页面布局中的位置

根据您将画布应用程序放置在页面布局上的位置,画布应用程序可能会显示在完整的Salesforce站点或Salesforce应用程序中。

此表描述了将画布应用程序添加到页面布局时显示的位置。

如果画布应用程序已添加到页面布局中…画布应用程序是否出现在完整的Salesforce站点中?画布应用程序出现在Salesforce应用程序中?画布应用程序出现在Salesforce应用程序中的位置
任何部分(移动卡部分除外)YesYesRecord detail page
Mobile Cards sectionNoYesMobile card

将Canvas应用程序添加到页面布局

按照以下步骤将画布应用程序添加到帐户的页面布局中。

  1. 按照创建应用程序中的步骤,使用Heroku快速入门创建画布应用程序。
  2. 在Salesforce应用程序中,从“设置”中,在“快速查找”框中输入应用程序,然后选择“Apps”。
  3. 在“Connected Apps”相关列表中,单击刚刚创建的应用程序旁边的“Edit ”。
  4. 在“Canvas应用程序设置”部分的“位置”字段中,选择“布局”和“移动卡”。
  5. 单击“Save”。
  6. 从帐户的对象管理设置中,转到“页面布局”。
  7. 单击“帐户布局”旁边的“Edit”
    您将在调色板和画布应用程序中看到Canvas应用程序类别,因为您将画布应用程序的位置设置为布局和移动卡。
  8. 将画布应用程序元素拖动到页面布局中显示的位置,然后单击“ Save”。
    • 如果将画布应用程序添加到“移动卡”部分以外的任何部分,则画布应用程序将显示在完整Salesforce站点的页面布局中或Salesforce应用程序的记录详细信息页面中。
    • 如果将画布应用程序添加到“移动卡”部分,则画布应用程序仅显示在移动卡中。
  9. 要查看更改,请单击“Accounts ”选项卡,然后单击一个帐户。您将在页面布局上看到添加它的画布应用程序。

您可以通过单击扳手图标来修改页面布局中画布应用的其他属性。

  • Width (in pixels or %) – 画布应用程序的宽度;默认为100%。对画布应用程序宽度的更改将显示在完整的Salesforce站点和Salesforce应用程序中。但是,画布应用程序以单列布局显示,因此我们建议您将宽度保留为100%。
  • Height (in pixels) – 画布应用的高度;默认为200像素。对于出现在完整Salesforce站点和Salesforce应用程序中的画布应用程序,用户将看到对此字段的更改。
  • Show scrollbars – 滚动条是否显示在画布应用程序iFrame上。对此字段的更改将呈现出现在完整Salesforce站点中的画布应用,但不会显示出现在Salesforce应用中的画布应用。
  • Show label – 是否显示页面布局部分标签。对于出现在完整Salesforce站点和Salesforce应用程序中的画布应用程序,用户将看到对此字段的更改。

画布开发(5)Canvas SDK

学习目标

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

  • Visualforce页面代码示例
  • Visualforce注意事项
  • apex:canvasApp组件
  • 在Visualforce页面和Canvas应用程序之间使用事件

除了标准的画布应用程序,Canvas还允许您在Visualforce页面上公开画布应用程序。 这意味着您可以在任何可以显示Visualforce页面的地方显示画布应用程序。

开发人员可以使用Visualforce页面:

  • 覆盖标准按钮,例如帐户的“新建”按钮或联系人的“保存”按钮
  • 覆盖选项卡概述页面,例如“帐户”选项卡主页
  • 定义自定义选项卡
  • 在详细的页面布局中嵌入组件
  • 创建仪表板组件或自定义帮助页面
  • 自定义,扩展或集成Salesforce控制台中的侧边栏(自定义控制台组件)

要在Visualforce页面上托管画布应用程序,请使用 <apex:canvasApp> 组件。

注意:Canvas框架包含的方法可用于规避包含画布应用程序的iframe的导航限制,而无需使用Visualforce页面。这些方法提供了一种简化的替代方法,用于控制Salesforce应用程序中的画布应用程序的导航。有关详细信息,请参阅第75页的“与Canvas应用程序一起使用的Salesforce App导航方法”。

Visualforce页面代码示例

您可以通过多种方式在Visualforce页面上显示画布应用程序。这些示例显示了使用applicationName,developerName和namespacePrefix引用canvas应用程序的不同方法。

对象细节页面

以下代码段是如何在“帐户”页面上显示画布应用程序的示例。该代码指定画布应用程序的大小为400像素高和750像素宽。此示例使用applicationName和namespacePrefix指定画布应用程序。

<apex:page standardController=”Account”>
<apex:canvasApp applicationName=”Test Inline Visualforce” namespacePrefix=”testorg”
height=”400px” width=”750px”/>
</apex:page>

Standard Page

以下代码段是如何在Visualforce页面上显示画布应用程序的示例。该代码指定画布应用程序的大小为1,000像素高和800像素宽。此外,代码将三个自定义参数传递给画布应用程序。此示例使用developerName和namespacePrefix指定canvas应用程序。

<apex:page>
<apex:canvasApp developerName=”Test_Standard_Visualforce” namespacePrefix=”testorg” height=”1000px” width=”800px” parameters=”{p1:’value1′,p2:’value2′,p3:’value3′}”/>
</apex:page>

带边框和滚动的标准页面

以下代码段是如何在Visualforce页面上显示具有一些其他UI增强功能的画布应用程序的示例。该代码指定画布应用程序的大小为100像素高和500像素宽。此外,代码指定画布应用程序周围应该有2个像素的边框,并且应该启用滚动。此示例仅使用applicationName指定画布应用程序(这仅在创建画布应用程序的组织中有效,并且该组织没有namespacePrefix。

<apex:page>
<apex:canvasApp applicationName=”Test Scrolling Visualforce” height=”100px” width=”500px”
border=”2″ scrolling=”yes”/>
</apex:page>

Visualforce注意事项

使用 <apex:canvasApp> component:组件时,请记住以下注意事项:

  • <apex:canvasApp> 组件仅在启用了Canvas且在版本为27.0或更高版本的Visualforce页面中可用。
  • 如果在对象详细信息布局上包含画布应用程序,则必须在页面布局中以及 <apex:canvasApp>组件中提供画布应用程序的高度。
  • Location—如果画布应用程序位于Visualforce页面中,则Environment.displayLocation字段包含该值Visualforce

apex:canvasApp Component

Use this component to display a canvas app on a Visualforce page. The table below lists the component attributes.

使用此组件在Visualforce页面上显示画布应用程序。下表列出了组件属性。
将包含非字母数字字符(如引号,撇号等)的参数作为JavaScript安全对象传递。为此,编写一个Apex类,该类使用Apex JSONGenerator类的方法来构建JSON字符串。从参数值调用Apex类:

<apex:page controller=”JSONGeneratorSample”>
<apex:canvasApp developerName=”mycanvas” parameters=”{!generateJSON}” />
</apex:page>

或者,您也可以使用JSENCODE函数来转义字符串:

<apex:page standardController=”Account”>
<apex:canvasApp developerName=”mycanvas” parameters=”{!JSENCODE(Account.Description)}”/>
</apex:page>

AttributeTypeDescription
applicationNameString画布应用程序的名称。 applicationName或
developerName是必需的。
borderString画布应用程序边框的宽度(以像素为单位)。如果未指定,则默认为0像素。
canvasIdString画布应用程序窗口的唯一ID。将事件定位到画布应用程序时使用此属性。
containerIdString呈现画布应用程序的HTML元素的ID。如果未指定,则默认为null。此属性指定的容器不能出现在 <apex:canvasApp> 组件之后。这些代码示例显示了 <div> 容器和containerId属性的有效用法:
<apex:page>
<div id=”container1″></div>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
</apex:page>
<apex:page>
<div id=”container1″>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
</div>
</apex:page>
此代码示例显示 <div>容器和containerId属性的无效用法:
<apex:page>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
<div id=”container1″>
</div>
</apex:page>
developerNameString画布应用程序的内部名称。 通过创建连接的应用程序公开画布应用程序时,可以在“API名称”字段中指定此值。 developerName或applicationName都是必需的。
entityFieldsString当组件出现在放置在对象上的Visualforce页面上时,指定签名请求Record对象中返回的字段。 如果未指定此属性或为空,则仅返回Id字段。 有效的属性值包括:
•以逗号分隔的字段名称列表。 例如,要返回“帐户电话”和“传真”字段,该属性将如下所示:entityFields =“Phone,Fax”
•星号“*”返回关联对象的所有字段。
heightStringCanvas应用程序窗口高度,以像素为单位。 如果未指定,则默认为900像素。
idString允许<apex:canvasApp>的唯一标识符
要由页面上的其他组件引用的组件。
maxHeightStringCanvas应用程序窗口的最大高度(以像素为单位)。默认为2000 px; ‘无限’也是一个有效的值。
maxWidthStringCanvas应用程序窗口的最大宽度(以像素为单位)。默认为1000 px; ‘无限’也是一个有效的值。
namespacePrefixString创建画布应用程序的Developer Edition组织的名称空间值。您只能在Developer Edition组织中设置命名空间,因此如果画布应用程序是在不同类型的组织中创建的,则这是可选的。如果未指定,则默认为null。
onCanvasAppErrorString如果画布应用程序无法呈现,则要调用的JavaScript函数的名称。
onCanvasAppLoadString加载画布应用程序后要调用的JavaScript函数的名称。
parametersString传递给画布应用程序的参数的对象表示。 以JSON格式或JavaScript对象文字提供。 以下是JavaScript对象文字中的参数示例:
{参数1:’VALUE1’,参数2: ‘值2’}。 如果未指定,则默认为null。
renderedBoolean指定是否在页面上呈现组件。 如果未指定,则默认为true。
scrollingString指定画布应用程序窗口是否使用滚动条。 有效值为:
auto
no
yes
如果未指定,则默认为no。 如果此属性包含无效值,则将其视为“否”以防止浏览器错误。
widthStringCanvas应用程序窗口宽度,以像素为单位。 如果未指定,则默认为800像素。

返回记录对象中的字段

当您使用 <apex:canvasApp> 组件在Visualforce页面上显示画布应用程序,并且该页面与对象关联(例如放置在页面布局上)时,您可以指定要从相关对象返回的字段。为此,请使用entityFields属性。您可以通过以下方式之一使用此属性。

返回特定对象字段

通过将entityFields属性设置为以逗号分隔的字段名称列表,可以返回Record对象中的特定对象字段。如果列表中的字段名称无效,则忽略该字段名称,并在Record对象中返回有效字段。

<apex:canvasApp applicationName=”MyApp” entityFields=”Phone,Fax,BillingCity” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”, “Phone”:”(555) 555-5555″,
“Fax”:”(555) 555-5555″,
“BillingCity”:”Seattle”
}

返回所有对象字段

您可以通过将entityFields属性设置为通配符“*”来返回Record对象中的所有对象字段。

<apex:canvasApp applicationName=”MyApp” entityFields=”*” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”,
“IsDeleted”:false, “MasterRecordId”:null, “Name”:”Edge Communications”, “Type”:”Customer – Channel”, “ParentId”:null, “BillingStreet”:”123 Main Street”, “BillingCity”:”Seattle”, “BillingState”:”WA”, “BillingPostalCode”:”98121″, “BillingCountry”:”USA”,

}

返回Id字段

如果<apex:canvasApp> 组件没有entityFields属性,或者该属性为空,则只在Record对象中返回Id字段。

<apex:canvasApp applicationName=”MyApp” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”
}

在Visualforce页面和Canvas应用程序之间使用事件

Canvas提供了一些方法,可用于在画布应用程序和父Visualforce页面之间发布和订阅事件。此过程包括从Visualforce页面发布事件,在Visualforce页面上侦听事件,从Visualforce页面上的事件取消订阅以及调整包含画布应用程序的Visualforce页面的大小。调整画布应用程序大小的过程与画布应用程序自身调整大小的过程不同,这在“调整画布应用程序大小”中有所描述。可以在SDK和此处找到这些方法的完整参考文档。

  • publish – 从画布应用程序可以订阅的Visualforce页面发布事件。请参阅从Visualforce页面发布Canvas事件。
  • resize – 由Visualforce页面用于调整画布应用程序iFrame的大小。请参阅在Visualforce页面中调整画布应用程序的大小。
  • subscribe – 由Visualforce页面用于订阅画布应用程序可能发布的事件。请参阅订阅事件。
  • unsubscribe – 由Visualforce页面用于取消订阅画布应用程序可能发布的父事件。请参阅从Visualforce页面中的事件取消订阅。

Visualforce页面需要Controller.js对象才能使用这些方法。 Visualforce页面中的脚本可能如下所示:

<script type=”text/javascript”src=”https://yourDomain.my.salesforce.com/canvas/sdk/js/30.0/controller.js”>

注意:您可以使用Lightning Platform方法在画布应用程序和Salesforce应用程序之间平滑地集成导航,而无需使用Visualforce。这些方法是驻留在Canvas框架内的JavaScript库中的事件。从画布代码调用其中一种导航方法时,会向Salesforce发送一个事件,该事件将读取有效内容并将用户定向到指定的目标。有关更多信息,请参阅“与Canvas应用程序一起使用的Salesforce App导航方法”。

从Visualforce页面发布Canvas事件

以下代码示例演示如何调用publish方法以从Visualforce页面发布myevent事件。订阅此活动的任何画布应用程序都将收到该活动。

// Target all canvas apps.
Sfdc.canvas.controller.publish({name : ‘mynamespace.myevent’,
payload : {}});

以下代码示例演示如何调用publish方法以从Visualforce页面将事件发布到指定的画布应用程序。

如果将事件发布到特定画布应用程序,即使Visualforce页面上的其他画布应用程序订阅了它,也只有指定的画布应用程序才会收到该事件。使用此代码示例,如果Visualforce页面包含画布应用程序app1,app2和app3,并且它们都订阅了myevent,则只有app1会收到该事件。

// Target a specific canvas app
// where “app1” is the canvasId specified in the canvas component.
// For example:
Sfdc.canvas.controller.publish({name : ‘mynamespace.myevent’,
payload : {},
target : {canvas : ‘app1’}});

在target参数中,您可以通过传入一组画布应用程序来指定多个画布应用程序:target:[{canvas:’app1′},{canvas:’app2′}]。

在Visualforce页面中调整Canvas应用程序的大小

以下代码示例演示如何调用resize方法以在Visualforce页面中的特定画布应用程序上显式设置高度和宽度。

// Set the height and width explicitly and target a canvas app
// Where ‘mycanvas0’ is the canvasId on the canvas component
// <apex:canvasApp canvasId=”mycanvas0″/>
var target = {canvas : “mycanvas0”};
Sfdc.canvas.controller.resize( {height : “1000px”, width : “900px”}, target);

下面的代码示例演示如何调用resize方法来设置Visualforce页面中所有画布应用程序的高度。

//Set only the height on all canvas apps
Sfdc.canvas.controller.resize( {height : “1000px”});

订阅活动

以下代码示例演示如何在Visualforce页面中调用subscribe方法以订阅从画布应用程序发布的指定事件。

// Subscribe to a single event.
Sfdc.canvas.controller.subscribe({name : ‘mynamespace.myevent0’,
onData : function (e) {}});
// Subscribe to multiple events in a single call.
Sfdc.canvas.controller.subscribe([
{name : ‘mynamespace.myevent1’, onData : function(e) {}},
{name : ‘mynamespace.myevent2’, onData : function(e) {}}
]);

取消订阅Visualforce中的事件

以下代码示例演示如何在Visualforce页面中调用unsubscribe方法以取消订阅两个事件。

画布开发(4)Canvas SDK

学习目标

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

  • 引用Canvas SDK
  • 验证
  • 在您的画布应用程序中获取上下文
  • 跨域XHR
  • 调整画布应用程序的大小
  • 实施Canvas应用程序事件
  • 在Canvas应用程序中使用Streaming API
  • 在Canvas应用程序中进行调试
  • 在Canvas App中使用标签

Canvas是一组工具,使您可以在Salesforce中集成您的应用程序。 此框架包含一个SDK,您可以使用该SDK对应用程序进行身份验证并从Salesforce检索数据。 Canvas SDK和代码示例可在GitHub上获得,网址为https://github.com/forcedotcom/salesforcecanvasframeworksdk。

Canvas SDK已经过版本化,并且与每个版本中的API版本相匹配。 目前的版本是44.0。
您可以通过调用version方法找到您拥有的SDK版本。 可以在以下位置找到此开发人员指南的早期版本
https://developer.salesforce.com/page/Earlier_Reference_Documentation。

引用Canvas SDK

Canvas SDK可以在GitHub上使用,您可以通过两个选项从画布应用程序中引用它。

  • 在您自己的Web服务器上托管SDK并在那里访问它
  • 访问Salesforce服务器上托管的SDK

例如,如果您在自己的Web服务器上托管SDK,那么这就是include语句的样子:

以下是引用托管SDK时include语句的外观:

如果要在Web应用程序或Visualforce页面中包含其中一个SDK文件,则在Salesforce服务器上引用SDK的功能非常有用。

Authentication

创建画布应用程序时,可以使用以下身份验证方法之一:

  • 签名请求 – 画布应用程序的默认身份验证方法。签名请求授权流程取决于您是否配置画布应用程序,以便管理员为用户提供对画布应用程序的访问权限,或者用户是否可以自行授权。如果管理员允许用户访问画布应用程序,或者用户通过批准/拒绝OAuth流程批准了画布应用程序,则会向画布应用程序提供包含使用者密钥,访问令牌和其他上下文信息的签名请求。 。
  • OAuth 2.0-Canvas应用程序可以使用OAuth 2.0协议来验证和获取访问令牌。有关OAuth和Lightning平台的更多信息,请参阅在Salesforce中深入挖掘OAuth 2.0。

签名请求身份验证

This is the default authorization method for canvas apps. The signed request authorization flow varies depending on whether the canvas app’s Permitted Users field is set to “Admin approved users are pre-authorized” or “All users may self-authorize.”

Permitted Users ValueCanvas App Accessibility当用户需要批准画布应用程序时POST or GET Behavior
管理员批准的用户已获得预授权一旦管理员在组织中安装该应用程序并配置哪些用户可以看到该应用程序,该应用程序就可供用户访问。用户无需批准或拒绝访问。NeverSalesforce对画布应用程序执行POST,其中包含签名请求正文中包含的所有授权信息,包括刷新令牌。
所有用户都可以自我授权所有用户都可以访问该应用,但会提示用户批准或拒绝访问该应用。• 用户第一次打开应用程序
• 如果管理员撤消了访问令牌
• 如果管理员为令牌设置了时间限制并且超出了时间限制
如果用户之前已批准该应用程序并且访问权限尚未被撤销或过期,则Salesforce会使用已签名的请求有效内容对画布应用程序执行POST。
如果用户尚未批准该应用程序,或者该访问权限已被撤销或过期,则Salesforce会对画布应用程序URL执行GET。画布应用程序必须通过接受调用并查找URL参数来处理GET
_sfdc_canvas_authvalue。如果画布应用程序收到此参数值,则画布应用程序应启动批准或拒绝OAuth流程。
_sfdc_canvas_authvalue = user_approval_required
启动OAuth流并且用户批准应用程序后,画布应用程序应使用参数true调用repost()方法以检索已签名的请求。

签名的请求信息可以使用客户端密钥进行验证,并用于自定义应用程序,并随后调用Salesforce。

签名请求是以下连接的元素的字符串:

  • 使用HMAC SHA-256算法加密的画布应用程序使用者密钥
  • A period (”。”)
  • Base64中编码的上下文和授权令牌JSON

签名的请求看起来与此类似,但会更长:

9Rpl6rE7R2bSNjoSfYdERk8nffmgtKQNhr5U/5eSJPI=.eyJjb250ZXh0Ijp7InVzZXIiOnsibGFuZ3V…. 签名请求注意事项:

  • Salesforce在调用画布应用程序URL时执行HTTP POST或GET,具体取决于“允许的用户”值以及是否返回刷新令牌。
  • 需要服务器端代码来验证和解码请求。
  • 您可以在调用应用程序后,使用SDK按需请求已签名的请求。

Canvas App用户流程签名请求

此图显示了使用签名请求身份验证的画布应用程序的用户流。

验证和解码签名请求

使用签名请求时,Salesforce会将用户上下文和身份验证信息传递到画布应用程序URL。要确保签名的请求有效,您必须使用特定的画布应用程序使用者密钥验证签名的请求是否已签名。如果使用了正确的消费者秘密,那么您可以信任上下文;否则,您可以假设该请求不是由Salesforce发起的。要验证和解码已签名的请求,您的应用程序应:

1.接收包含Salesforce初始签名请求的POST消息。
2.在第一个期间拆分已签名的请求。结果是两个字符串:使用使用者机密签名的散列的Based64上下文和Base64编码的上下文本身。
3.使用HMAC SHA-256算法对Base64编码的上下文进行哈希处理,并使用您的使用者密钥对其进行签名。

  1. 接收包含Salesforce初始签名请求的POST消息。
  2. 在第一个期间拆分已签名的请求。结果是两个字符串:使用使用者机密签名的散列的Based64上下文和Base64编码的上下文本身。
  3. 使用HMAC SHA-256算法对Base64编码的上下文进行哈希处理,并使用您的使用者密钥对其进行签名。
  4. Base64编码在上一步中创建的字符串。
  5. 将Base64编码的字符串与使用您在步骤2中收到的使用者密钥签名的散列Base64上下文进行比较。

如果这两个值相同,那么您就知道已签名的请求是使用您的使用者密钥签名的,并且可以信任。从那里,您可以Base64解码编码的上下文并解析出您需要的任何值。有关这些值的更多信息,请参阅CanvasRequest。如果两个字符串不同,则请求未使用您的使用者密钥进行散列和签名,您应该将相应的消息返回给用户。

验证和解码的功能

要验证已签名的请求,您可以调用Canvas SDK中的以下函数(在
SalesforceCanvasFrameworkSDK的\ src \主\ java的\帆布\ SignedRequest.java):

  • verifyAndDecode – 将已签名请求的已验证和已解码版本作为Java对象返回。
  • verifyAndDecodeAsJson – 将已签名请求的经过验证和解码的版本作为JSON格式的字符串返回。

以下代码示例演示如何使用SDK中的函数验证和解码签名请求。此代码在此期间拆分签名的请求字符串,以解析签名的秘密和Base64 JSON字符串。然后,它会加密使用HMAC SHA-256算法签名的画布应用程序使用者密钥,并将加密值与Salesforce发送给您的加密值进行比较。

如果这两个值相同,则表示上下文有效且来自Salesforce。如果这两个值不同,则请求不是来自Salesforce。

/**
*The utility method can be used to validate/verify the signed request.
*In this case, the signed request is verified that it’s from Salesforce and that
*it has not been tampered with.
*This utility class has two methods. One verifies and decodes the request
*as a Java object, the other as a JSON String.
*/
public class SignedRequest {
public static CanvasRequest verifyAndDecode(String input, String secret)
throws SecurityException {
String[] split = getParts(input);
String encodedSig = split[0];
String encodedEnvelope = split[1];
// Deserialize the JSON body.
String json_envelope = new String(new Base64(true).decode(encodedEnvelope));
ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader(CanvasRequest.class);
CanvasRequest canvasRequest;
String algorithm;
try {
canvasRequest = reader.readValue(json_envelope); algorithm = canvasRequest.getAlgorithm() == null ?
“HMACSHA256” : canvasRequest.getAlgorithm();
} catch (IOException e) {
throw new SecurityException(String.format(“Error [%s] deserializing JSON to Object [%s]”, e.getMessage(), CanvasRequest.class.getName()), e);
}
verify(secret, algorithm, encodedEnvelope, encodedSig);
// If we got this far, then the request was not tampered with.
// Return the request as a Java object.
return canvasRequest;
}
public static String verifyAndDecodeAsJson(String input, String secret) throws SecurityException {
String[] split = getParts(input);
String encodedSig = split[0];
String encodedEnvelope = split[1];
String json_envelope = new String(new Base64(true).decode(encodedEnvelope));
ObjectMapper mapper = new ObjectMapper();
String algorithm; StringWriter writer;
TypeReference<HashMap<String,Object>> typeRef
= new TypeReference<HashMap<String, Object>>() { };
try {
HashMap<String,Object> o = mapper.readValue(json_envelope, typeRef);
writer = new StringWriter();
mapper.writeValue(writer, o);
algorithm = (String)o.get(“algorithm”);
} catch (IOException e) {
throw new SecurityException(String.format(“Error [%s] deserializing JSON to Object [%s]”, e.getMessage(),
typeRef.getClass().getName()), e);
}
verify(secret, algorithm, encodedEnvelope, encodedSig);
// If we got this far, then the request was not tampered with.
// Return the request as a JSON string.
return writer.toString();
}
private static String[] getParts(String input) {
if (input == null || input.indexOf(“.”) <= 0) {
throw new SecurityException(String.format(“Input [%s] doesn’t look like a signed request”, input));
}
String[] split = input.split(“[.]”, 2); return split;
}
private static void verify(String secret, String algorithm, String encodedEnvelope, String encodedSig )
throws SecurityException
{
if (secret == null || secret.trim().length() == 0) {
throw new IllegalArgumentException(“secret is null, did you set your environment variable CANVAS_CONSUMER_SECRET?”);
}
SecretKey hmacKey = null;
try {
byte[] key = secret.getBytes();
hmacKey = new SecretKeySpec(key, algorithm);
Mac mac = Mac.getInstance(algorithm); mac.init(hmacKey);
// Check to see if the body was tampered with.
byte[] digest = mac.doFinal(encodedEnvelope.getBytes());
byte[] decode_sig = new Base64(true).decode(encodedSig);
if (! Arrays.equals(digest, decode_sig)) {
String label = “Warning: Request was tampered with”; throw new SecurityException(label);
}
} catch (NoSuchAlgorithmException e) {
throw new SecurityException(String.format(“Problem with algorithm [%s] Error [%s]”, algorithm, e.getMessage()), e);
} catch (InvalidKeyException e) {
throw new SecurityException(String.format(“Problem with key [%s] Error [%s]”, hmacKey, e.getMessage()), e);
}
// If we got here and didn’t throw a SecurityException then all is good.
}
}

调用verifyAndDecode函数

以下代码显示了获取签名请求,然后使用verifyAndDecode函数验证和解码请求的示例。

// From a JSP or servlet.
<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify/decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This app must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”); String signedRequest = SignedRequest.verifyAndDecode(signedRequest[0],
yourConsumerSecret);
%>

// From JavaScript, you can handle the signed request as needed. var signedRequest = ‘<%=signedRequestJson%>’;

调用verifyAndDecodeAsJson函数

以下代码显示了获取签名请求,使用verifyAndDecodeAsJson函数验证和解码请求以及解析返回的JSON结果的示例。

// From a JSP or servlet.
<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify/decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This App must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”);
String signedRequestJson = SignedRequest.verifyAndDecodeAsJson(signedRequest[0], yourConsumerSecret);
%>

// From JavaScript, you can parse with your favorite JSON library. var signedRequest = JSON.parse(‘<%=signedRequestJson%>’);

请求签名请求

如果您的画布应用程序设置为使用已签名的身份验证请求,则可以使用SDK按需请求已签名的请求。您的应用可以要求Salesforce重新发送加载应用时使用的已签名请求或发送新的已签名请求。在重定向应用程序后刷新过期的会话或获取身份验证信息时,请求已签名的请求非常有用。

您可以使用SDK中的refreshSignedRequest()或repost()JavaScript方法按需请求签名请求。 refreshSignedRequest()通过回调返回一个新签名的请求,而repost()要求父窗口向您的画布应用程序发起一个新的POST,并使用刷新的签名请求重新加载应用页面。

无论何时需要刷新应用程序的签名请求,请使用这些方法。以下是一些示例方案,您可能需要刷新已签名的请求信息。

  • 签名请求中的OAuth令牌通常在两小时后过期。如果OAuth令牌已过期,并且您需要发出其他API请求,则可以调用refreshSignedRequest()以获取新的OAuth令牌,而不会中断用户。
  • Canvas应用程序可能需要使用重定向,尤其是在尝试跨多个系统提供单点登录功能时。如果您的画布应用程序使用重定向,则重定向URL将不会收到包含初始签名请求信息的原始请求正文。您可以使用新方法再次请求已签名的请求。
  • 在2014年夏季及之后,画布应用程序可以是用户认可的应用程序。如果用户未批准您的用户批准的应用,则您的应用将不会获得初始签名请求POST。相反,您的应用需要通过OAuth批准,然后您可以调用repost()来获取已签名的请求。

必须将您的画布应用程序配置为使用签名的身份验证请求才能使用这些方法。 您还需要在JavaScript代码中引用canvas-all.js,如引用Canvas SDK中所述。

请求成功后,您的画布应用程序必须验证返回的SignedRequest信息。 有关验证从Salesforce接收的已签名请求信息的详细信息,请参阅验证和解码签名请求。

Using refreshSignedRequest() to Obtain a Signed Request

使用refreshSignedRequest()通过您提供的回调请求新签名的请求。 在此示例中,使用回调调用refreshSignedRequest(),该回调检查响应代码,然后将签名的请求解析为使用使用者密钥和Base64编码的上下文本身签名的散列的Based64上下文。

// Gets a signed request on demand. Sfdc.canvas.client.refreshSignedRequest(function(data) {
if (data.status === 200) {
var signedRequest = data.payload.response; var part = signedRequest.split(‘.’)[1];
var obj = JSON.parse(Sfdc.canvas.decode(part));
}
}

Using repost() to Obtain a Signed Request

使用repost()指示父窗口向画布应用程序URL发送新的POST。 POST包含加载应用程序时使用的签名请求或新签名的请求。 与refreshSignedRequest()不同,使用repost()重新加载画布应用页面。 以下示例调用repost(),询问原始签名请求。

// Gets a signed request on demand, without refreshing the signed request. Sfdc.canvas.client.repost();

The following example calls repost(), asking for a new signed request.

// Gets a signed request on demand, first by refreshing the signed request. Sfdc.canvas.client.repost({refresh : true});

OAuth身份验证

Canvas支持OAuth 2.0进行授权。使用OAuth时,您有两种选择:

  • Web服务器OAuth身份验证流程 – 当用户运行您的画布应用程序时,他们可以授权应用程序访问其数据。这要求每个用户允许画布应用访问其信息。有关详细信息,请参阅如何使用Web服务器OAuth身份验证流程对身份验证进行身份验证?在REST API开发人员指南中。
  • 用户代理OAuth身份验证流程 – 当用户运行您的画布应用程序时,他们可以通过仅使用浏览器进行身份验证来授权应用程序访问其数据。与Web Server OAuth身份验证一样,此选项要求每个用户允许画布应用访问其信息。
    建议您在开发期间而不是在生产中使用此授权方法,因为使用此类授权不需要服务器端代码,也无需将开发计算机公开到Internet。有关详细信息,请参阅“REST API开发人员指南”中的了解用户代理OAuth身份验证流程。

无论您实施哪种OAuth流,canvas应用程序都必须提供用于启动基于标准的OAuth流的代码。 OAuth注意事项包括:

  • Salesforce在调用画布应用程序URL时执行HTTP GET。
  • 使用用户代理OAuth,可以在浏览器中执行所有授权(不需要服务器端代码)。

如果您有一个使用OAuth身份验证的现有连接应用,并且您希望将该应用作为画布应用公开,那么您有两个选择。首先,您可以编辑现有应用程序(创建新版本)并向其添加画布应用程序信息。这意味着您的应用可以继续使用相同的客户端ID和消费者密钥。第二个选项是创建一个新的画布应用程序。如果您这样做,您将获得新的客户端ID和消费者保密信息,并且您需要使用该信息更新您的应用。

Canvas App用户流 – OAuth

如果您的画布应用程序使用OAuth身份验证,则用户体验会因画布应用程序在用户界面中的位置以及如何设置用户访问权限而异。此图显示了使用OAuth身份验证的画布应用程序的用户流。

启动OAuth流程

以下代码示例显示如何使用OAuth在画布应用程序中启动授权过程。

<html>
<head>
<script type=”text/javascript” src=”/sdk/js/canvas-all.js”></script>
</head>
<body>
<script>
function loginHandler(e) { var uri;
if (! Sfdc.canvas.oauth.loggedin()) { uri = Sfdc.canvas.oauth.loginUrl(); Sfdc.canvas.oauth.login(
{uri : uri,
params: {
response_type : “token”,
client_id : “3MVG9lKcPoNINVBLigmW.8dAn4L5HwY VBzxbW5FFdzvU0re2f7o9aHJNUpY9ACdh.3SUgw5rF2nSsC9_cRqzD”, redirect_uri : encodeURIComponent(
“https://demoapp1234.herokuapp.com/sdk/callback.html”)
}});
}
else {
Sfdc.canvas.oauth.logout(); login.innerHTML = “Login”; Sfdc.canvas.byId(“oauth”).innerHTML = “”;
}
return false;
}
// Bootstrap the page once the DOM is ready. Sfdc.canvas(function() {
// On Ready…
var login = Sfdc.canvas.byId(“login”), loggedIn = Sfdc.canvas.oauth.loggedin(), token = Sfdc.canvas.oauth.token()
login.innerHTML = (loggedIn) ? “Logout” : “Login”; if (loggedIn) {
// Only displaying part of the OAuth token for better formatting. Sfdc.canvas.byId(“oauth”).innerHTML = Sfdc.canvas.oauth.token()
.substring(1,40) + “…”;
});
}
login.onclick=loginHandler;
</script>
<h1 id=”header”>Canvas OAuth App</h1>
<div>
access_token = <span id=”oauth”></span>
</div>
<div>
<a id=”login” href=”#”>Login</a><br/>
</div>
</body>
</html>

适用于Canvas应用程序的SAML单点登录

无论您是使用签名请求还是OAuth授权,都可以使用基于SAML的单点登录(SSO)为您的用户提供无缝的身份验证流程。您可以将Salesforce用作身份提供者或服务提供者。 SAML SSO使您能够通过SAML为您的用户提供自动身份验证,并通过签名请求对Salesforce进行身份验证。

SAML(安全断言标记语言)是一种基于XML的Web标准,用于在Web上进行用户身份验证,允许在两个域之间交换授权数据。使用此功能,您可以创建一个画布应用程序,该应用程序在用户打开时开始标准SAML身份验证流程。此过程完成后,用户将在Web应用程序中进行身份验证。

对于使用签名请求身份验证的画布应用程序,Canvas SDK中包含的两种方法使您的画布应用程序可以调用Salesforce以直接接收新的已签名请求,或使Salesforce能够将已签名的请求重新发布到Web应用程序端点。这导致完整的端到端身份验证流程。

refreshSignedRequest Method

通过回调返回新签名的请求。 SAML SSO流程完成后,您的应用可以调用此方法并接收新签名的请求。此方法适用于需要使用更多客户端JavaScript方法检索签名请求的开发人员。 (Canvas SDK将签名的请求发送到您的应用。)

repost Method

请求父窗口向您的画布应用程序启动POST,并使用刷新的签名请求重新加载应用程序页面。 SAML SSO流程完成后,您的应用可以调用此方法,并通过POST将新签名的请求发送到您的应用。此方法适用于希望使用更多服务器端方法检索已签名请求的开发人员。 (Salesforce将已签名的请求POST到您的服务器。)

注意:Lightning Platform社区上的画布应用程序不支持启动的SAML启动方法标识提供程序。

在您的画布应用程序中获取上下文

使用签名请求验证画布应用程序时,您将获得CanvasRequest对象(其中包含Context对象)作为画布应用程序URL的POST的一部分。如果您使用OAuth进行身份验证,或者想要调用获取上下文信息,则可以通过进行JavaScript调用来执行此操作。

以下代码示例是获取上下文的JavaScript调用示例。此代码创建一个带有文本“Get Context”的链接,然后调用Sfdc.canvas.client.ctx函数。

<script>
function callback(msg) {
if (msg.status !== 200) { alert(“Error: ” + msg.status); return;
}
alert(“Payload: “, msg.payload);
}
var ctxlink = Sfdc.canvas.byId(“ctxlink”); var client = Sfdc.canvas.oauth.client(); ctxlink.onclick=function() {
Sfdc.canvas.client.ctx(callback, client)};
}
</script>
<a id=”ctxlink” href=”#”>Get Context</a>

跨域XHR

Canvas应用程序加载在iFrame中的Salesforce页面上。因此,canvas应用程序(在其自己的域中)无法将XHR(XML HTTP请求)调用回到* .salesforce.com域。您可以开发和部署自己的代理作为SDK的一部分,但是,Canvas提供了用JavaScript编写的客户端代理。此代理使客户端XHR调用回Salesforce。

如果您使用客户端的此代理发出XHR请求,则API会将请求转发给外部iFrame,并代表您提交请求。请求完成后,SDK会使用结果调用客户端的回调函数。以下是一些如何进行XHR调用的示例:

  • 获取Chatter用户列表
  • 发布到Chatter Feed

注意:SDK支持跨域XHR调用,但不应将其用于进行同域调用。

获取Chatter用户列表

以下代码示例显示了一个返回Chatter用户列表的调用。

// Paste the signed request string into a JavaScript object for easy access. var sr = JSON.parse(‘<%=signedRequestJson%>’);
// Reference the Chatter user’s URL from Context.Links object. var chatterUsersUrl = sr.context.links.chatterUsersUrl;
// Make an XHR call back to salesforce through the supplied browser proxy. Sfdc.canvas.client.ajax(chatterUsersUrl,
{client : sr.client, success : function(data){
// Make sure the status code is OK. if (data.status === 200) {
// Alert with how many Chatter users were returned. alert(“Got back ” + data.payload.users.length +
” users”); // Returned 2 users
}
}});

发布到Chatter Feed

以下代码示例显示了将项目发布到上下文用户的Chatter摘要的调用。

var sr = JSON.parse(‘<%=signedRequestJson%>’);
// Reference the Chatter user’s URL from Context.Links object.
var url = sr.context.links.chatterFeedsUrl+”/news/”+sr.context.user.userId+”/feed-items”;
var body = {body : {messageSegments : [{type: “Text”, text: “Some Chatter Post”}]}};
Sfdc.canvas.client.ajax(url,
{client : sr.client, method: ‘POST’,
contentType: “application/json”, data: JSON.stringify(body), success : function(data) {
if (201 === data.status) { alert(“Success”);
}
}
});

调整画布应用程序的大小

Canvas提供了调整画布应用程序大小的方法。可以在SDK和此处找到这些方法的完整参考文档。

  • autogrow – 启动或停止计时器,该计时器检查画布iFrame的内容大小并调整帧。请参阅自动调整画布应用程序大小。
  • resize-通知父窗口调整画布iFrame的大小。请参阅显式调整画布应用程序大小。
  • size – 返回画布iFrame的当前大小。请参阅获取画布应用程序的大小。
  • subscribe – 订阅父事件。目前,canvas.scroll(父级)是canvas命名空间中唯一受支持的父事件。请参阅订阅父事件。

注意:要使调整大小函数与canvas应用程序一起使用,必须在与该应用程序关联的任何HTML页面的顶部声明DOCTYPE。 例如:<!DOCTYPE html>。

自动调整画布应用程序的大小

以下代码示例演示如何调用autogrow方法来调整画布应用程序的大小。 当您的内容更改大小时使用此方法,但您不确定何时。

注意:在Mozilla®Firefox®和Microsoft®InternetExplorer®中,如果内容大小减小,自动增长方法可能无法调整帧大小。 在这种情况下,您可以使用resize方法指定要将帧更改为的确切大小。

// Turn on auto grow with default settings. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client);
});
// Turn on auto grow with polling interval of 100ms (milliseconds). Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client, true, 100);
});
// Turn off auto grow. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client, false);
});

显式调整画布应用程序的大小

以下代码示例演示如何调用resize方法来调整画布应用程序的大小。如果未指定高度和宽度参数,父窗口将尝试根据其内容确定画布应用程序的高度,然后相应地设置iFrame宽度和高度。

// Automatically determine the size. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client);
});
// Set the height and width explicitly.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client, {height : “1000px”, width : “900px”});
});
// Set only the height. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client, {height : “1000px”});
});

获取画布应用程序的大小

以下代码示例演示如何调用size方法以获取画布应用程序的大小。 console.log函数输出帧大小,以便您在调整画布应用程序大小时可以看到大小更改。

// Get the canvas app sizes in the sizes object. var sizes = Sfdc.canvas.client.size();
console.log(“contentHeight; ” + sizes.heights.contentHeight);
console.log(“pageHeight; ” + sizes.heights.pageHeight);
console.log(“scrollTop; ” + sizes.heights.scrollTop);
console.log(“contentWidth; ” + sizes.widths.contentWidth);
console.log(“pageWidth; ” + sizes.widths.pageWidth);
console.log(“scrollLeft; ” + sizes.widths.scrollLeft);
// Resize the canvas app. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.client.autogrow(sr.client);
});

订阅父活动

以下代码示例演示如何调用subscribe方法,以便canvas应用程序可以订阅父事件。此示例处理用户在父窗口中滚动时触发的onscroll事件。

//Subscribe to the parent window onscroll event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
// Capture the onScrolling event of the parent window
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘canvas.scroll’, onData : function (event) {
console.log(“Parent’s contentHeight; ” + event.heights.contentHeight);
console.log(“Parent’s pageHeight; ” + event.heights.pageHeight);
console.log(“Parent’s scrollTop; ” + event.heights.scrollTop);
console.log(“Parent’s contentWidth; ” + event.widths.contentWidth);
console.log(“Parent’s pageWidth; ” + event.widths.pageWidth);
console.log(“Parent’s scrollLeft; ” + event.widths.scrollLeft);
}}
);
});

处理画布应用程序中的方向更改

通过方向事件,您可以在画布应用程序显示在移动设备上时处理方向更改。在您的画布应用程序订阅该事件后,只要父窗口触发window.orientation事件,就会触发该事件。该事件返回包含这些值的有效内容。

ValueDescription
clientHeight应用程序的高度(以像素为单位),特定于画布应用程序呈现的设备
clientWidth画布应用程序的宽度(以像素为单位),特定于画布应用程序渲染的设备
orientation包含其中一个值。
•0:横向到纵向
•90:纵向到横向
•-90:逆时针转动纵向到横向

以下代码示例显示如何订阅orientation事件。

// Capture the orientation event of the parent window.
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘canvas.orientation’,
onData : function (event) {
console.log(“Parent’s orientation: ” + event.orientation + “Canvas app height: ” + event.clientHeight + “Canvas app width: ” + event. clientWidth);
}} );
});

注意:Windows手机不支持方向事件。

实现Canvas应用程序事件

事件提供了一种基于JavaScript的方式来在画布应用程序之间发送和接收事件。使用事件可在单个页面上启用多个画布应用程序之间的通信。

一种情况可能是您将两个自定义应用程序公开为画布应用程序的页面:旅行和费用应用程序以及批准应用程序。您可以创建一个事件,以便在费用报表的状态发生更改时,该事件会被引发并包含有关该费用报表的数据(采用JSON格式)。审批画布应用程序订阅该事件,并指定在引发事件时调用的函数。状态更改后,批准应用程序将接收事件并运行指定的功能。

Canvas提供了在canvas应用程序中实现自定义事件的方法。可以在SDK和此处找到这些方法的完整参考文档。

  • publish – 创建其他画布应用程序或Visualforce页面可以订阅的自定义事件。请参阅创建画布应用程序事件。
  • subscribe – 订阅父事件或自定义事件。此方法可用于订阅多个事件。请参阅订阅Canvas应用程序事件。
  • unsubscribe – 取消订阅父事件或自定义事件。此方法可用于取消订阅多个事件。请参阅取消订阅Canvas应用程序事件。

注意:subscribe和unsubscribe方法也可用于订阅单个Streaming API事件。

Canvas应用程序事件注意事项

在实现画布应用事件时,请记住以下注意事项:

  • 我们建议您在命名事件时使用命名空间,但这不是必需的。
  • 事件命名空间与Salesforce中的组织命名空间不同。但是,如果使用名称空间,我们建议您将事件名称空间与组织名称空间相同。
  • 命名空间必须是不包含句点的字符串。例如,my.name.space.statusChanged无效。具有命名空间的有效事件名称的示例是mynamespace.statusChanged。
  • 这些名称是保留的,不能用作命名空间:
    – canvas
    – chatter
    – force
    – publisher
    – salesforce
    – sfdc
  • 事件仅在同一页面上的画布应用程序之间起作用。如果Chatter选项卡上有画布应用程序,则该应用程序无法订阅Visualforce页面上画布应用程序发布的事件。
  • 您可以在订阅呼叫中订阅多个自定义事件。
  • 您可以在订阅呼叫中仅订阅一个Streaming API事件。
  • 您无法使用相同的订阅调用订阅自定义事件和Streaming API事件。
  • 如果在数组中定义具有相同名称的多个事件,则只有最后定义的事件可用。在此示例中,状态为协商的最后一个事件是使用的事件。
    对于Streaming API事件也是如此。

Sfdc.canvas.client.subscribe(sr.client, [
{
name :”mynamespace.statusChanged”, payload : {status : ‘Closed’}
},
{
name:”mynamespace.statusChanged”, payload : {status : ‘Negotiating’}
]);

创建Canvas应用程序事件

以下代码示例演示如何调用publish方法来创建画布应用程序事件。如果您正在使用命名空间,则事件名称必须以命名空间开头。例如,namespace.eventName。

Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.publish(sr.client,
{name : “mynamespace.statusChanged”, payload : {status : ‘Completed’}});
});

订阅Canvas应用程序事件

订阅自定义事件

以下代码示例演示如何调用subscribe方法来订阅画布应用程序事件。

// Subscribe to a custom event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.client.subscribe(sr.client,
{name : ‘mynamespace.statusChanged’, onData : function (event) { console.log(“Subscribed to custom event “, event);
}}
);
});

订阅多个自定义事件

以下代码示例演示如何调用subscribe方法以订阅多个画布应用程序事件。您订阅的事件可以位于不同的命名空间中,也可能没有命名空间。当画布应用程序订阅某个事件时,它会在事件(在另一个画布应用程序中)和一个函数(在订阅画布应用程序中)之间创建关联。

// Subscribe to multiple events.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.subscribe(sr.client, [
{name : ‘mynamespace.statusChanged’, onData : handler1},
{name : ‘anothernamespace.tripCancelled’, onData : handler2},
]);
});

使用旅行和费用以及审批画布应用示例,您的审批画布应用程序有两个功能:handler1和handler2。该画布应用程序然后订阅旅行和费用画布应用程序中的两个事件:mynamespace.statusChanged和mynamespace.tripCancelled。当批准应用程序收到mynamespace.statusChanged事件时,将调用函数handler1。当批准应用程序收到anothernamespace.tripCancelled事件时,将调用函数handler2。

取消订阅Canvas应用程序事件

取消订阅自定义事件

以下代码示例演示如何调用unsubscribe方法取消订阅画布应用程序事件。

// Unsubscribe from a custom event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.unsubscribe(sr.client, {name : “mynamespace.statusChanged”});
});

取消订阅多个自定义事件

以下代码示例演示如何调用unsubscribe方法取消订阅多个canvas应用程序事件。您订阅的事件可以位于不同的命名空间中,也可能没有命名空间。

// Unsubscribe from multiple events.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.unsubscribe(sr.client, [‘mynamespace.statusChanged’,
“anothernamespace.tripCancelled”]);
});

在Canvas应用程序中使用Streaming API

Canvas提供了一个事件和方法,使画布应用程序能够侦听Streaming API通知。

  • sfdc.streamingapi-JavaScript事件,您创建并与PushTopic定义的Streaming API通道关联。请参阅使用Streaming API事件。
  • subscribe – 订阅您定义的sfdc.streamingapi事件。请参阅订阅流式API事件。
  • unsubscribe – 取消订阅sfdc.streamingapi事件。请参阅从Streaming API事件中取消订阅。

使用Streaming API事件

Canvas SDK包含一个名为sfdc.streamingapi的事件,它允许您在画布应用程序中定义事件并将该事件与Streaming API通道相关联。然后,您使用subscribe方法订阅该事件并接收Streaming API通知。

例如,在Salesforce中,您可以创建一个Streaming API通道,该通道在更新InvoiceStatement并且Status更改为Closed时接收通知。在您的画布应用程序中,您可以创建与该频道关联的事件并订阅它。在Salesforce中,只要关闭发票声明,激活的画布应用程序就会收到通知,并可以执行操作,例如向用户显示消息。

以下是定义Streaming API事件时的一些注意事项:

  • 事件采用包含PushTopic名称的单个参数。
  • PushTopic名称必须以“/ topic /”开头。

{name:”sfdc.streamingapi”, params:{topic:”/topic/myPushTopicName”}}

订阅Streaming API事件

此代码示例演示如何调用subscribe方法,以便canvas应用程序可以订阅Streaming API事件。订阅事件时,可以调用用于订阅画布应用事件的标准sfdc.canvas.client.subscribe方法。调用subscribe方法时,必须传入客户端和Streaming API事件。只有打开并订阅该事件的画布应用才能接收流式API通知。

在此示例中,onComplete方法指定在代码成功订阅事件后运行的函数。该
onData方法指定事件收到Streaming API通知时运行的函数。

// Subscribe to Streaming API events.
// The PushTopic to subscribe to must be passed in.
// The ‘onComplete’ method may be defined,
// and will fire when the subscription is complete.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
var handler1 = function(){ console.log(“onData done”);},
handler2 = function(){ console.log(“onComplete done”);};
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘sfdc.streamingapi’, params:{topic:”/topic/InvoiceStatements”}}, onData : handler1, onComplete : handler2}
);
});

调用subscribe方法时,会进行REST调用以确保画布应用程序具有连接到Streaming API所需的OAuth范围。因此,每次画布应用程序订阅Streaming API事件时,都会使用一个API调用,并根据组织的API请求总限制进行计数。 canvas应用程序至少需要“访问和管理您的数据(API)”OAuth范围才能连接到Streaming API。

如果对subscribe方法的调用成功,则调用onComplete方法,其有效负载为
{成功:真的,拉手:拉手}。句柄是一个数组,其中包含要订阅的Streaming API通道的名称,而subscriptionId是一个包含唯一ID的整数。例如,[“/ topics / InvoiceStatements”,subscriptionId]。如果对subscribe方法的调用失败,则调用onComplete方法,其有效负载为{success:false,errorMessage:msg}。 msg是一个包含错误原因的字符串。
要接收Streaming API通知,您必须创建PushTopic定义的通道。有关更多信息,请参阅Streaming API开发人员指南中的“步骤2:创建PushTopic”。

取消订阅Streaming API事件

此代码示例演示如何调用unsubscribe方法,以便画布应用程序可以取消订阅Streaming API事件。

在Canvas应用程序中调试

您必须使用Chrome,Firefox或Safari才能执行这些步骤。
使用Canvas SDK时,您可以启用调试模式以简化故障排除。

  1. 在浏览器中打开画布应用程序,打开控制台。
  2. 键入Sfdc.canvas.console.enable();并按回车键。
  3. 刷新浏览器。

Use data from this screen to debug canvas-related problems.

使用此屏幕中的数据来调试与画布相关的问题。

在Canvas App中使用e <select> 标签

如果您在画布Web应用程序中使用HTML <select>标签并打算在Salesforce应用程序中使用画布应用程序,请记住,某些设备上的行为可能无法预测。 考虑使用jQuery或CSS替代方法来使用<select>。