Silverstripe - 用户表单提交到 CRM

Silverstripe - Userforms submit to CRM

我想让 Silverstripe 的用户表单向 CRM 添加提交值,即 Active Campaign。

我看到有一个 SubmittedForm class 但是我如何在提交数据之前获取数据并通过我的 API 提交呢?

或者,有没有一种方法可以在表单数据提交到数据库后重定向到具有刚刚提交的表单 ID 的自定义页面?然后我可以抓取字段并提交给 API.

您可以继续扩展 class 并根据特定先决条件手动提交。

重定向也一样,你需要写一个扩展。

我认为您应该能够将 DataExtension 添加到实现 updateAfterProcessSubmittedForm

这是 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

您可以像这样从特定的 UserDefinedForm 页面检索提交的表单数据:

/** @var SubmittedForm[] $submissions */
$submissions = UserDefinedForm::get()->filter(['URLSegment' => 'my-integrated-form'])->Submissions();

或检索所有用户表单页面的所有次提交:

$submissions = SubmittedForm::get();

从此处将您的数据集成到外部系统,您可以编写一个 BuildTask 来完成您需要做的事情。您可以将其插入 crontask module, or the 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 方法来 return 对所有人有用的东西 "values".

请注意,我强烈建议您不要 运行 此集成与用户定义表单的扩展内联,因为这会引入同步依赖性,如果其他表单无法正常工作,服务器宕机,您遇到网络延迟等问题

如果您需要一种方法来监控哪些记录已导出,您可以使用 DataExtension 来提供一个 "ExportedTimestamp" 字段或您可以在成功将数据发送到您的 [=41] 时设置的内容=]:

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(文档中有很多关于此的内容),然后在您的导出 BuildTask 中,当您验证了成功的结果时,只需添加 $submission->markAsExported(); API。在 运行 遍历所有记录之前,在 DataList 的过滤器中包含 ->filter(['LastExported' => null]) 或其他内容。

祝你好运!