【问题标题】:Symfony sfWidgetFormDoctrineChoice with multiple option on带有多个选项的 Symfony sfWidgetFormDoctrineChoice
【发布时间】:2012-01-04 17:28:05
【问题描述】:

我创建了一个表单,我在其中嵌入了另一个表单。我的问题是关于这个嵌入式表单 - 我正在使用一个 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:\Development\www\flow_dms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\database\sfDoctrineConnectionProfiler.class.php 在第 198 行

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

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

所以,Symfony 所做的就是向 Doctrine 发送一系列选择 - 正如我在调试 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 个小时来解决这个问题,所以也许有人可以提供一些帮助。

【问题讨论】:

  • 改为编辑可以回答的问题可以接受答案

标签: php symfony1 doctrine


【解决方案1】:

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

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

class StageHasPrerequisites extends BaseStageHasPrerequisites
{
  public function save(Doctrine_Connection $conn = null)
  {
    if( is_array( $this->getPrerequisiteId() ) )
    {
      foreach( $this->getPrerequisiteId() as $prerequisite_id )
      {
        $obj = new StageHasPrerequisites();
        $obj->setPrerequisiteId( $prerequisite_id );
        $obj->setStageId( $this->getStageId() );
        $obj->save();
      }
    }
    else
    {
      parent::save($conn);
    }
  }

  (...)

}

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

绝对不是一个优雅的解决方案,但它确实有效(请记住,它是针对数据的特定结构编写的,这只是我的方法的效果,即 查看调试模式中的问题,然后尝试以任何可能的方式纠正它)。

【讨论】:

  • 嗯,这似乎不是一个合法的解决方案,它只是一种解决方法。今天我在我的一个模块中遇到了同样的(我认为是这样的)问题,但在我的情况下,问题出现在总标准值上。 (父)外键。我的模型 A 拥有外键 B,并且该键被数组()包装。这是病态的教义魔法,我不知道问题出在哪里。
  • 是的,这只是一种解决方法,但我还没有找到任何其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多