Php Silverstripe-用户表单提交给CRM
我想让Silverstripe的userforms附加组件将值提交到CRM,即活动活动 我看到有一个SubmittedForm类,但是在提交数据之前,我如何获取数据并通过API提交数据呢Php Silverstripe-用户表单提交给CRM,php,forms,crm,silverstripe,Php,Forms,Crm,Silverstripe,我想让Silverstripe的userforms附加组件将值提交到CRM,即活动活动 我看到有一个SubmittedForm类,但是在提交数据之前,我如何获取数据并通过API提交数据呢 或者,是否有一种方法,一旦表单数据提交到DB,它将重定向到具有刚刚提交表单ID的自定义页面?然后我可以获取字段并提交到API。您可以继续扩展该类,并根据特定的先决条件手动提交它 与重定向相同,您需要编写一个扩展。您可以继续扩展类,并根据特定的先决条件手动提交它 对于重定向也是一样,您需要编写一个扩展。我认为您应
或者,是否有一种方法,一旦表单数据提交到DB,它将重定向到具有刚刚提交表单ID的自定义页面?然后我可以获取字段并提交到API。您可以继续扩展该类,并根据特定的先决条件手动提交它
与重定向相同,您需要编写一个扩展。您可以继续扩展类,并根据特定的先决条件手动提交它
对于重定向也是一样,您需要编写一个扩展。我认为您应该能够将
数据扩展添加到提交表单
,该表单实现updateAfterProcess
它是SubmittedForm
上的一个扩展钩子,一旦所有用户数据都已验证且电子邮件(如果适用)已发送,就会调用它
您的扩展可以如下所示:
<?php
class UserFormCRMExtension extends DataExtension
{
public function updateAfterProcess()
{
/** @var SubmittedFormField $field */
foreach ($this->owner->Values() as $field) {
/* prepare data for submittal to CRM */
}
/* send data to CRM */
}
}
/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();
我认为您应该能够向提交的表单
添加一个数据扩展
,该表单实现updateAfterProcess
它是SubmittedForm
上的一个扩展钩子,一旦所有用户数据都已验证且电子邮件(如果适用)已发送,就会调用它
您的扩展可以如下所示:
<?php
class UserFormCRMExtension extends DataExtension
{
public function updateAfterProcess()
{
/** @var SubmittedFormField $field */
foreach ($this->owner->Values() as $field) {
/* prepare data for submittal to CRM */
}
/* send data to CRM */
}
}
/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();
您可以从特定的UserDefinedForm页面检索提交的表单数据,如下所示:
<?php
class UserFormCRMExtension extends DataExtension
{
public function updateAfterProcess()
{
/** @var SubmittedFormField $field */
foreach ($this->owner->Values() as $field) {
/* prepare data for submittal to CRM */
}
/* send data to CRM */
}
}
/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();
或检索所有用户表单页面的所有提交:
$submissions = SubmittedForm::get();
从这里,为了将数据集成到外部系统,您可以编写一个BuildTask来完成您需要做的事情。您可以将其插入模块或模块,使其每天按计划运行:
class IntegrateUserFormSubmissionsTask extends BuildTask
{
protected $title = 'Integrate userforms submissions somewhere';
protected $api;
public function run($request)
{
$submissions = SubmittedForm::get();
foreach ($submissions as $submission) {
$formatted = [
'user' => [
'first_name' => $submission->SubmittedBy()->FirstName,
'surname' => $submission->SubmittedBy()->Surname,
],
// ...
];
$this->getYourApi()->submitData($formatted);
}
}
public function getYourApi()
{
if (!$this->api) {
$this->api = new RestfulService(...);
}
return $this->api;
}
}
当然,这只是一个简单的例子,您需要映射数据结构。查看实际提交结构的SubmittedForm
,注意大多数实际表单字段值将位于$submission->values()
下。您可以使用SubmittedFormField::getExportValue
方法返回对所有“值”有用的内容
请注意,我强烈建议您不要将此集成与用户定义表单的扩展一起运行,因为这将引入一个同步依赖项,如果其他服务器出现故障、您遇到网络延迟等情况,这可能会阻止您的表单工作
如果您需要一种监控已导出哪些记录的方法,您可以使用DataExtension提供“ExportedTimestamp”字段,或在成功将数据发送到API时可以设置的内容:
public function ExternalApiExtension extends DataExtension
{
private static $db = [
'LastExported' => 'SS_Datetime',
];
public function markAsExported()
{
$this->owner->LastExported = SS_Datetime::now();
$this->owner->write();
}
}
使用YAML配置将扩展应用于SubmittedForm
(文档中有很多关于此的内容),然后在导出构建任务中,您只需添加$submission->markAsExported()代码>验证API的成功结果时。在运行所有记录之前,在数据列表的筛选器中包括->filter(['lastported'=>null])
或其他内容
祝你好运 您可以从特定的UserDefinedForm页面检索提交的表单数据,如下所示:
<?php
class UserFormCRMExtension extends DataExtension
{
public function updateAfterProcess()
{
/** @var SubmittedFormField $field */
foreach ($this->owner->Values() as $field) {
/* prepare data for submittal to CRM */
}
/* send data to CRM */
}
}
/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();
或检索所有用户表单页面的所有提交:
$submissions = SubmittedForm::get();
从这里,为了将数据集成到外部系统,您可以编写一个BuildTask来完成您需要做的事情。您可以将其插入模块或模块,使其每天按计划运行:
class IntegrateUserFormSubmissionsTask extends BuildTask
{
protected $title = 'Integrate userforms submissions somewhere';
protected $api;
public function run($request)
{
$submissions = SubmittedForm::get();
foreach ($submissions as $submission) {
$formatted = [
'user' => [
'first_name' => $submission->SubmittedBy()->FirstName,
'surname' => $submission->SubmittedBy()->Surname,
],
// ...
];
$this->getYourApi()->submitData($formatted);
}
}
public function getYourApi()
{
if (!$this->api) {
$this->api = new RestfulService(...);
}
return $this->api;
}
}
当然,这只是一个简单的例子,您需要映射数据结构。查看实际提交结构的SubmittedForm
,注意大多数实际表单字段值将位于$submission->values()
下。您可以使用SubmittedFormField::getExportValue
方法返回对所有“值”有用的内容
请注意,我强烈建议您不要将此集成与用户定义表单的扩展一起运行,因为这将引入一个同步依赖项,如果其他服务器出现故障、您遇到网络延迟等情况,这可能会阻止您的表单工作
如果您需要一种监控已导出哪些记录的方法,您可以使用DataExtension提供“ExportedTimestamp”字段,或在成功将数据发送到API时可以设置的内容:
public function ExternalApiExtension extends DataExtension
{
private static $db = [
'LastExported' => 'SS_Datetime',
];
public function markAsExported()
{
$this->owner->LastExported = SS_Datetime::now();
$this->owner->write();
}
}
使用YAML配置将扩展应用于SubmittedForm
(文档中有很多关于此的内容),然后在导出构建任务中,您只需添加$submission->markAsExported()代码>验证API的成功结果时。在运行所有记录之前,在数据列表的筛选器中包括->filter(['lastported'=>null])
或其他内容
祝你好运 @Craig谢谢你接受我的回答。我认为Robbie Averill提出的解决方案是解决您具体问题的更好方法(因为他在回答中提到了这些原因)。@Craig感谢您接受我的回答。我认为Robbie Averill提出的解决方案是解决您具体问题的更好方法(因为他在回答中提到了这些原因)。