跳转到主要内容

PloneFormGen适配器,允许基于从网页表单收集的数据创建任意Salesforce.com记录

项目描述

概述

Salesforce-PloneFormGen 适配器允许通过 PloneFormGen 表单在 Salesforce.com 数据库中创建、读取和更新。

借助由 PloneFormGen (以及 Plone)提供的出色基础,创建收集和验证所需信息的表单的任务不再需要开发者的干预,内容编辑员只需具备一定的 Plone 用户界面知识即可完成。然而,将数据保存在 CMS 或通过电子邮件发送仅限于有限的使用。

Salesforce.com 提供了一个强大的、可扩展的平台,用于执行客户关系管理(CRM)任务,包括销售、营销、非营利性成员组织和服务。Salesforce PFG 适配器允许将最佳 CMS 和 CRM 结合起来,以便每个系统都可以专注于其自身的优势,便于非开发者使用。

Salesforce.com 提供了名为 web-to-lead 的功能,但除了 PloneFormGen 在 web-to-lead 表单构建器上的众多优势之外,此软件还提供以下附加功能:

  • 可配置的单个表单字段验证

  • 能够从单个表单结果中创建任意数量的不同记录

  • 能够使用表单创建自定义 sObject 记录

  • 能够创建任意类型的 sObject 记录,而 web-to-lead 仅创建潜在客户记录,这些记录只能转换为联系人、帐户或机会记录。您希望直接从表单创建活动记录?没问题。

  • 能够创建相互关联的多个记录(例如,创建帐户记录,然后创建一个联系人记录,其中之前创建的帐户的 Id 填充联系人记录的 AccountId 字段。)

使用方法

将 PloneFormGen 表单连接到 Salesforce 的方法是向 PloneFormGen 表单文件夹中添加一个“Salesforce 适配器”。通常,负责设置表单的网站编辑员将

  1. 创建一个包含必要字段的 PloneFormGen 表单。

  2. 通过 Plone 的添加菜单向表单添加 Salesforce 适配器。

  3. 通过选择以下内容配置适配器:

  • 适配器应创建或更新 Salesforce.com 对象的类型

  • “字段映射”,指定表单字段与 Salesforce 字段之间的对应关系

  • 适配器是否应创建新对象,或通过匹配某些表达式编辑现有对象

映射表单字段

一旦您选择了 sObject 类型,进入“字段映射”管理屏幕将显示一个两列表单,用于设置哪个 Salesforce 字段将填充表单上的每个字段。表单上的每个字段都由一行表示,左列中是表单字段名称,右列是一个下拉选择菜单,包含所有可用的 Salesforce 字段。为每个表单字段选择所需的 Salesforce 字段,然后点击“保存”。

注意:虽然不是必需将每个表单字段映射到 Salesforce 字段,但您需要确保 Salesforce 配置中定义为必填字段的 sObject 字段都有映射。否则,提交表单时无法成功创建 sObject。您所选的 sObject 的所有必填字段都应相应标记,并显示在选项列表的顶部。

如果您在任何时候返回并切换到不同的 sObject 类型后提供了映射,您将希望重新创建所需的映射。这是预期行为,因为如果保持之前选择的 sObject 类型的映射,更新将会失败(或者更糟,会产生非常令人困惑的结果)。

预设值

有时您希望特定表单创建的每个对象都有特定字段的相同值。例如,您可能希望将潜在客户的“来源”字段设置为“网络”。这可以通过使用“预设字段值”设置来实现。

在左侧列中,输入您希望存储在字段中的值。(例如:“Web”)

在右侧列中,选择应存储值的字段。(例如:“潜在客户来源”)

如果您需要更复杂的表达式来确定值,您可以创建一个隐藏的表单字段,编辑其默认值覆盖表达式,并使用表单字段映射设置进行映射。

链式适配器

Salesforce-PloneFormGen适配器可以用于从单个表单创建多个相关对象。例如,创建一个与账户关联的联系人。

-----------                -------------
| Account |                | Contact   |
-----------                -------------
| Id      | -------------> | AccountId |
| Name    |                | LastName  |
-----------                -------------

要创建此链接,联系人对象的“AccountId”外部键需要设置为应关联的账户的ID。这可以通过创建一个用于账户的Salesforce适配器和一个用于联系人的Salesforce适配器来完成,然后设置联系人适配器的“配置父适配器”设置,以便将账户适配器的ID映射到联系人的AccountId字段。

