Oui il me renvoie bien que 2 résultat
Version imprimable
Oui il me renvoie bien que 2 résultat
Il faut que je trouve le temps de faire des essais. Il n'y a pas de raison pour que cela ne marche pas.
Peux-tu déposer ton shema.yml et ton fixature.yml sur le forum ?
Voila les fichiers merci a toi.
Bon, j'ai récupéré le schéma, créé la base et introduit 12 chapitres.
Mais, avec tous nos essais, je ne sais plus ce que tu veux réalisé...
Un petit point sur ce que tu cherches ...
Et si tu peux mettre un zip du module tel que tu l'as commencé... cela serait un plus intéressant.
Pour le module ca va pas être facile car j'ai fais d'autre trucs qui n’ont rien à voir la pagination et donc ca risque de rentre le truc complexe sinon ce que je veux est assez simple c'est une pagination avec les chapitre mais bien sur en utilisant un DISTINCT pour enlever les doublons.
Merci a toi
Tu veux la liste des chapitres, pour un intitulé, mais sans doublon dans les chapitres ?
Oui exactement merci a toi
Mais je ne comprend plus alors, d'où vient la notion de compter ?
Et pourquoi pourrait-il y avoir plusieurs chapitres identiques dans la base ?
Car plusieurs page peuvent être dans le même chapitre donc voila pourquoi plusieurs page peuvent avoir le même chapitre.
J'ai un peu joué.
J'ai créé un module intitule qui m'affiche la liste des intitulés avec le nombre de chapitre (donc je compte par page distinctes). Je suis parti sur une base générée simple :
frontend intitule intitule --non-verbose-templates --with-doctrine-route
et une route adaptée
le model_methods permettant d'indiquer la méthode de l'objet intituleTable à utiliser pour récupérer les données.Code:
1
2
3
4
5
6
7
8
9 intitule: class: sfDoctrineRouteCollection options: model: intitule prefix_path: intitule module: intitule model_methods: list: doIntitule
La méthode rajoutée dans intituleTable
Et, pour finir joliment, le template modifier pour l'action indexCode:
1
2
3
4
5
6
7
8
9
10 public static function doIntitule() { $q = Doctrine_Query::create() ->from( 'intitule i' ) ->leftJoin( 'i.monTexte m' ) ->groupBy( 'i.id' ) ->select( 'i.*, COUNT(DISTINCT m.num_page) AS nb_chapitre' ); return $q->execute(); }
J'avoue que j'ai un peu galéré sur la requête qui refusait obstinément de passer. En fait, il faut utiliser un nom de champs, il n'est pas possible d'utiliser un count(m.*) par exemple. De toutes les manières, il vérifierait tous les champs et ... plouf. Vu que le texte est différents.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 <h1>Intitules List</h1> <table> <thead> <tr> <th>Id</th> <th>Id user</th> <th>Title</th> <th>Nb chapitre</th> </tr> </thead> <tbody> <?php foreach ($intitules as $intitule): ?> <tr> <td><a href="<?php echo url_for('intitule/edit?id='.$intitule->getId()) ?>"><?php echo $intitule->getId() ?></a></td> <td><?php echo $intitule->getIdUser() ?></td> <td><?php echo $intitule->getTitle() ?></td> <td><?php echo $intitule->getNbChapitre() ?></td> </tr> <?php endforeach; ?> </tbody> </table> <a href="<?php echo url_for('intitule/new') ?>">New</a>
Ceci répond-t-il à ta question ?
J'ai bien compris ta requéte sauf que la elle est pas utilisé dans la pagination de symfony et que pour mon cas le leftJoin est inutile car j'affiche le contenu de "monTexte" avec un where sur l'id de l'intitule choisi.
Merci a toi
Je dois dire que le sfPager, me sort un peu par les oreilles !
Mais.... (roulement de tambours)
Je pense que j'ai, enfin, la solution.
Je reste sur mon exemple, qui ne colle pas parfaitement, l'idée est : mais comment qu'on peut récupérer ce f$#@u code select dans le sfPager).
Il faut dans l'objet intituleTable créer une méthode qui retourne la requête ET qui prend, en paramètre un doctrine_query qui pourrait être vide...
j'ai gardé la doIntitule pour vérification et compatibilité et parce que, coté code et méthode, cela peut présenter un intérêt.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public static function getIntituleDql( Doctrine_Query $q = null ) { $q = ( is_null( $q ) ) ? Doctrine_Query::create()->from( 'intitule i' ) : $q; $q->leftJoin( 'i.monTexte m' ) ->groupBy( 'i.id' ) ->select( 'i.*, COUNT(DISTINCT m.num_page) AS nb_chapitre' ); return $q; } public static function doIntitule() { $q = self::getIntituleDql(); return $q->execute(); }
Ensuite on introduit le sfDoctrinePager dans l'action. Attention, j'ai fais un code volontairement édulcoré, il n'y a pas de gestion de la page.
Code:
1
2
3
4
5
6
7 public function executeIndex( sfWebRequest $request ) { $this->intitules = new sfDoctrinePager( 'intitule', 10 ); $this->intitules->setTableMethod( 'getIntituleDql' ); $this->intitules->setPage( 1 ); }
- Création d'un objet sfDoctrinePager, on précise la table et le nombre de ligne par pages
- On précise la méthode de l'objet du modèle qui sera utilisée pour récupérer le query
- non utilisé ici, mais on pourrait préciser des closes complémentaire dans le query par un ->setQuery()
- on récupère le numéro de la page et on l'indique au pager (heu, en temps normal)
Et, avec cette méthode, miracle (heu non, logique, mais il fallait trouver), le select est correctement passé et nous retrouvons toutes les données nécessaires.
Ouf. :ccool:
Chapeau l'artiste ca marche nickel, je te remercie de ton aide ca m'enlève une épine du pied.
Juste une dernière question, car pour être sur que j'affiche le bon texte par rapport a l'intitulé choisi il faut que je rajoute un Where avec un getParameter dans la fonction ?
Encore merci pour ton aide.
En faite je répons moi même a mes question :) car le mieux c de rajouter un $this->intitules->getQuery()->where() directement de l'executeIndex est ca marche nickel.
Encore merci.
Ce n'était pas simple comme problème.
Un cas rare et, un peu, tordu.
Il ne te reste plus qu'a fracasser le bouton :resolu: pour ce terminer en beauté.
Voila c'est fait merci encore ;)