2010-05-29 4 views
2

J'ai une classe UserForm qui a une liste de sélection peuplée d'un modèle connexe (spécifié par une relation étrangère dans le YML) comme ceci:Symfony/Doctrine - Comment filtrer champ de formulaire par la propriété dans le modèle lié

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

Je souhaite filtrer les objets Report issus de cette relation par l'un des champs de rapport, "active" de sorte que seuls les états avec active = 1 apparaissent dans le formulaire.

J'ai une méthode, ReportTable :: GetActiveReports() qui effectue la requête appropriée et renvoie les rapports filtrés. Une option consiste donc à remplir le widget avec les résultats de cette fonction. Des conseils sur la syntaxe pour le faire?

Il me semble que le plus simple est d'utiliser la classe UserFormFilter pour filtrer les rapports par active = 1 là. Malheureusement, je n'ai pas trouvé de documentation sur la façon d'utiliser les filtres de formulaire (ou vraiment ce qu'ils sont), alors peut-être que ce n'est pas la bonne solution. Un filtre de formulaire est-il l'outil approprié pour ce travail? Il semble que je devrais utiliser la classe Doctrine_Record_Filter_Standard comme défini ici: http://www.doctrine-project.org/api/orm/1.2/doctrine/doctrine_record_filter_standard.html Mais l'utilisation appropriée n'est pas claire pour moi.

Des instructions seraient utiles. Merci! Dan

Répondre

1

Le moyen le plus rapide de le faire serait de conserver le code existant, mais en le modifiant légèrement.

Dans votre modèle, implémentez une méthode qui renvoie simplement l'objet de requête pour les enregistrements requis, mais sans le execute(). Fondamentalement, l'objet de requête que vous créez dans votre méthode GetActiveReports() (vous pouvez ensuite refactoriser cette méthode pour utiliser la nouvelle méthode).

Ensuite, dans votre classe de formulaire:

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

Le widget doit alors utiliser l'objet de requête spécifié pour récupérer les enregistrements de droite filtrés.

+0

Merci cela a bien fonctionné! Suivi de couple, puisque j'apprends toujours les fondamentaux ... 1. Comment la requête fonctionne-t-elle avec le modèle? Avant que je devine il a compris la question derrière les scènes basées sur le modèle relatif? Et maintenant que je définis une requête, elle l'annule? Des conseils sur un document que je peux regarder qui explique comment fonctionnent les propriétés du modèle et de la requête? 2. Vous vous demandez toujours comment utiliser FormFilters, car cela semble être la solution la plus élégante. Des conseils sur les documents avec une explication sur les filtres de formulaire et comment ils sont utilisés? Merci! – Dan

+0

Heureux que cela a fonctionné :-) réponses rapides: 1) Par défaut, Doctrine récupère simplement tous les enregistrements pour le modèle donné si vous ne spécifiez pas de requête. Si vous le faites, il utilise cette requête pour le récupérer. 2) La classe de filtre que j'ai seulement utilisé dans le module de générateur d'admin et pas ailleurs - docs sont malheureusement un peu clairsemés cependant :-( – richsage

Questions connexes