8721 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un mal de chien avec les tableaux dynamiques...
Bon voilà, je doit créer un tableau comparatif entre plusieurs produits, jusque-là ça va, j'arrive à faire afficher le contenu des spécifications des produits sélectionné. Mon problème est qu'en plus je doit faire afficher les "spec" selon leur catégorie, et là je sèche... j'ai essayé plusieurs combinaison, je pense être tout près mais je n'y arrive toujours pas...

Voici à quoi j'arrive jusqu'à maintenant:
upload/22504-FireShotSc.jpg

Caméra,Vidéo, Photo et Télécommande sont les catégories qui devraient être affiché en orange comme "Télécommande"

En plus les 2 dernière spécifications en bas devraient apparaître tout en haut juste sous "Caméra" mais comme ces spécifications sont vide pour la caméra XCEL HD, elle se mettent en bas...


mon code:
$sql = "SELECT
			P.id, P.produits, P.nom, P.name,
			I.lien, I.link, I.photo
		FROM produits P,
			categories C,
			photos_produits2 I
		WHERE P.id_categories = C.id
			AND I.id_produits = P.id
			AND C.id = 24
			AND P.site != 'spypoint'
		ORDER BY P.nom";
$infos = $DB->get_data($sql);

foreach($infos as $info){
		
	$req = "SELECT
				S.id, S.".$lang." as spec, S.id_categories,
				PS.fr as pspec,
				C.".$lang." as categorie
			FROM spec_categories C,
				spec S,
				spec_details PS,
				produits_spec_produits PSP
			WHERE S.id_categories = C.id
				AND PS.id_spec = S.id
				AND PSP.id_produits_spec = PS.id
				AND PSP.id_produits = '".$info->id."'
			ORDER BY S.id_categories,S.ordre";
	$info_specs = $DB->get_data($req);
	
	foreach($info_specs as $info_spec){
		$info->categorie[$info_spec->id_categories] = $info_spec->categorie;
		$spec[$info_spec->id_categories] = $info_spec->categorie;
		$class[$info_spec->id_categories] = $info_spec->categorie;
			
		$info->specs[$info_spec->id] = $info_spec->pspec;
		$spec[$info_spec->id] = $info_spec->spec;
	}
	
	$produits[] = $info;
			
	$nb_colonnes = count($produits);
	$nb_lignes = count($spec);
	
	if($lang == 'FR'){
		$nom = str_replace(' ','-',$produits[$c]->nom);
	}
	else{
		$nom = str_replace(' ','-',$produits[$c]->name);
	}
				
	$search = array(' ','d\'');
	$replace = array('-','-');
	$nom_lien = str_replace($search,$replace,$nom);
}
	?>
<table>
	<thead>
		<tr>
            <th>&nbsp;</th>
            <?php for ($c = 0; $c < $nb_colonnes; $c++): ?>
            <th>
            <a href="<?php echo get_item_seo_uri(str_replace($search,$replace,$produits[$c]->nom))."/produit-".strtolower(str_replace(' ','-',$produits[$c]->produits));?>.html">
			<?php 
				echo '<h2>'.$produits[$c]->produits.'</h2>'; 
				if($produits[] = 'photo'){
					?>
             	<img src="http://www.xcelcam.com/images/products/<?php echo $produits[$c]->link.$produits[$c]->photo;?>.png" width="130" alt="">
					<?php
				}
			?>
            </a>
          </th>
            <?php endfor ?>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($spec as $l => $intitule):?>
        <tr>
        	<?php
			if($intitule == $info_spec->categorie){
				?>
				<?php for ($c = 1; $c < $nb_colonnes; $c++): ?>
        	<th colspan="<?php echo $nb_colonnes+1?>" class="is-orange is-left"><?php echo $intitule ?></th>
            	<?php endfor ?>
            	<?php
			}
			else{
				?>
            <th align="left"><?php echo $intitule ?></th>
            <?php for ($c = 0; $c < $nb_colonnes; $c++):?>
            <td align="center">
			<?php 
				if(!empty($produits[$c]->specs[$l])){
					if($lang == 'FR'){
						if($produits[$c]->specs[$l] == 'Non'){
						echo '-';
						}
						elseif($produits[$c]->specs[$l] == 'Oui'){
							echo '•';
						}
						else{
							echo $produits[$c]->specs[$l];
						}
					}
					else{
						if($produits[$c]->specs[$l] == 'No'){
							echo '-';
						}
						elseif($produits[$c]->specs[$l] == 'Yes'){
							echo '•';
						}
						else{
							echo $produits[$c]->specs[$l];
						}
					}
				}
				else{
					echo '-';
				}
			?>
            </td>
            <?php endfor ?>
            	<?php
			}
			?>
        </tr>
        <?php endforeach ?>
    </tbody>
</table>
Bonjour Julie,

une piste pour toi si je comprend ton problème.


<?php
	function spec() {
 // ta requete
 // tes extractions entre <tr>...</tr>
}
?>

<table>
<tr>
	<th>Camera</th>
</tr>
<?php spec(); ?>
<tr>
	<th>Video</th>
</tr>
<?php spec(); ?>
...
</table>
C'est ce que je faisait à l'origine, mais non, c'est pas ce que je veut. Tout ça est gérer via la bdd, pourquoi j'irai pas chercher ces infos qui y sont déjà, plutôt que de les écrire à la main...?
Si je peux me permettre, tu devrais si ta base de données est bien construite pouvoir aller chercher toutes tes infos en une seule requête. cf INNER JOIN

Je lis dans ton code une première requête avec un SELECT, et un foreach derrière avec une autre requête. Je pense que cela ne t'aide pas vraiment pour construire ton tableau correctement et surtout comme tu le veux.

Après, cela ne regarde que moi...
Bon courage
J'ai besoin de la première requête pour faire la sélection des bons produits.
La deuxième requête me sert à aller chercher les différentes infos des produits sélectionné. c'est sur cette 2e partie que j'ai besoin d'aide.

Les bonnes infos sortent, mais je n'arrive pas à les afficher correctement.

EDIT: Je pense que ma bdd est bien monté merci, j'ai déjà dù la refaire une fois en ce sens.
Modifié par juliesunset (02 Sep 2014 - 14:46)
La réponse est dans ce que tu viens de dire.

"La deuxième requête me sert à aller chercher les différentes infos des produits sélectionné. c'est sur cette 2e partie que j'ai besoin d'aide."

tu peux aller chercher toutes tes infos via une seule requête, grâce aux fonctionnalités de INNER JOIN, cf base de données relationnelles. Je t'invite à jeter un oeil sur W3 Schools.
http://www.w3schools.com/sql/sql_join_inner.asp

"Les bonnes infos sortent, mais je n'arrive pas à les afficher correctement."
Forcement tu n'arrives pas à modeler ton tableau comme tu le veux, parce que tes extractions ne sortent pas aux moments où tu souhaites les afficher.

Je t'invite vraiment à reconstruire ta requête.