2

此问题假定您熟悉FormStack,这是一个拖放式所见即所得的在线表单构建器。

背景

客户正在使用 FormStack 来管理表单。目前,表单提交是通过电子邮件发送的,然后手动输入数据库。可以预见,我的任务是自动化这个过程。这很容易使用 FormStack 的 WebHooks API:我可以将表单提交发送到一个 URL,例如 PHP 脚本,然后愉快地解析。

问题

是否可以使用简单的标识符命名(或标记)FormStack 字段?

客户端需要能够自定义表单,以便多个字段可以输入到同一个数据库列中。* FormStack 然而,据我所知,它只提供了一种指定字段标签的方法,例如Which of these trips interest you?,对程序员不友好标识符,例如Trip。我的脚本必须对标签进行字符串比较(由于它们的长度,更容易出现拼写错误)以确定要做什么。这个问题有哪些明智的解决方法?

澄清*

可以存在多个字段输入同一数据库列的原因是客户端使用条件字段。例如,一个字段可能会询问,Where are you studying abroad? 如果用户选择“欧洲”,则可能会出现一个条件字段,询问Which of these trips interest you?有关欧洲的选项。然而,如果用户选择“Africa”,则可能会出现类似的字段,例如Which of these trips interest you?,但带有与非洲有关的选项。在 FormStack 中,这些实际上是两个不同的字段。但是,您可以想象,这些值属于同一数据库列,Trip.

4

1 回答 1

2

我现在已经解决了一个黑客问题。FormStack 允许在标签中添加 HTML 标记,例如Which of these trips interest you? <!--Trip-->. 客户愿意以这种方式“标记”字段。

这是解析此类标签的代码片段,以防它可能对其他人有所帮助:

    require_once 'Formstack.php';
    $formstack = new Formstack($apiKey);
    $form = $formstack->form($_POST['FormID']);
    $taggedFields = array();
    foreach ($form['fields'] as $field)
    {
        if (preg_match('/<!--\s*([0-9A-Za-z]+)\s*-->/',
                       $field['label'],
                       $matches))
        {
            $taggedFields[$matches[1]] = $_POST[$field['id']];
        }
    }

事实上,我不得不让它更复杂一点。一些 FormStack 字段类型序列化输入(以一种可怕的方式)。例如,FormStack 的Name field-type 采用多个字段(前缀、first、middle、last、initial、suffix),并将结果连接成一个字符串:

'first = Andrew
initial = W
last = Cheong'

为了处理这个问题,我编写了代码来处理标签中的语法,例如Tell us your name! <!--FirstName=first--> <!--LastName=last--> <!--MiddleInitial=initial-->

代码如下。

    require_once 'Formstack.php';
    $formstack = new Formstack($apiKey);
    $form = $formstack->form($_POST['FormID']);
    $taggedFields = array();
    foreach ($form['fields'] as $field)
    {
        if (preg_match_all('/<!--\s*([0-9A-Za-z]+)\s*(?:=\s*(\w+))?-->/',
                           $field['label'],
                           $matches,
                           PREG_SET_ORDER))
        {
            foreach ($matches as $captures)
            {
                if (count($captures) == 3 &&
                    preg_match('/(?:^|\n|\r)'.$captures[2].' = ([^\n\r]+)/',
                               $_POST[$field['id']],
                               $subcaptures))
                {
                    $taggedFields[$captures[1]] = $subcaptures[1];
                }
                else
                {
                    $taggedFields[$captures[1]] = $_POST[$field['id']];
                }
            }
        }
    }

希望 FormStack 将很快添加一种本地方式来命名或标记字段!

于 2012-05-08T15:17:07.193 回答