Symfony 1.4表单字段取决于配置

时间:2012-11-26 14:35:14

标签: php forms configuration symfony-1.4

我在php项目中使用symfony 1.4。我有一个可能会根据用户配置扩展的表单。如果用户为任务选择其他标签或预算,则应将此信息嵌入到表单中,并以部分形式(附加输入)显示为窗口小部件。

例如:

  1. 管理员希望只拥有没有buget或标签的基本任务。编辑或创建新任务时仅显示TasksForm小部件。

  2. 管理员想要使用标签进行基本任务。 TasksForm随附一个字段显示,使用户可以选择标签。

  3. 管理员希望拥有所有选项(标签+预算)

  4. db中的关系是:

    Tasks:
      columns:
        name: string(127)
        created_at: timestamp
        updated_at: timestamp
    
    Budget:
      columns:
        task_id: integer
        budget_prognosis: integer
        budget_used: integer
      relations:
        Tasks:
          local: task_id
          foreign: id
          type: one
    
    TaskHasLabel:
      columns:
        task_id: 
          type: integer
          primary: true
        label_id:
          type: integer
          primary: true
      relations:
        Tasks:
          local: task_id
          foreign: id
          type: one
          onDelete: CASCADE
        Labels:
          local: label_id
          foreign: id
          type: one
          onDelete: CASCADE
    
    Labels:
      columns:
        name: string(127)
      relations:
        Tasks:
          class: Task
          local: label_id
          foreign: task_id
          refClass: TaskHasLabel
    

    目标是在将来轻松更改表单配置并添加新配置选项。我知道我可以通过为每个组合创建单独的表单来做到这一点,但我不想重复自己。另一个想法是将所有字段组合在一个表单中并隐藏它们,但在我看来这不是一个好主意。我在表单构造函数中考虑了通过参数进行配置,但我也不确定。在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

在所有可能性中:

  • 对表单进行子类化,这样您就不会“重复自己”。如果您只有一个或两个选择,这很好,但很快就会出现更多选择的问题(如果只有2个选项且所有组合都有效,则有4个表单。)
  • 为每个选项创建一个表单。然后,使用构造函数参数,为用户想要显示的每个附加功能添加嵌入的表单。如果用户无权查看数据(如果信息隐藏在浏览器中,则可以使用),这也可以防止显示某些选项。

嵌入式表单在SF1.4中运行良好(参见here)。这将是我的解决方案。它还使MVC保持工作。如果您为模型使用Doctrine,还可以阅读this