Bonjour,

Je suis entrain d'inclure des blocs dynamiques en php sur mon site.

Par exemple j'ai intégré dans ma page en XHTLM Strict le code suivant (insertion en dynamique du menu de gauche):


<div id="menu_gauche">
<table class="box_table" border="0">
<tr><th>Collections</th></tr>
<tr><td><bloc_categories></td></tr>
</table>
</div>


Le validateur m'indique 11 nouvelles erreurs, alors que ma page était valide avant cf: http://validator.w3.org/check?verbose=1&uri=http%3A//www.eternel.fr/index.php

Si qq'un peut me dire quelles sont les modifications afin d'arriver à 0 erreur ?

Autre question, les balises <tr>, <th> et <td> peuvent elles être utilisées en strict ?

Merci d'avance
Modifié par pp51 (10 Aug 2006 - 11:44)
Bonsoir,

Les balises associées aux tableaux sont parfaitement utilisables en XHTML, y compris en mode Strict. Ils sont nécessaires pour la mise en forme de données tabulaires.

Après avoir observé le résultat du validateur, voici les deux types d'erreurs à corriger pour rendre le document valide :

- Le premier problème concerne les caractères spéciaux dans les URL pour les variables passées en paramètre. Les caractères "&" doivent être encodés "&amp;" afin que le navigateur ne les interprète pas de façon erronée. Voici un exemple sur l'un des liens :

<a href="http://www.eternel.fr/boutique/index.php?module=categorie&amp;code_cat=10" ...>...</a>

- La page contient 5 balises <br> qu'il faut fermer en ajoutant un slash en fin de balise : <br />

Le site devrait ensuite être parfaitement valide.

Bonne continuation ! Smiley cligne
Modifié par Romain H. (19 Mar 2006 - 18:53)
Merci Romain pour tes précisions Smiley cligne

Comme je débute tout juste en php, je n'y connais pas encore grand chose...

Par contre, je ne vois pas où il faut modifier le code ?
Comme ce code apparait dynamiquement, je ne le "vois" pas dans mon xhtml... cf ci-dessous :


<body id="Eternel">
<div id="page">
     <div id="header">
            <div id="logo"> <a href="http://www.eternel.fr" id="Logo"> <img src="Images/logo3.png" alt="Eternel" width="150" height="75" title="Logo Eternel"/></a></div>
            <h1><img src="titre.png" alt="Titre de Eternel" title="Bijoux et accessoires pour le mariage"/></h1>
			<div id="panier"><table class="box_table">
<tr><th>Votre panier</th></tr>
<tr><td><bloc_panier></td></tr>
</table></div>
			<div id="aide"> <a href="http://www.eternel.fr"> <img src="Images/aide.png" alt="Eternel" width="19" height="16" title="Eternel" /></a> <a href="http://www.eternel.fr">Plan du site</a></div>
  </div>
     <ul id="menu_haut">
        <li><a id="menu1" title="Accueil" href="http://www.eternel.fr/indextest.htm">ACCUEIL</a></li>
		<li><a id="menu2" title="Collections" href="#">COLLECTIONS</a></li>
		<li><a id="menu3" title="Atelier de création" href="#">ATELIER DE CREATION</a></li>
		<li><a id="menu4" title="A propos" href="#">A PROPOS</a></li>
		<li><a id="menu5" title="Contactez-nous" href="#">CONTACTEZ-NOUS</a></li>
     </ul>
	 <p id="ariane">Vous êtes ici: <a href="http://www.eternel.fr/indextest.htm">Accueil</a> | <a href="http://www.eternel.fr/collections-bijoux-accessoires-mariage.htm">Collections</a></p>
	 <div id="menu_gauche">
	 <table class="box_table" border="0">
