Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > HTML / DHTML / XHTML
HTML / DHTML / XHTML Forum sur la programmation HTML / DHTML/ XHTML et la validation W3C. Cours (X)HTML, FAQ (X)HTML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 10/08/2009, 19h52   #1
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut Changer l'orientation d'une colonne d'un tableau

Bonjour,
Je cherche à savoir si je vais pouvoir aisément changer l'orientation d'une colonne d'un tableau pour le passer à plusieurs dimensions.

Imaginez à l'origine un tableau avec les éléments suivants en colonne :
"Type de produit", "Produit", "Année", "Semaine", "Chiffre d'affaires".

Les années et les semaines apparaissent en ligne et je veux au contraire les faire apparaitre en colonne pour avoir au final un tableau avec la catégorie, le produit puis une colonne pour chaque couple année/semaine, sachant que je ne connais pas à l'avance le nombre de couple année/semaine. L'intersection indique le chiffre d'affaires.

Je ne sais pas si c'est possible, j'imagine que oui, dans ce cas vers quoi dois je me diriger pour trouver la solution, javascript, php (et/ou le framework, ici cakephp), sql, si quelqu'un sait m'orienter cela me fera gagner du temps.
Merci
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/08/2009, 23h04   #2
Membre habitué
 
Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
Par défaut

Salut,

Pour faire ton tableau, le plus simple sera du html. Pour le contenu, ça dépend comment tu comptes récupérer t'es données : tu les rentres à la main, tu effectues une requête sur une bdd, tu incrémentes un tableau en php, ...

Selon la solution, la méthode sera différente (enfin entre html et php). je te déconseille le javascript pour gérer le contenu.

Pour ton tableau, je pense que tu veux obtenir quelque chose comme ça :

Code html :
 
<table>
	<tr>
		<td>&nbsp;</td>
		<td>Année</td>
		<td>Semaine</td>
	</tr>
	<tr>
		<td>Type de pproduit</td>
<!-- t'es données sont insérées ici -->
	</tr>
	<tr>
		<td>Produit</td>
<!-- et ici -->
	</tr>
</table>
 
Doki95 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/08/2009, 11h08   #3
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour,
Je me suis mal expliqué désolé. En effet les données proviennent d'une requête, plus précisément via php (avec le framework cakephp) et celles-ci à l'origine ont un format classique qui correspondrait au tableau suivant :
Code :
<table>
            <tr>
              <td>Type de Produit</td>
              <td>Produit</td>
              <td>Annee</td>
              <td>Semaine</td>
              <td>Chiffre d'affaires</td>
            </tr>
            <tr>
              <td>sejour</td>
              <td>Hotel x</td>
              <td>2009</td>
              <td>5</td>
              <td>2589</td>
            </tr>
</table>
 
Je veux quant à moi obtenir un tableau différent qui va transposer les années et semaine en colonne, cela ferait qq chose comme cela :
Code :
<table>
    <tr>
      <td rowspan="2">  <p>Type de Produit</p> </td>
      <td rowspan="2">  <p>Produit</p> </td>
      <td>2009</td>
      <td>2009</td>
      <td>2009</td>
    </tr>
    <tr>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <td>sejour</td>
      <td>hotel x</td>
      <td>1568</td>
      <td>2589</td>
      <td>3456</td>
    </tr>
    <tr>
      <td>croisiere</td>
      <td>croisiere y</td>
      <td>4524</td>
      <td>1587</td>
      <td>5264</td>
    </tr>
</table>
 
Pour le moment mes recherches vont vers sql avec du sql dynamique, j'ai aussi trouvé un lien intéressant ici : http://moko.developpez.com/articles/...ise-php-mysql/
Je me demande cependant s'il n'y a pas un moyen via javascript mais n'y connaissant rien ce ne sont que des hypothèses.

Si quelqu'un à des idées, merci.
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/08/2009, 11h37   #4
Membre habitué
 
Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
Par défaut

En effet c'est un peu plus compliqué que ce que je pensais.

Quand tu effectues ta requête, qu'est ce que tu récupères ?
(année, semaine, produit, type de produit, etc)

