Silverstripe - 用户表单提交给CRM

时间:2017-10-30 08:25:06

标签: php forms crm silverstripe

我希望Silverstripe的用户表单将提交值添加到CRM,即Active Campaign。

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

或者,有没有一种方法,一旦表单数据提交到数据库,它会重定向到一个自定义页面,其中包含刚刚提交的表单的ID?然后我可以抓取字段并提交给API。

3 个答案:

答案 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