<tr><th>Collections</th></tr>
<tr><td><bloc_categories></td></tr>
</table>
	 </div>
	 <div id="contenu">
	 <img src="Images/orchidee2.png" id="photodumois" alt="Eternel" width="150" height="212" title="Eternel" />
	 <div id="promo">
	 <p id="paruredumois">La parure du mois</p>
	 <p id="descriptif">Ce mois-ci, découvrez la parure Orchidée.</p>
	 <p id="descriptif1">Avec ses 833 perles de rocaille à facettes et sa superbe fleur de soie, cette parure composée de son collier, bracelet, pics à cheveux et boucles d'oreilles.</p>
	 <p id="descriptif2"><a href="http://www.eternel.fr">En savoir plus >></a></p>
	 </div>
	 <div id="secrets">
	 <p id="secrets_titre">Tous les secrets d'Eternel</p>
	 <p id="secrets_descriptif">Tous nos bijoux et accessoires pour le mariage sont de fabrication artisanale française, gage d'une qualitée irréprochable.</p>
	 <p id="secrets_descriptif2">Nous selectionnons les plus belles matières pour que nos parures brillent de mille feux : Cristal Swarovski, perles de rocaille à facettes et perles de bohème. <a href="http://www.eternel.fr">Visitez notre atelier de création >></a></p>
	 </div>
	 </div>
	      <div id="menu_droite">
	             <div id="menubas">
	             <h2>Nos conseils</h2>
	             <p id="conseils">Tous nos conseils pour faire le bon choix >></p>
	             <h3>En un clin d'oeil</h3>
	             <p id="clin_oeil">Découvrez tous nos modèles en 1 clic !</p>
	             <h4>Sur mesure</h4>
	             <p id="sur_mesure">Nos parures adaptées aux désirs de toutes les mariées</p>
	             <p id="livraison">Livraison et garantie</p>
	             <p id="livraisontexte">Nos conditions de livraison et d'échange</p>
	             </div>
	      </div>
	 <div id="footer">
	 <p id="mentions">Copyright © 2005 Eternel. Tous droits réservés. Eternel® est une marque déposée.</p>
</div>     
</div>             
</body>
</html>


Merci pour ton aide
Effectivement, les parties du code à modifier sont invisibles ici. Les différentes erreurs que j'ai mentionnées se situent toutes à l'intérieur du menu gauche contenant les collections. Il faudrait donc aller chercher de ce côté. Avec le code sous les yeux, je pourrais aisément le corriger.

Je profite de ce message pour faire une petite remarque sémantique. En effet, pour le menu gauche, il serait préférable de ne pas avoir recours à un tableau dont l'utilisation est complètement dispensable. Il suffirait tout simplement de mettre les liens en forme à l'aide d'une liste non ordonnée, ce qui permettrait qui plus est de ne pas avoir à ajouter les puces manuellement.


<ul>
<li>Lien 1</li>
<li>Lien 2</li>
...
</ul>


Bon courage ! Smiley cligne
Modifié par Romain H. (19 Mar 2006 - 19:11)
Re merci Romain,

Voici le code php "module_categories.php". C'est là dedans qu'il faut chercher ?


<?php
// --- page de catégorie

// --- initialisation du contenu
$contenu = '';

// --- code de la catégorie demandée
$code_cat = $boutique->auto_variable('code_cat');

// --- nombre de produits par page
$nb_items_page = 12;

// --- calcul de la page et de la plage de produits
$page = intval($_GET['page']);
if ($page <= 0) $page = 1;
$nb_start = ($page - 1) * $nb_items_page;

// --- tableau des catégories
$tb_categories = $boutique->tableau_categories();

// --- affichage du chemin
for ($i=2; $i<=strlen($code_cat); $i+= 2) {
	$cc = substr($code_cat, 0, $i);
	$params = array('module'=>'categorie', 'code_cat'=>$cc);
	$url = $boutique->creation_url($params);
	if ($i > 2) $contenu .= ' &gt; ';
	$contenu .= '<b><a href="' . $url . '">'
	  . $tb_categories["$cc"]['libel'] . "</a></b>";
}

