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

时间:2012-05-07 21:10:01

标签: field naming tagging webhooks formstack

这个问题假定您熟悉 FormStack ,这是一个拖放式WYSIWYG在线表单构建器。

背景

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

问题

  

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

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

澄清*

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

1 个答案:

答案 0 :(得分: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 字段类型采用多个字段(前缀,第一个,中间,最后,首字母,后缀),并将结果连接成一个字符串:

'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很快会添加一个本地方式来命名或标记字段!