0

所以我正在尝试构建这个具有票务系统的应用程序。每个工单实体都有一个类别。这一切都很好,但我想在填写新票时为每个类别设置单独的表单字段。另外,我想让它们可配置。这就是这个概念的样子(示例):

Category1 form: Ticket Form + Amount + Starting Date

Category2 form: Ticket Form + Point of Contact (choice) + etc...

所以用户选择一个类别,表格会动态变化。我目前将它设置为每个类别都是一个单独的实体,并且有一个表单侦听器,它根据用户的选择添加适当类别的子表单。问题是所有这些都是硬编码的。我想要某种可以编辑/添加/删除类别及其表单字段的工具。例如,我想有一天在 Category2 中添加一个“金额”字段。

如果不为每个类别生成单独的实体,我对如何执行此操作没有太多想法。我正在考虑拥有一个名为 TicketCategory 的实体,其中包含 Custom1、Custom2、Custom3 等字段,它们代表要在某个配置文件中定义的不同表单字段。问题在于字段类型。我会有很多日期/数字/字符串/等...

有人对如何解决这个想法有任何建议吗?

4

1 回答 1

0

我有一个应用程序,裁判可以在其中注册不同的比赛。对于每场比赛,我都需要提出不同的问题。所以我将问题移到了一个 yaml 文件中,并添加了足够的信息,以便我可以动态地创建表单元素。所以基本上我会:

# tourn.yml
tourns:

     opencup:
         desc:    "USSF Open Cup 2013 - Decatur, Alabama - April 12, 13, 14"

         plan:
             lodgingNights:
                     Fri:
                         type:      radio
                         label:     Lodging Friday Night
                         date:     '2013-04-12'
                         choices:  [No: No, Yes: Yes]
                         default:   No
                     Sat:
                         type:      radio
                         label:     Lodging Saturday Night
                         date:     '2013-04-13'
                         choices:  [No: No, Yes: Yes]
                         default:   No

             availabilityDays:
                     Fri:
                         type:      select
                         label:     Availability Friday
                         date:     '2013-04-12'
                         default:   None
                         choices:
                             None:     None
                             Evening:  Kickoff 5PM
                             Not Sure: Not Sure
                      etc

因此计划数组最终被传递给计划子表单,该子表单又创建了所有单独的表单元素。然后我有一个单一的计划实体,它只将所有单独的选择存储在一个数组数据库列中。似乎工作正常。

==================================================== ======================

评论要求提供更多代码。这是我的“动态”PlanFormType”

class PlanFormType extends AbstractType
{
protected $metaData = null;

public function getName() { return 'cerad_tourn_person_plan'; }

public function setMetaData($data) { $this->metaData = $data; }
public function getMetaData(     ) { return $this->metaData; }

public function buildForm(FormBuilderInterface $builder, array $options)
{   
    $items = $this->getMetaData();

    foreach($items as $name => $item)
    {
        $isChoice = false;

        switch($item['type'])
        {
            case 'radio':
                $isChoice = true;
                $expanded = true;
                $multiple = false;
                $attr = array('class' => 'radio-medium');
                break;

            case 'select':
                $isChoice = true;
                $expanded = false;
                $multiple = false;
                $attr = array();
                break;

            case 'text':

                $attr = array();

                if (isset($item['size'])) $attr['size'] = $item['size'];

                $builder->add($name,'text',array(
                    'label'    => $item['label'],
                    'required' => false,
                    'attr'     => $attr,
                ));
                break;

        }
        if ($isChoice) 
        {
            $builder->add($name,'choice',array(
                'label'       => $item['label'],
                'required'    => false,
                'empty_value' => false,
                'choices'     => $item['choices'],
                'expanded'    => $expanded,
                'multiple'    => $multiple,
                'attr'        => $attr,
            ));
        }
    }
}
}
于 2013-07-25T15:35:47.697 回答