2010-05-29 56 views
2

我有具有从相关模型(由阳明海运外国关系中指定)填充的选择列表中的用户窗体类过滤器表单域,像这样:的Symfony /原则 - 如何通过房地产相关模型

$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

最快的方法来做到这一点将与现有的代码保持一致,但只是略微调整。

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

然后,在你的窗体类:

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

小部件应再使用指定的查询对象检索正确过滤记录。

+0

感谢这工作得很好!夫妇跟随ups,因为我仍然在学习基本知识...... 1.查询如何与模型一起工作?之前我猜想它基于相关模型计算出背后的查询?而现在,因为我正在定义一个查询,它覆盖了它?我可以查看的文档上的任何提示解释了模型和查询属性的工作方式? 2.仍然想知道如何使用FormFilters,因为这似乎是最优雅的解决方案。关于表单过滤器的解释以及它们如何使用的文档上的任何提示? 谢谢! – Dan 2010-05-30 21:43:06

+0

很高兴工作:-)快速回答:1)默认情况下,Doctrine只是检索给定模型的所有记录,如果你不指定查询。如果你这样做,它使用该查询来检索它。 2)我只在管理生成器模块中使用的过滤器类,而不是其他地方 - docs有点稀疏,不幸的是:-( – richsage 2010-05-31 03:38:15