Symfony / Doctrine - 如何按相关模型中的属性过滤表单字段

时间:2010-05-29 23:14:43

标签: symfony1 doctrine symfony-forms

我有一个UserForm类,它有一个从相关模型填充的选择列表(由yml中的外来关系指定),如下所示:

$this->setWidget('report_id', new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Report'))));

我想通过其中一个“报告”字段过滤来自此关系的“报告”对象,“活动”,以便只在表单中显示带有active = 1的报告。

我有一个方法,ReportTable :: GetActiveReports(),它执行适当的查询并返回过滤的报告。因此,一个选项是使用该函数的结果填充Widget。有关语法的任何提示吗?

在我看来,更清晰的方法是使用UserFormFilter类通过active = 1过滤报告。不幸的是我找不到任何关于如何使用表单过滤器的文档(或者它们真的是什么),所以这可能不是正确的解决方案。表单过滤器是否适合此工作? 看来我应该使用这里定义的Doctrine_Record_Filter_Standard类:http://www.doctrine-project.org/api/orm/1.2/doctrine/doctrine_record_filter_standard.html 但我不清楚它的适当用法。

任何指导都会有所帮助。谢谢! 丹

1 个答案:

答案 0 :(得分:1)

最快的方法就是保留现有的代码,只需稍微调整一下。

在您的模型中,实现一个方法,该方法只返回所需记录的查询对象,但没有execute()。基本上是您在GetActiveReports()方法中创建的查询对象(然后您可以重构此方法以使用新方法)。

然后,在您的表单类中:

$queryObject = Doctrine::getTable("Report")->GetActiveReportsQuery();
$this->setWidget('report_id',
  new sfWidgetFormDoctrineChoice(array(
    'model' => $this->getRelatedModelName('Report'),
    'query' => $queryObject)
  )
);

然后,窗口小部件应使用指定的查询对象来检索正确的过滤记录。