如何为每个选定的复选框创建多个记录集

时间:2012-01-20 12:29:47

标签: forms symfony1 doctrine symfony-1.4

我有以下架构,我想创建一个包含Symfony 1.4和Doctrine的表单,用户可以从选择框中选择一个杂志,然后单击几个复选框,其中每个复选框都是一个问题。

在伪标记中,它应该如下所示:

[选择]杂志[/选择

[复选框]问题1 [复选框]

[复选框]问题2 [复选框]

[复选框]问题3 [复选框]

[复选框]第4期[复选框]

[复选框]第5期[复选框]

如果表单已保存,则应为所选的每个复选框创建一个记录集。广告ID通过网址传递给表单。

我尝试了几种方法来实现这一目标,但我现在坚持了几个星期,希望有人可以帮助我。

在真实项目中,我需要25个所描述形式的集合,但如果我只能使这个基本形式工作,这将不会成为问题。

我应该创建一个广告表单并将Planing表单嵌入其中吗?我总是试着直接用Planing表格。

任何建议,提示或者帮助非常感谢。 抱歉我的英语很差。

Advertisement:
  columns:
    title:                  { type: string(100), notnull: true }

Issue:
  columns:
    magazine_id:            { type: integer, notnull: true }
    number:                 { type: string(10), notnull: true }
  relations:
    Magazine:
      local: magazine_id
      foreign: id
      foreignAlias: Issues
      type: one
      foreignType: many

Magazine:
  columns:
    title:                  { type: string(100) }

Planing:
  columns:
    advertisement_id:           { type: integer, notnull: true }
    magazine_id:                { type: integer, notnull: true }
    issue_id:                   { type: integer, notnull: true }
  relations:
    Issue:
      local: issue_id
      foreign: id
      foreignAlias: Planings
      type: one
      foreignType: many
    Advertisement:
      local: advertisement_id
      foreign: id
      foreignAlias: Planings
      type: one
      foreignType: many
    Magazine:
      local: magazine_id
      foreign: id
      foreignAlias: Planings
      type: one
      foreignType: many 

1 个答案:

答案 0 :(得分:1)

如果我理解正确(让我检查一下:你想在某些杂志的某些问题上展示广告吗?)那么这个怎么样?

使用Planing对象与Issue对象之间的关系,一对多,然后使用Symfony博客中所述的内置sfWidgetFormChoice:http://symfony.com/blog/new-in-symfony-1-2-make-your-choice(向下滚动到"分组你的选择&#34)。

因此,不使用sfWidgetFormDoctrineChoice,而是使用其父级并编写自己的方法来构建按杂志分组的存储在嵌套数组中的问题数组。您可以在PlaningForm配置中覆盖小部件,如下所示:

$this->widgetSchema['issues_list'] = new sfWidgetFormChoice(array(
  'multiple' => true,
  'expanded' => true,
  'choices'  => Doctrine_Core::getTable('Issue')->getIssuesForSelect(),
));

然后将方法添加到IssueTable.class.php,返回带有标题的问题ID的嵌套数组,按杂志标题分组,它应该类似于:

array(
  'Magazine 1' => array(
    17 => 'Issue 1',
    18 => 'Issue 2',
    28 => 'Issue 3',
  ),
  'Magazine 2' => array(
    11 => 'Issue 26',
    19 => 'Issue 27',
    29 => 'Issue 28',
  ),
);