Php Silverstripe-用户表单提交给CRM

Php Silverstripe-用户表单提交给CRM,php,forms,crm,silverstripe,Php,Forms,Crm,Silverstripe,我想让Silverstripe的userforms附加组件将值提交到CRM,即活动活动 我看到有一个SubmittedForm类,但是在提交数据之前,我如何获取数据并通过API提交数据呢 或者,是否有一种方法,一旦表单数据提交到DB,它将重定向到具有刚刚提交表单ID的自定义页面?然后我可以获取字段并提交到API。您可以继续扩展该类,并根据特定的先决条件手动提交它 与重定向相同,您需要编写一个扩展。您可以继续扩展类,并根据特定的先决条件手动提交它 对于重定向也是一样,您需要编写一个扩展。我认为您应

我想让Silverstripe的userforms附加组件将值提交到CRM,即活动活动

我看到有一个SubmittedForm类,但是在提交数据之前,我如何获取数据并通过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提出的解决方案是解决您具体问题的更好方法(因为他在回答中提到了这些原因)。