Symfony sfWidgetFormDoctrineChoice有多个选项

时间:2012-01-04 17:28:06

标签: php symfony1 doctrine

我创建了一个表单,其中我嵌入了另一个表单。我的问题是关于这个嵌入式表单 - 我正在使用一个sfWidgetFormDoctrineChoice小部件,其中选项multiple设置为true。此嵌入表单的配置方法的代码:

public function configure()
  {
    unset($this['prerequisite_id']);
    $this->setWidget('prerequisite_id', new sfWidgetFormDoctrineChoice(array(
        'model' => 'Stage',
        'query' => Doctrine_Query::create()->select('s.id, s.name')->from('Stage s')->where('s.workflow_id = ?', $this->getOption('workflow_id') ),
        'multiple' => true
    )));

    $this->setValidator('prerequisite_id', new sfValidatorDoctrineChoice(array(
        'model' => 'Stage',
        'multiple' => true,
        'query' => Doctrine_Query::create()->select('s.id, s.name')->from('Stage s')->where('s.workflow_id = ?', $this->getOption('workflow_id') ),
        'column' => 'id'
    )));
  }

我取消设置prerequisite_id字段,因为它包含在基本表单中,但我希望它是一个多选。 现在,当我添加验证器时,一切似乎都有效(它通过了验证),但是如果发送了多个选择,它似乎在保存记录方面存在问题。

我在提交表单后收到此PHP警告:

  

警告:strlen()期望参数1为字符串,数组为   d:\开发\ WWW \ flow_dms \ LIB \供应商\ symfony的\ LIB \插件\ sfDoctrinePlugin \ LIB \数据库\ sfDoctrineConnectionProfiler.class.php   在第198行

以及更多 - 我知道,为什么 - 在symfony的调试模式中,我可以在堆栈跟踪中看到以下内容:

  

在Doctrine_Connection-> exec('INSERT INTO stage_has_prerequisites   (prerequisite_id,stage_id)VALUES(?,?)',array(array('12','79'),   '103'))

所以,Symfony所做的是向Doctrine发送一系列选择 - 正如我在debug sql查询中看到的那样,Doctrine无法正确呈现查询。

任何想法如何解决?我需要为两个选项生成两个查询:

INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (12, 103);
INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (79, 103);

stage_id总是一样的(我的意思是,它是通过嵌入它的形式设置在这个表单之外的。)

我已经花了4个小时处理这个问题,所以也许有人能够提供一些帮助。

1 个答案:

答案 0 :(得分:0)

好吧,我似乎找到了一个解决方案(尽管不是最好的解决方案,我猜)。希望它对某人有帮助。

最后,经过深思熟虑,我得出结论,如果问题来自Doctrine_Record如果遇到数组而不是单个值就无法保存记录,那么最简单的解决方案就是覆盖{{1 } save()的方法。这就是我所做的:

Doctrine_Record

所以现在如果遇到数组而不是单个值,它只会创建一个临时对象并为每个数组的值保存它。

绝对不是一个优雅的解决方案,但它确实有用(请记住,它是针对数据的特定结构编写的,这只是我的方法的影响,即在调试模式中查看错误然后尽量纠正它)。