// --- affichage des sous-catégories
$params = array('code'=>$code_cat . '__');
$tb_sous_categories = $boutique->tableau_categories($params);
if (count($tb_sous_categories) > 0) {
	$tb_valeurs = array();
	reset($tb_categories);
	while (list($cc, $categorie_infos) = each($tb_sous_categories)) {
		// --- création de l'url vers la catégorie
		$params = array('module'=>'categorie',
		  'code_cat'=>$categorie_infos['code']);
		$url = $boutique->creation_url($params);
		// --- formattage
		$txt = '<li><a href="' . $url . '">' 
		  . $categorie_infos['libel'] . "</a><br>\n";
		$txt .= $categorie_infos['description'] . "</li>\n";
		// --- ajout dans le tableau des valeurs
		$tb_valeurs[] = $txt;
	}
	$params = array('nbcolonnes'=>4, 'td_align'=>'left');
	$contenu .= $boutique->creation_table_html($tb_valeurs, $params);
}

// --- top des ventes
$tb_valeurs = array();
$params = array();
$params['code_cat'] = $code_cat;
$params['nb_maxi'] = 3;
$params['order'] = 'ventes desc';
$tb_produits = $boutique->tableau_produits($params);
while (list($prd_id, $produit_infos) = each($tb_produits)) {
	// --- création de l'url vers la fiche produit
	$params = array('module'=>'produit', 'prd_id'=>$prd_id);
	$url = $boutique->creation_url($params);
	// --- image
	$params = array('prd_id'=>$prd_id);
	$img = $boutique->url_photo($params);
	// --- presentation du produit
	$txt = '<a href="' . $url . '">';
	if ($img) {
		$txt .= '<img src="' . $img
		  . '" class="image" width="100"><br>';
	}
	$txt .= $produit_infos['libel'] . '</a>';
	// --- ajout dans le tableau
	$tb_valeurs[] = $txt;
}
// --- mise en forme du tableau du top des ventes
$params = array('nbcolonnes'=>3, 'td_align'=>'center',
  'open_tr'=> 'class="ligne_contenu"');
$params['titre'] = $tr_top_ventes;
// --- composition du bloc top des ventes
$contenu .= $boutique->creation_table_html($tb_valeurs,
   $params);
$contenu .= '<br>';

// --- produits de la catégorie
$params = array('code_cat'=>$code_cat,
  'nb_start'=>$nb_start,
  'nb_maxi'=>$nb_items_page,
  'comptage'=>1);
$tb_produits = $boutique->tableau_produits($params);

// --- nombre de pages
$nb_items = $boutique->nb_items;
$nb_pages = ceil($nb_items / $nb_items_page);

$contenu .= '<table border="0" width="98%" cellspacing="1"
  cellpadding="3" class="contenu" align="center">';
$contenu .= '<tr><th colspan="3">' 
  . $tb_categories["$code_cat"]['libel'] . '</th></tr>';
while (list($prd_id, $produit_infos) = each($tb_produits)) {
	$contenu .= '<tr class="ligne_contenu">';
	// --- création de l'url vers la fiche produit
	$params = array('module'=>'produit', 'prd_id'=>$prd_id);
	$url = $boutique->creation_url($params);
	// --- image
	$params = array('prd_id'=>$prd_id);
	$img = $boutique->url_photo($params);
	$contenu .= '<td align="center">';
	if ($img) {
		$contenu .= '<img src="' . $img
		  . '" class="image" width="100">';
	}
	$contenu .= '</td><td valign="top">';
	$contenu .= '<a href="' . $url . '">'
	  . $produit_infos['libel'] . '</a><br>'
	  . $boutique->debut_texte(
	  $produit_infos['description'],400);
	$contenu .= '</td>';
	// --- prix
	$contenu .= '<td valign="middle" align="right">';
	$contenu .= $produit_infos['prix_ttc'] . '&nbsp;&euro;';
	$contenu .= '</td>';
	// fin de la ligne
	$contenu .= '</tr>';
}
$contenu .= '</table>';