J'avais effectué un traitement qui créer un tableau automatiquement, un peu ce que tu veux faire (bon le mien était dans l'autre sens, mais ça revient au même). Pour ma part, je l'ai fait en php.

Je peux essayer de te donner un coup de main mais ça risque d'être un peu long quand même.

Doki.
Doki95 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/08/2009, 11h45   #5
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour,
La requête récupère effectivement les données en ligne, cad :
"SELECT [type de produit ], [produit] , [année], [semaine], [Chiffre d'affaires] FROM ..."

En fait pour le moment je ne suis pas encore face aux problèmes mais j'anticipe et je me pose les questions à venir.

Pour le moment je ne vois que deux solutions :
- soit créer dynamiquement la requête en php (en espérant que je puisse le faire dans cakephp)
- soit créer cela sous mysql avec du sql dynamique (c'est surtout là que je creuse car je n'y connais rien en développement web, enfin pour le moment)

Merci pour ton aide.
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/08/2009, 12h07   #6
Membre habitué
 
Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
Par défaut

Avec cake, c'est tout a fait possible. Je l'ai déjà utiliser pour ce genre de requête.

Pour l'affichage, effectivement tu peux utiliser du sql dynamique, mais là je ne pourrais pas être d'une grande aide. Je ne connais pas du tout.

