我创建了一个表单,其中我嵌入了另一个表单。我的问题是关于这个嵌入式表单 - 我正在使用一个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个小时处理这个问题,所以也许有人能够提供一些帮助。
答案 0 :(得分:0)
好吧,我似乎找到了一个解决方案(尽管不是最好的解决方案,我猜)。希望它对某人有帮助。
最后,经过深思熟虑,我得出结论,如果问题来自Doctrine_Record如果遇到数组而不是单个值就无法保存记录,那么最简单的解决方案就是覆盖{{1 } save()
的方法。这就是我所做的:
Doctrine_Record
所以现在如果遇到数组而不是单个值,它只会创建一个临时对象并为每个数组的值保存它。
绝对不是一个优雅的解决方案,但它确实有用(请记住,它是针对数据的特定结构编写的,这只是我的方法的影响,即在调试模式中查看错误然后尽量纠正它)。