Organiser une liste par catégorie, avec une seul table

Par idris, il y a 14 ans


Bonjour, je suis nouveau sur le forum et sur cakephp.

J'ai entamé le développement d'un portfolio et j'ai une requête a priori très simple, mais que je n'arrive pas à solutionner.

Alors voila j'ai une table projet avec des enregistrements et un certain nombre de champs ( titre, description, type, client … et année)
Je recherche à afficher dans ma view une liste des enregistrements triés par année avec un titre ( l'année) pour séparer chaque série de projets de la même année.

Ex

Voila, j'espère que quelqu'un pourra m'aider, par ailleurs j'espère que la solution me permettra de faire la même chose, mais par type cette fois.

Merci d'avance pour votre aide.

7 réponses

Flohw, il y a 14 ans

avec un group by ? apres il faut formater le résultat mais je ne sais pas comment il le serait (le resultat) donc à toi de voir

le group by n'est peut etre pas LA solution, c'est la plus évidente que j'ai trouvée

idris, il y a 14 ans

Alors sauf erreur de ma part le group by ne me retourne qu'un seul enregistrement par année. Alors que j'ai plusieurs enregistrements qui portent la même année.

J'avais pensé d'abord de faire une requête find Group BY pour trouver les années et une requête pour trouver les enregistrements par année ( grâce à ma première requête) et d'enregistrer tout cela dans un tableau imbriqué. Mais je ne sais comment procéder.

Voilà mon contrôleur goupby peut-être que je le paramètre mal ?

$annees = $this->Projet->find('all',array
(
'group' => array('Projet.annee'), // champs pour le GROUP BY ));
$this->set('annees', $annees);

et voici le résulta

Array (   
[0] => Array (   
[Projet] => Array (   
[id] => 2 [titre] => Commodo [sous_titre] => Bibendum Aenean Ipsum [lieu] => Justo [montant_des_travaux] => 3 665 000 € [mandataire] => Ipsum [partenaire] => Amet Lorem Pellentesque Vestibulum [description] => Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero, a [annee] => 2002 [maitre_d_ouvrage] => Ville machin [programation] => Aménagement urbain )   
)   
[1] => Array (   
[Projet] => Array (   
[id] => 1 [titre] => Le super projet [sous_titre] => qui est vraimen bien [lieu] => La ville [montant_des_travaux] => 2 640 000 € [mandataire] => Nous evidement [partenaire] => Il sont nombreux et pas tous trop cool [description] => Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.   
[annee] => 2003 [maitre_d_ouvrage] => Ville de bandol [programation] => Ecole )   
)   
[2] => Array (   
[Projet] => Array (   
[id] => 3 [titre] => Le super projet [sous_titre] => qui est vraimen bien [lieu] => La ville [montant_des_travaux] => 2 640 000 € [mandataire] => Nous evidement [partenaire] => Il sont nombreux et pas tous trop cool [description] => Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.   
[description_courte] => Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.   
[annee] => 2005 [maitre_d_ouvrage] => Toc Promotion [programation] => Logements )   
)
)
Grafikart, il y a 14 ans

Ma solution :
une fois que tu as $annees tu fais :

$annees = Set::combine($annees,'{n}.Projet.id','{n}.Projet','{n}.Projet.annee');

Ca fait peur au début mais combine permet de réorganiser des tableau facilement.

idris, il y a 14 ans

Alors je ne suis pas sure de comprendre ? J'ai regarder dans le cookbook mais je n'arrive pas à bien saisir de quel manière cela va m'aider

J'aimerai pourvoir obtenir une variable dont je puisse me servie de cette manière dans la vue

<?php foreach ($annees as $annee): ?>

        <div class="bloc_about"><h2> + <?php echo $annee'Projet']'annee']; ?></h2></div>

        <?php foreach ($projets as $projet):?>

            <div class="bloc_projet">
                <p style="projet"><span class="titre_projet"><?php echo $projet'Projet']'titre']; ?></span>
                    <span class="sous_titre_projet"> // <?php echo $projet'Projet']'sous_titre']; ?></span> - 
                    <span class="maitredouvrage_projet"><?php echo $projet'Projet']'maitre_d_ouvrage']; ?></span> - 
                    <span class="anne_projet"><?php echo $projet'Projet']'annee']; ?></span> - 
                    <span class="type_projet"><?php echo $projet'Projet']'programation']; ?></span> - 
                    <span class="descriptif_projet"><?php echo $projet'Projet']'description_courte']; ?></span> -  
                    <span class="montant_projet"><?php echo $projet'Projet']'montant_des_travaux']; ?></span>
                </p>
            </div>
                    <p class="control_db"> 
                        <?php echo $this->Html->link( 'editer', array("controller" => "projets","action" => "edit", $projet'Projet']'id']));?>
                        <?php echo $this->Html->link( 'supprimer', array("controller" => "projets","action" => "delete", $projet'Projet']'id']));?>
                    </p>
        <?php endforeach; ?>

    <?php endforeach; ?>

Merci pour votre patience

Grafikart, il y a 14 ans

Après ton find fait juste

$annees = Set::combine($annees,'{n}.Projet.id','{n}.Projet','{n}.Projet.annee');

Puis fait ton set()

t0mweb, il y a 14 ans

Petite précision sur la réponse apporté par Grafikart. Ton find doit se faire sans le 'group', qui te limite en effet comme tu l'as dit, à un seul résultat par année.
Le 'combine' va te permettre d'obtenir ton tableau $annees sous la forme qui suit et d'annuler la redondance du champ 'annee' :

Array(
    [Projet.annee] => Array(                
        [Projet.id] => Array(                        
            [Projet.id] => id_du_projet
            [Projet.titre] => titre_du_projet
            [Projet.soustitre] => soustitre_du_projet
        ),
        [Projet.id] => Array(                        
            [Projet.id] => id_du_projet
            [Projet.titre] => titre_du_projet
            [Projet.soustitre] => soustitre_du_projet
        )
    ),
    [Projet.annee] => Array (...)
)

En espérant que cela t'aidera.

idris, il y a 14 ans

Merci j'ai eu un peu de mal à mettre en forme cet array, n'ayant pas l'habitude, mais merci je suis parvenu à mes fins.
Set combine : et une fonction très pratique.

À bientôt