// --- gestion des pages
if ($nb_pages > 1) {
 	$contenu .= '<p align="center">';
 	// --- page precedente
 	if ($page > 1) {
		$params = array('module'=>'categorie',
		  'code_cat'=>$code_cat, 'page'=>$page - 1);
		$url = $boutique->creation_url($params);
    	$contenu .= '<a href="' . $url . '">'
    	. $tr_page_precedente . '</a>&nbsp;&nbsp;';
 	}
 	// --- listing des pages
 	$imax = min($nb_pages, 10);
 	for ($i=1; $i<=$imax; $i++) {
 		$params = array('module'=>'categorie',
 		  'code_cat'=>$code_cat,
		  'page'=>$i);
		$url = $boutique->creation_url($params);
   	$contenu .= '<a href="' . $url . '">'
   	  . '[' . $i . ']</a> ';
 	}
 	// --- page suivante
 	if ($page < $nb_pages) {
		$params = array('module'=>'categorie',
		  'code_cat'=>$code_cat,
		  'page'=>$page +1);
		$url = $boutique->creation_url($params);
    	$contenu .= '&nbsp;&nbsp;<a href=" '
   	  . $url . '">' . $tr_page_suivante . '</a>';
 	}
 	$contenu .= '</p>';
}

// --- ajout du contenu dans le bloc principal
$tb_blocs['bloc_principal'] .= $contenu;

// --- meta tags
$tb_blocs['meta_title'] =
  $tb_categories["$code_cat"]['libel'];
$tb_blocs['meta_description'] =
  $tb_categories["$code_cat"]['description'];
$tb_blocs['meta_keywords'] =
  $tb_categories["$code_cat"]['keywords'];


?>
En effet, on se rapproche là de l'origine des erreurs...

- Tout d'abord, les différentes occurrences de <br> peuvent être remplacées par <br />.

- Cependant, en ce qui concerne les caractères spéciaux présents dans les URL, ils ne sont pas encore directement visibles ici, mais on peut identifier leur provenance :


$params = array('module'=>'categorie', 'code_cat'=>$cc);
$url = $boutique->creation_url($params);


Les liens sont générés par la fonction creation_url contenue dans la classe permettant de gérer les objets de type boutique. Il faudrait donc remplacer dans le corps de cette fonction les "&" des URL créées par des "&amp;".

À bientôt sur Alsacréations... Smiley smile
Je pense que c'est la fonction suivante incriminée en partie non ?


// --- fonction de création d'une url
  function creation_url($params) {
    // --- valeurs par défaut
    if (!is_array($params)) $params = array();
    // --- Url Rewriting produits
    if ($params['module'] == 'produit' && $this->url_rewriting) {
    	$url = $GLOBALS['cf_url_base']
    	  . 'article-'
    	  . $params['prd_id']
    	  . '.html';
    	return($url);
    }


J'ai donc remplacé les 2 && par des & pour obtenir le code suivant:

// --- fonction de création d'une url
  function creation_url($params) {
    // --- valeurs par défaut
    if (!is_array($params)) $params = array();
    // --- Url Rewriting produits
    if ($params['module'] == 'produit' && $this->url_rewriting) {
    	$url = $GLOBALS['cf_url_base']
    	  . 'article-'
    	  . $params['prd_id']
    	  . '.html';
    	return($url);
    }


mais j'ai maintenant l'erreur suivante:

Parse error: syntax error, unexpected ';' in /home/eternel/www/classe_boutique.php on line 81


Romain, as tu une idée

Smiley cligne
Attention, il ne faut surtout pas toucher à l'opérateur "&&" qui est le ET logique dans les conditionnelles !

Il faudrait que je puisse voir la suite du corps de la fonction, notamment le cas où $params['module'] == 'categorie', pour pouvoir la corriger.
Bon, j'ai réglé le pbl de la création des URLs...

Voici le code corrigé


    // --- composition de l'url
    $url = $GLOBALS['cf_url_base'] . 'index.php';
    $i = 0;
    while (list($cle, $valeur) = each($params)) {
      if ($i == 0) $url .= '?';
      else $url .= '&amp;';
      $i++;
      $url .= "$cle=$valeur";
    }
    return($url);
  }


la ligne a corriger était:
else $url .= '&amp;';

Bon je vais m'attaquer au reste maintenant Smiley smile