在这个设置中,账户适配器将在PloneFormGen表单中的顺序无关的情况下先于联系人适配器运行。在这种情况下,“联系人”适配器是依赖于“账户”适配器结果的。当在Salesforce.com中创建“账户”时,将返回一个类似于“01r600123009QiJ”的ID,以及API响应。然后,这个ID将被保存并用于随后创建的联系人记录。通过验证确保不会意外配置“循环依赖”的适配器。

更新现有对象

默认情况下,Salesforce适配器将始终在Salesforce中创建新对象。也可以在“更新”模式下使用它们,此时表单将在Salesforce中查找与给定表达式匹配的对象,加载表单并使用该对象中的值,然后在表单提交时保存对对象的更改。

可以使用Salesforce适配器配置的“创建与更新”部分中的以下设置来设置此配置

创建模式

设置为“创建”以始终创建新对象(默认)。设置为“更新”以尝试查找和更新现有对象。

匹配现有对象的更新表达式

输入一个TALES表达式,该表达式评估为SOQL WHERE子句,该子句返回您想要更新的Salesforce.com对象。如果您在SOQL语句的单引号中插入请求中的输入,请确保使用sanitize_soql方法对其进行转义。例如,以下表达式可用于匹配Username__c字段等于请求中“username”参数传递的值的对象

python:"Username__c='" + sanitize_soql(request.form.get('username', '')) + "'"
找不到现有对象时的行为

确定在找不到与给定表达式匹配的对象时的期望行为。如果设置为“显示错误消息失败”,则将显示错误(默认)。如果设置为“创建”,则将创建新对象。

注意:适配器通过修改所有映射字段的默认值覆盖来实现表单字段的预填充。已经自定义的默认值覆盖将被保留不变。

注意:仅当表单首次加载时才使用匹配表达式查询Salesforce;此时,将找到的对象的Salesforce ID存储在Zope会话中。这确保了更改始终保存到加载的对象,即使在此期间数据库中发生了其他更改。但是,这也意味着如果用户的会话被销毁(例如,在Zope重启期间),则提交表单将失败。

当使用链式适配器时,某些适配器可以在更新模式下使用,而其他适配器则用于创建模式。例如,这可以用来添加与现有账户关联的新机会。目前,这需要为每个适配器设置至少一个表单字段映射才能正常工作。此外,如果一个字段被多个适配器映射时的行为尚未定义。

当事情出错时

在尝试写入Salesforce(例如,如果Salesforce正在进行维护)时,有时可能会发生临时错误。如果当尝试处理“创建模式”设置为“创建”的适配器时发生这种情况,将尝试使用备用机制以另一种方式记录信息。

如果存在任何已保存的数据适配器(无论是否启用),数据将通过它进行保存。此外,无论是否存在savedata适配器,都会向Plone网站电子邮件设置中配置的电子邮件地址发送电子邮件,报告保存到Salesforce失败。管理员可以根据此电子邮件采取必要的行动。最终用户将被引导到正常的表单感谢页面,以便他们不会因写入Salesforce的错误而感到不便。

由于此模式需要从Salesforce读取,因此更新模式中的适配器没有备用机制。

依赖关系

已测试与Plone 2.5.x、3.x和4.0a2兼容。

依赖于beatbox库 >= 16.0,这是一个Salesforce.com API的Python包装器。您必须有一个提供API访问权限的Salesforce.com账户。

SalesforceBaseConnector >= 1.2b1。请参阅http://plone.org/products/salesforcebaseconnector

PloneFormGen和相关依赖项。

DataGridField >= 1.6.x。

安装

与典型的Zope/Plone产品相似

  • 将Products.salesforcepfgadapter egg添加到您的buildout中。(或者在不使用buildout的安装中,根据需要安装产品及其依赖项。)

  • 重新运行buildout并重新启动Zope。

  • 如果您网站根目录中还没有Salesforce Base Connector(portal_salesforcebaseconnector),请通过ZMI添加菜单添加一个,并配置其登录凭据。

  • 转到Plone界面中的网站设置页面,然后单击添加/删除产品链接。选择salesforcepfgadapter(勾选其复选框)并单击安装按钮。如果尚未完成,这将在安装salesforcepfgadapter的同时安装PloneFormGen。如果PloneFormGen不在添加/删除产品列表中,通常意味着产品由于缺少先决条件而没有加载。

权限

请参阅PloneFormGen中的权限部分README.txt。

安全

请参阅PloneFormGen中的安全部分README.txt。

已知问题

请参阅PloneFormGen中的已知问题部分README.txt。另外

  • 底层Python包装库Beatbox在API因计划维护而不可用的情况下不会引发自定义异常,如下面的响应所示:SoapFaultError:‘UNKNOWN_EXCEPTION’‘UNKNOWN_EXCEPTION:由于计划维护服务器不可用’

