我希望Silverstripe的用户表单将提交值添加到CRM,即Active Campaign。
我看到有一个SubmittedForm类,但是如何在提交之前获取数据并通过我的API提交?
或者,有没有一种方法,一旦表单数据提交到数据库,它会重定向到一个自定义页面,其中包含刚刚提交的表单的ID?然后我可以抓取字段并提交给API。
答案 0 :(得分:4)
您可以从特定的UserDefinedForm页面检索提交的表单数据,如下所示:
/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();
或检索所有用户表单页面的所有提交内容:
$submissions = SubmittedForm::get();
从这里将数据集成到外部系统,您可以编写一个BuildTask来完成您需要做的事情。您可以将其插入crontask模块或queuedjobs模块,以使其每天按计划运行:
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();
}
}
将扩展程序应用于SubmittedForm
和YAML配置(在相关文档中有很多内容),然后在导出BuildTask中,只需在验证API成功结果后添加$submission->markAsExported();
即可。在运行所有记录之前,在DataList的过滤器中包含->filter(['LastExported' => null])
或其他内容。
答案 1 :(得分:1)
您可以根据某个先决条件扩展课程并手动提交。
对于重定向,您需要编写扩展名。
答案 2 :(得分:1)
我认为您应该能够DataExtension
添加SubmittedForm
来实现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 */
}
}
照常申请,通过config.yml
:
SubmittedForm:
extensions:
- UserFormCRMExtension