Si tu veux le faire en php (ce que j'avais fait), il faudra imbriquer plusieurs boucle pour générer automatiquement ton tableau.
Doki95 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/08/2009, 10h40   #7
Nouveau membre du Club
 
Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
Par défaut

Citation:
Envoyé par patic Voir le message
Bonjour,
La requête récupère effectivement les données en ligne, cad :
"SELECT [type de produit ], [produit] , [année], [semaine], [Chiffre d'affaires] FROM ..."

En fait pour le moment je ne suis pas encore face aux problèmes mais j'anticipe et je me pose les questions à venir.

Pour le moment je ne vois que deux solutions :
- soit créer dynamiquement la requête en php (en espérant que je puisse le faire dans cakephp)
- soit créer cela sous mysql avec du sql dynamique (c'est surtout là que je creuse car je n'y connais rien en développement web, enfin pour le moment)

Merci pour ton aide.
Bonjour,

Je ne suis pas sûr d'avoir entièrement compris ce que tu veux faire mais je pense que le plus simple est de manipuler le tableau retourné par la méthode find() de ton modèle, afin qu'il ait la forme désirée.

Tu peux faire ceci soit dans le modèle, le contrôleur voir même la vue ... mais là celà dépend du meilleur endroit (conceptuellement) où cette transformation doit avoir lieu, en fonction de la signification qu'elle a : si ce n'est que de l'affichage alors il faut le faire dans la vue (avec un Helper par exemple), autrement une méthode "getCustomFormat" du modèle serait plus appropriée.

Pour effectuer la manipulation du tableau de résultat je t'invite à regarder du côté de la librairie Set du framework. Elle propose de nombreuses méthodes permettant de changer l'arborescence de tableaux de manière intuitive, voir l'exemple de Set::combine().

Ceci n'est qu'un avis, mais je le répète je ne suis pas sûr d'avoir saisi ce que tu souhaites faire ...

Pierre
real34 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/08/2009, 11h32   #8
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour
Merci pour ton aide, je vais regarder cela en détail dès que j'ai un moment.

Depuis j'ai creusé un peu et j'ai trouvé le début pour le faire sous php en créant dynamiquement la requête, je me suis aidé du tuto ici : http://moko.developpez.com/articles/...ise-php-mysql/

Un exemple vaut mieux qu'un long discours :

D'abord la base de données :
Code :
 
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `produit` varchar(50) COLLATE latin1_general_cs DEFAULT NULL,
  `annee` smallint(6) DEFAULT NULL,
  `semaine` varchar(2) COLLATE latin1_general_cs DEFAULT NULL,
  `CA` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
 
-- Contenu de la table `test`
 
INSERT INTO `test` (`id`, `produit`, `annee`, `semaine`, `CA`) VALUES
(1, 'hotel x', 2009, '4', 1500),
(2, 'hotel x', 2009, '5', 1900),
(3, 'hotel x', 2009, '6', 1800),
(4, 'hotel y', 2009, '3', 500),
(5, 'hotel y', 2009, '5', 350);
 
Imaginons que je veuille récupérer ces données :
Code :
 
SELECT produit, semaine FROM test
 
Mon problème est que tout cela est en ligne, je veux pivoter les semaines en colonne et indiquer le CA au croisement.

En sql cela donnerait ceci :
Code :
SELECT produit
,SUM( IF(semaine = 3 , semaine , 0)) AS '3'
,SUM( IF(semaine = 4 , semaine , 0)) AS '4'
,SUM( IF(semaine = 5 , semaine , 0)) AS '5'
,SUM( IF(semaine = 6 , semaine , 0)) AS '6'
FROM test
GROUP BY produit
 
Tu vas me dire alors que je sais le faire mais le problème est que je ne suis pas censé connaitre à l'avance les semaines donc le résultat doit dépendre de la liste des semaines contenues dans la table.

En sql dynamique je cherche encore mais avec php j'ai trouvé la solution suivante :
Code :
 
<?php
$connexion = mysqli_connect("127.0.0.1","root","","cakedev") or die ("la connection à la bdd ne fonctionne pas");
$db = mysqli_select_db($connexion, "cakedev") or die ("la base ne peut pas être sélectionnée");
 
$req = "SELECT DISTINCT semaine FROM test ORDER BY semaine";
$result = mysqli_query($connexion, $req) or die ("la requête ne fonctionne pas");
 
	$ListeSemaine=array();
	while($ligne=mysqli_fetch_assoc($result))
        {$ListeSemaine[]=$ligne['semaine'];};
        
        print_r($ListeSemaine);
        mysqli_free_result($result);
        
        $groupes=NULL;
        foreach($ListeSemaine as $item){
        $groupes.=" ,SUM(IF(semaine='$item',CA,0))
                     AS 'Sem_".$item."'";
        }
        
        echo "<br/><br/>";
        print_r($groupes);
        echo "<br/><br/>";
        
        
        $sql="SELECT produit $groupes
          FROM test
          GROUP BY produit";
    echo "\n"; /* pour voir le source de la requête soumise à MySQL
                         en commentaire dans le source HTML de la page */
    
        $result=mysqli_query($connexion, $sql) or die ("la requête ne fonctionne pas");
    /* ici on parcourt le résultat pour affichage, édition
       ou génération d'un document pdf (avec FPDF par exemple) */
     
        $ligne=mysqli_fetch_assoc($result);
 
mysqli_close($connexion);
?>
Après je suis bloqué car je ne sais pas renvoyer tout cela dans une variable array et construire dynamiquement un tableau qui prenne en compte toutes les colonnes. Je débute totalement en développement web ce n'est pas facile d'avancer.

Merci encore pour ton aide je vais jeter un œil à tes recommandations.
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/08/2009, 16h23   #9
Nouveau membre du Club
 
Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
Par défaut

Bonjour,

En fait je pensais a quelque chose comme ca (full PHP une fois que tu as recupere tes donnees) :
Code :
 
// Controleur
<?php 
$resu = array();
$semaines = array();
foreach ($tests as $test) {
	if (!in_array($test['Test']['semaine'], $semaines)) {
		$semaines[] = $test['Test']['semaine'];
	}
	$resu[$test['Test']['produit']][$test['Test']['semaine']] = $test['Test']['CA'];
}	
?>
 
Code :
 
// Vue 
<table>
	<tr>
	<?php foreach($semaines as $semaine):?>
		<td><?php echo $semaine?></td>
	<?php endforeach;?>
	</tr>
<?php foreach($resu as $produit => $vals):?>
	<tr>
	<?php foreach($semaines as $semaine):?>
		<td><?php echo $vals[$semaine]?></td>
	<?php endforeach;?>
	</tr>
<?php endforeach;?>
</table>
real34 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/08/2009, 16h22   #10
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour,
Merci pour tes infos, malheureusement je ne suis pas trop et n'ai donc pas pu tester, enfin pas pour le moment. En fait dans mon contrôleur j'ai une gestion par objet (POO) et là tu me donnes un script procédural, du coup je suis un peu perdu.
Merci quand même pour ton aide, cela me servira juste un peu plus tard quand tout cela sera plus clair pour moi.
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 15/08/2009, 13h14   #11
Nouveau membre du Club
 
Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
Par défaut

Citation:
Envoyé par patic Voir le message
Bonjour,
Merci pour tes infos, malheureusement je ne suis pas trop et n'ai donc pas pu tester, enfin pas pour le moment. En fait dans mon contrôleur j'ai une gestion par objet (POO) et là tu me donnes un script procédural, du coup je suis un peu perdu.
Merci quand même pour ton aide, cela me servira juste un peu plus tard quand tout cela sera plus clair pour moi.
Bonjour patic,

J'ai eu un peu de temps durant le week-end j'ai essayé d'en faire une implémentation concrète (ce message est un doublon de celui posté dans la discussion ouverte sur forum.cakephp-fr.org).

Ce problème est très intéressant et je n'ai pas la prétention d'y apporter une réponse absolue, mais je pense que ce qui est détaillé après permet de résoudre ton problème.

Le code est entièrement disponible sur mon compte github, dans une branche à part : http://github.com/real34/CakeTest/tree/groupby
Il suffit de le télécharger et de configurer la base de données, puis de créer la table en utilisant cake schema run create ... de cette manière tu pourras analyser et faire des tests, voir même l'améliorer.

Voici donc ce que j'ai fait !
Dans le modèle, il te faut ajouter une méthode permettant de récupérer les informations que tu souhaites en faisant la somme du CA total par Produit et Année/Semaine :
Code :
// app/models/produit.php
/**
 * Récupère les Produits de manière à obtenir le CA de chacun par année-semaine
 * @return array Produits groupés
 */
	public function getGrouped() {
		return $this->find('all', array(
			'fields' => array('Produit.name', 'Produit.annee', 'Produit.semaine', 'SUM(Produit.ca) AS ca'),
			'group' => array('Produit.name', 'Produit.annee', 'Produit.semaine')));
	}
Dans le contrôleur il te faut d'une part récupérer les couples uniques "Année/Semaine" et formater le tableau de résultat pour qu'il soit plus facilement exploitable par la vue (car le modèle te renvoie les informations "en ligne"). C'est le moment de profiter de la puissance de la superbe classe Set de CakePHP :
Code :
// app/controllers/produits_controller.php
	function dynamique() {
		$data = $this->Produit->getGrouped();
		// Groupe les produits par "name" et crée un tableau indexé par "annee-mois" contenant la valeur du ca associé
		$produits = Set::combine($data, array('{0}-{1}', '{n}.Produit.annee', '{n}.Produit.semaine'), '{n}.0.ca', '{n}.Produit.name');
		// Crée la liste des semaines présentes dans le résultat, ordonnées par ordre croissant
		$semaines = Set::sort( 
			array_keys(
				Set::combine($data, array('{0}-{1}', '{n}.Produit.annee', '{n}.Produit.semaine'))),
			'{n}',
			'asc');
		$this->set(compact('produits', 'semaines'));
	}
Et enfin dans la vue tu n'as plus qu'à itérer sur ces deux tableaux pour afficher les données sous la forme souhaitée :
Code :
<!-- app/views/produits/dynamique.ctp -->
<h2><?php __('Données "dynamiques"')?></h2>
<table>
	<thead>
		<tr>
			<td><?php __('Produit')?></td>
		<?php foreach($semaines as $semaine):?>
			<td><?php echo $semaine?></td>
		<?php endforeach;?>
		</tr>
	</thead>
	
	<tbody>
	<?php foreach($produits as $nom => $data):?>
		<tr>
			<td><?php echo $nom?></td>
		<?php foreach($semaines as $semaine):?>
			<td><?php echo (isset($data[$semaine])) ? $data[$semaine] : '0'?></td>
		<?php endforeach;?>
		</tr>
	<?php endforeach;?>
	</tbody>
</table>
Voilà ... je trouve que celà illustre parfaitement la puissance et le côté élégant de CakePHP comparé à ses concurrents Symfony et ZF (en tout cas c'est pour des choses comme ça que j'aime ce framework ) !
Si jamais j'avais mal compris ce que tu souhaitais ou qu'il y avait des problèmes ou des meilleures façons de faire ça, n'hésites pas à me le faire savoir.

Bonne journée,
Pierre

Dernière modification par Macmillenium ; 24/08/2009 à 14h21. Motif: Ne pas confondre [QUOTE] et [CODE]
real34 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2009, 14h01   #12
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour,
Merci pour ton dévouement, désolé je n'ai pas pu regarder cela avant aujourd'hui.
J'ai mis de coté mon apprentissage car cela ne collait pas avec le planning que je m'étais fixé pour mon projet, visiblement apprendre tout d'un coup est un peu plus long que je l'imaginais, en tout cas pour faire des choses un peu plus compliqué. Il faut dire aussi qu'à part la bdd je ne connais rien au reste, ni html, ni css, ni javascript, ni php, ni cake ...

J'ai testé mais j'ai un problème au niveau de la vue, il m'indique une "Parse error" au niveau de "<?php endforeach;>" et juste avant à "<?php foreach($semaines as $semaine)>" je me suis dit que cela venait de la balise fermante et j'ai donc ajouté un "?" comme ceci "?>" au lieu de ">" mais si cela résout le premier cas, cela bloque toujours au niveau de "endforeach". Malheureusement mes connaissances sont trop limitées pour comprendre, surtout que cela fait plus d'une semaine que j'ai arrêté de potasser les bouquins php.
Je ne veux pas t'embêter plus longtemps, j'ai compris le principe et je sais maintenant que la résolution du problème se trouve du coté de la classe Set donc dès que je reprends cela je vais m'y attarder pour y résoudre ma problématique.
Merci encore pour ton aide.
patic est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2009, 18h23   #13
Nouveau membre du Club
 
Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
Par défaut

Citation:
Envoyé par patic Voir le message
J'ai testé mais j'ai un problème au niveau de la vue, il m'indique une "Parse error" au niveau de "<?php endforeach;>" et juste avant à "<?php foreach($semaines as $semaine)>" je me suis dit que cela venait de la balise fermante et j'ai donc ajouté un "?" comme ceci "?>" au lieu de ">" mais si cela résout le premier cas, cela bloque toujours au niveau de "endforeach". Malheureusement mes connaissances sont trop limitées pour comprendre, surtout que cela fait plus d'une semaine que j'ai arrêté de potasser les bouquins php.
Tu as du copier-coller le code du forum ... et les ": ?" ont été remplacés par le smiley "" du coup celà n'apparaît pas dans ton application. Enfin bon, le foreach c'est quand même la base mais ici j'ai utilisé la syntaxe alternative http://fr.php.net/manual/fr/control-...ive-syntax.php

Je te conseille vraiment de récupérer le code sur mon compte Github, au moins tu n'auras pas de mauvaise surprise et pourras l'étudier directement ! http://github.com/real34/CakeTest/tree/groupby
real34 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/08/2009, 14h13   #14
Rédacteur
 
Date d'inscription: novembre 2007
Messages: 83
Par défaut

Bonjour,
J'ai corrigé la vue, cela fonctionne maintenant.

Merci beaucoup pour ton aide, c'est à mon avis la meilleure solution car au final il s'agit uniquement d'un problème de mise en forme et cela me semble mieux de traiter cela de cette façon, plutôt que du coté sql.

Merci
patic est déconnecté   Envoyer un message privé Réponse avec citation
NEWS (X)HTMLFAQ (X)HTMLTUTORIELS (X)HTMLLIVRES (X)HTMLOUTILS (X)HTML

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > HTML / DHTML / XHTML



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 00h58.


Vos questions techniques : forum d'entraide (X)HTML - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.