更多信息

产品主页为http://plone.org/products/salesforcepfgadapter。在链接位置提供文档区域问题跟踪器

存在一个名为Plone Salesforce Integration的Google Group,其唯一目的是讨论和开发使Plone与Salesforce.com良好集成的工具。如果您有问题,加入此组并向邮件列表发布可能是获得支持的最佳方式。

如果失败,请尝试使用Plone用户邮件列表或#plone irc频道进行支持请求。如果您在那里无法得到问题的答案,或者对帮助开发产品感兴趣,请参阅以下部分,了解您可以联系的个人。

致谢

西雅图和波特兰的Plone & Salesforce团队

  • Jon Baldivieso <jonb –AT– groundwire –DOT– org>

  • Andrew Burkhalter <andrewburkhalter –AT– gmail –DOT– com>

  • Brian Gershon <briang –AT– webcollective –DOT– coop>

  • David Glick <davidglick –AT– groundwire –DOT– org>

  • Jesse Snyder <jesses –AT– npowerseattle –DOT– org>

  • Alex Tokar <alext –AT– webcollective –DOT– coop>

特别嘉宾:PloneFormGen

Jesse Snyder和NPower Seattle为建立Salesforce Base Connector的代码奠定了基础

Simon Fell为提供Salesforce.com API的beatbox Python包装器

