Symfony / Doctrine - Как отфильтровать поле формы по свойству в связанной модели - PullRequest
2 голосов
/ 30 мая 2010

У меня есть класс UserForm, у которого есть список выбора, заполненный из связанной модели (заданной иностранным отношением в yml) следующим образом:

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

Я бы хотел отфильтровать объекты отчета, полученные из этого отношения, по одному из полей отчета, «активным», чтобы в форме отображались только отчеты с активным = 1.

У меня есть метод ReportTable :: GetActiveReports (), который выполняет соответствующий запрос и возвращает отфильтрованные отчеты. Поэтому одним из вариантов является заполнение виджета результатами этой функции. Любые советы по синтаксису, чтобы сделать это?

Мне кажется, что более чистый способ - использовать класс UserFormFilter для фильтрации отчетов по active = 1. К сожалению, я не смог найти какую-либо документацию о том, как использовать фильтры форм (или действительно, какие они есть), так что, возможно, это не правильное решение. Является ли фильтр формы подходящим инструментом для этой работы? Кажется, я должен использовать класс Doctrine_Record_Filter_Standard, как здесь определено: http://www.doctrine -project.org / api / orm / 1.2 / doctrine / doctrine_record_filter_standard.html Но мне не понятно соответствующее использование.

Любое руководство будет полезным. Спасибо! Dan

1 Ответ

1 голос
/ 30 мая 2010

Самый быстрый способ сделать это - сохранить имеющийся у вас код, но просто слегка его настроить.

В вашей модели реализуйте метод, который просто возвращает объект запроса для требуемых записей, но без execute() его. В основном объект запроса, который вы создаете в своем методе GetActiveReports() (вы можете затем изменить этот метод, чтобы использовать новый метод).

Тогда в вашем классе:

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

Затем виджет должен использовать указанный объект запроса для извлечения правильно отфильтрованных записей.

...