Salesforce.com Foundation和Enfold Systems为他们对beatbox的捐赠和工作(参见:http://gokubi.com/archives/onenorthwest-gets-grant-from-salesforcecom-to-integrate-with-plone

请参阅CHANGES.txt文件,以获取帮助特定功能或错误的人员不断增长列表。

许可

根据GPL分发。

请参阅LICENSE.txt和LICENSE.GPL以获取详细信息。

变更日志

1.9.1 (2012-02-01)

  • 如果有一个名为credit_card的字段,不要将其包含在备用电子邮件中。[davisagli]

1.9.0 (2012-1-27)

  • 避免在适配器实例上缓存Salesforce字段信息。相反,使用beatbox客户端的类型描述缓存(可以通过ZMI中的Salesforce基础连接器清除)。[davisagli]

  • 在备用电子邮件中包含异常信息。[davisagli]

  • 为FormFolders添加一个视图和操作,用于汇总所有Salesforce适配器的配置。[jessesnyder]

1.9.0b1 (2010-12-23)

  • 添加当适配器无法写入Salesforce时的备用逻辑。在这种情况下,它将首先尝试保存到存在的已启用savedata适配器,如果存在。接下来,它将尝试保存到存在的禁用savedata适配器。最后,它将尝试将电子邮件发送到网站的行政电子邮件地址。在所有三种情况下都会发送电子邮件以通知管理员写入Salesforce失败。如果其中一个备用操作成功,填写表单的用户将看到正常的感谢页面而不是错误。[davisagli]

1.8.0 (2010-12-01)

  • 添加在更新模式下如果没有找到对象时要执行的新选项:“静默跳过此操作以及随后的任何Salesforce适配器” [davisagli]

1.7.0 (2010-11-16)

  • 即使在更新模式下适配器没有映射任何字段,也要从适配器获取ID,以便可以使用该ID从链式适配器中获取。这使得可以通过任意SOQL表达式找到现有对象,而不是简单地通过其ID创建具有查找字段的对象。 [davisagli]

1.6.4 (2010-08-27)

  • 修复了1.6.2中引入的回归,该回归针对不提供creationMode字段的销售forcepfgadapter子类,这次真正修复了。[jbaldivieso]

1.6.3 (2010-08-15)

  • 修复了1.6.2中引入的回归,该回归针对不提供creationMode字段的销售forcepfgadapter子类。[davisagli]

1.6.2 (2010-08-03)

  • 通过将相应的Salesforce字段设为null来正确处理更新模式中的空白表单字段。[yomatters]

1.6.1 (2010-03-26)

  • 修复了Plone 2.5中的回归。[davisagli]

  • 修复了Plone 4中处理日期时间的时区问题的回归,当预填充字段时。[davisagli]

  • 在预设值映射中添加对TALES表达式的支持。[davisagli]

1.6.0 (2010-02-24)

  • 修复了隐藏只读字段从UI的回归 – 即使不可更新,可创建字段仍然需要是一个选项。这关闭了http://plone.org/products/salesforcepfgadapter/issues/17 [davisagli]

  • 进行防御性编码,以确保SFPFG适配器修改处理程序在遇到没有“creationMode”字段的适配器子类时不会失败。[davisagli]

1.6b2 (2009-12-11)

  • 不要将只读字段作为选项显示在字段映射UI中。这关闭了问题#14。[davisagli]

  • 从类型配置中删除过时的操作。这关闭了问题#16。[davisagli]

  • 允许将文件上传的文件名和mime类型映射到SFDC中的字段(可能是在附件对象中),而不仅仅是数据本身。[davisagli]

  • 添加了查看和更新通过匹配任意表达式找到的现有Salesforce对象值的能力。有关详细信息,请参阅README。[davisagli]

  • 恢复了Plone 2.5支持,并添加了与Plone 4的兼容性。[davisagli]

  • 添加了“预设字段值”设置,以便可以将硬编码的值映射到Salesforce字段,而无需创建隐藏表单字段。感谢Jon Stahl的建议。[davisagli]

1.6b1 (2009-09-08)

  • 调整对salesforcebaseconnector查询方法的调用,使用单个完整的SOQL语句。现在需要beatbox >= 16.0dev。[davisagli]

  • 使用字段ID而不是标题作为字段映射的关键列,这样就可以在不担心标题的情况下程序化设置映射。[davisagli]

  • 通过使用onsetup装饰器,在整个测试过程中删除了重复的设置代码和不必要的API调用。[andrewb]

  • 将大量包安装操作移动到GenericSetup。[andrewb]

  • 不再支持Plone 2.5,移除与支持旧版本相关联的所有复杂解决方案。[andrewb]

  • 将metadata.xml添加到GenericSetup配置文件中。[andrewb]

1.5.2 - 2009年8月13日发布

  • 修复了已损坏的发布。[davisagli]

1.5.1 - 2009年8月12日发布

  • 修复了问题#13,在编辑带有PloneFormGen 1.5b2的Salesforce适配器时,点击“下一步”按钮会导致跳转到表单文件夹的快速编辑UI,而不是预期的字段映射UI。[andrewb]

1.5 - 2009年2月18日发布

  • 清理README.txt中过长的行(例如> 80个字符)[andrewb]

1.5rc1

  • 在依赖项DataGridField中添加了已知问题#30的信息。http://plone.org/products/datagridfield/issues/30 [andrewb]

  • 添加了对Salesforce适配器配置的read_permission保护。标题对所有用户可见,但SFObjectType、fieldMap和dependencyMap字段现在仅对具有ModifyPortalContent权限的用户可见。现在“base_view”在输出任何给定适配器对象的值时尊重这一点。[andrewb]

  • 停止使用Salesforce.com的商标图标 [davisagli]

1.5a3

  • 更好地处理空的FormIntegerField值,如果留空,则会被传递给创建的对象中的空字符串填充。对于字符串类型的字段来说没问题,但对于整数字段(例如在SF WSDL中记录为xsd:double和xsd:int格式)则另当别论。这解决了:http://plone.org/products/salesforcepfgadapter/issues/8 注意:如果FormIntegerField是必填字段并且因此按预期在请求中通过,则正确处理。[andrewb,感谢greenstork的报告错误]

1.5a2

  • 我们的SFObjectType字段的修改器现在考虑到可能存在无效的字段映射和/或依赖映射,这可能导致无效字段异常,如果映射未重新配置。这在用户设置一个适配器以创建一种字段类型,但后来切换到另一种类型的情况下非常有用。这解决了以下问题:http://plone.org/products/salesforcepfgadapter/issues/7 [andrewb]

  • 对重命名和/或删除的适配器以及Parent Adapter映射接口进行了适当的清理。类似于现有的字段映射清理方法。[andrewb]

  • 更好地处理空的FormDateField值,这些值在转换为DateTime格式时会出现错误,如果成功,则无效的xsd:dateTime格式。这解决了:http://plone.org/products/salesforcepfgadapter/issues/6 http://plone.org/products/salesforcepfgadapter/issues/5 注意:如果FormDateField是必填字段并且因此按预期在请求中通过,则正确处理。[andrewb,感谢greenstork的报告错误]

  • 添加了对PloneFormGen的FormFileField类型的支持,以便可以填充二进制文件并将其直接上传到Salesforce.com。可能有其他用例,但Salesforce的附件类型可以与任何其他类型相关联,相关的是ParentId、字段,通常是二进制数据(存储在Body字段中)与记录相关联的地方。[andrewb]

  • 为了减轻用户的配置负担(即按照它们需要运行的顺序放置Salesforce适配器),我们从文件夹中的最后一个适配器开始构建和运行适配器。这个适配器反过来管理所需的顺序并适当地创建Salesforce记录。然而,1.5a1版本没有考虑到禁用的适配器。即那些在表单文件夹的适配器字段中被勾选的适配器。现在这个问题已经修复。请参阅:http://plone.org/products/salesforcepfgadapter/issues/3 [andrewb]

  • 与以下问题属于同一类别:http://plone.org/products/salesforcepfgadapter/issues/3,我们需要考虑那些具有“execCondition”失败情况的适配器。现在这个问题已经修复。请参阅:http://plone.org/products/salesforcepfgadapter/issues/4 [andrewb]

1.5a1

  • 在Salesforce适配器中添加了新的DataGridField FixedColumn,对于存储从父表单到相关字段的相对路径的‘fieldMap’架构字段,将其可见性设置为false。以前,我们根据每个字段的标题键来“构建”即将创建的Salesforce对象的数据库结构。由于标题不一定唯一,这很脆弱,并且随着对基于字段集的字段映射的支持的引入,代码变得荒谬。注意:如果您从之前的版本跳转到这个版本的salesforcepfgadpater,您需要从ZMI或添加/删除产品控制面板重新安装产品。这将触发所有现有Salesforce适配器对象的迁移,包括这个必需的新列。 [andrewb]

  • 重新构建了过于脆弱的“是否需要迁移”的基础设施,该基础设施针对1.0rc1之前的版本,假设我们会列出所有已知版本直到永远,并且运行配置文件步骤不会增加已安装产品的已安装版本属性,正如现在在CMFQIT版本2.1.4中显示的那样。这应该允许同时进行Plone 3.1.x迁移和Salesforce PFG适配器升级。 [andrewb]

  • 添加了对在Salesforce.com对象中从映射和创建的角度支持文件夹式“fieldset”内的表单字段。 [andrewb]

  • 通过直接调用getSortedSFAdapters来添加测试/代码覆盖率,以防止超出最大递归深度错误。在这种情况下,Salesforce适配器是在现有Archetype验证代码的上下文之外配置的。 [andrewb]

  • 添加了对“链式适配器”的支持(即创建单独但相关联的SF对象的表单),包括:适配器的模式扩展、验证循环链以及按正确顺序执行链。 [jbaldivieso, andrewb]

1.0 - 2008年4月4日发布

  • 添加了对onSuccess的测试覆盖率,这是确保我们的表单值以适当的SFObject类型及其配置的映射方式进入Salesforce.com的关键部分。我想在rc周期中测试主要功能是可行的。 [andrewb]

1.0rc2

1.0rc1

  • 为那些没有在UI中标记必填字段的旧版适配器提供测试和迁移。[andrewb, jessesnyder]

  • 将Salesforce PFG适配器的archetype_name重命名为Salesforce Adapter,以尝试提高非技术性可访问性。为此提供了迁移。[andrewb, jessesnyder]

  • 在SalesforcePFGAdapter类的方法中添加zope安全检查。[jessesnyder]

  • 调整i18n基础设施并添加德语翻译。[davisagli]

  • 在Plone3中不显示多余的模式。[jessesnyder]

  • 针对我们的代码库运行了Ran Zope的测试覆盖率功能,并将测试覆盖率扩展到代码库公共方面的关键部分。[andrewb]

  • 实现了IMultiPageSchema,以便可以分别并有序地处理模式,因为字段映射模式依赖于首先提交默认模式。[jessesnyder]

  • 重新排序了适配器的模式,将“字段映射”放在“覆盖”之前。[davisagli]

  • 解决了FGDateField问题,以便为Salesforce.com输入正确格式化提交的日期。在字段值上使用了DateTime.HTML4()方法。[ghnatiuk, davisagli]

  • 在字段映射UI中添加标签,以显示所选SFObject的非空字段(即必需的)以及没有计算值的字段(即作为唯一ID,它是必需的,但你无法控制)[jessesnyder, andrewb]

  • 在字段映射UI中对必需的字段进行排序,然后是可选的字段。[jessesnyder, andrewb]

1.0-alpha2

  • 解决了DataGridField移除其FixedRow值的前后空格的问题,而我们的generateFormFieldRows方法没有这样做,因此每次保存适配器都会在DataGridField UI中产生重复映射。[jessesnyder, andrewb]

  • 为字段映射用户界面提供自定义修改变量器,现在可以自动清理已删除或重命名的字段[jessesnyder, andrewb]

1.0-alpha1

项目详细信息


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

Products.salesforcepfgadapter-1.9.1.zip (115.8 kB 查看散列)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页