<?php 
if(isset($_GET['source'])) 
{
    
show_source(__FILE__); 
    exit; 
}
function 
pre_print_r($tab
{
    echo 
"<pre>";
    
print_r($tab);
    echo 
"</pre>";
}
function 
pre_var_dump($var
{
    echo 
"<pre>";
    
var_dump($var);
    echo 
"</pre>";
}


/* fonction pour afficher les erreurs, avertissement et informations (qui contiennent du balisage) */
/* renvoit true si au moins une remarque */
function afficherRemarques($tableau$type "information")

    if (
$type != "erreur" && $type != "avertissement" && $type != "information")
    {
$type "information";}

    
$nbr count($tableau);
    if (
$nbr != 0) {$retour true;} // il y a au moins une remarque à afficher
    
else {$retour false;}
    
    if (
$nbr == 1)
    {
        echo 
"\n<dl class=\"$type\">\n\t<dt><strong>" .ucfirst($type). "</strong> :</dt>\n\t<dd>$tableau[0]</dd>\n</dl> <!-- FIN de la <dl class=\"$type\"> -->\n";
    }    
    elseif (
$nbr 1)
    { 
        echo 
"\n<dl class=\"$type\">\n\t<dt><strong>" .ucfirst($type). "s ($nbr)</strong> :</dt>\n";
        foreach(
$tableau as $val)
        {
            echo 
"\t<dd>$val</dd>\n";
        }
        echo 
"</dl> <!-- FIN de la <dl class=\"$type\"> -->\n";
    }
    
    return 
$retour;
// FIN  function afficherRemarques($tableau, $type)

/* fonction pour supprimer des éléments vides d'un tableau */
/* trouvée ici : http://www.jonasjohn.de/snippets/php/array-remove-empty.htm */
function suppVidesDansTableau($tab)
{
    
$tabOK = array(); // le bon tableau (= sans élément vide), qui va être retourné
    
while(list($cle$val) = each($tab)) // permet de passer en revue le tableau
    
{
        if (
is_array($val))
        {
            
$val suppVidesDansTableau($val); // récursivement
            
if (count($val) != 0// si tableau non vide
            
{
                
$tabOk[$cle] = $val// on le copie dans le bon tableau
            
}
        }
        else 
        {
            if (
trim($val) != ""// si valeur non vide
            
{
                
$tabOk[$cle] = $val;
            }
        }
    } 
// FIN du while
    
unset($tab);
    return 
$tabOk;
// FIN  function suppVidesDansTableau

/* fonction pour collecter toutes les remarques et les agréger dans leurs tableaux respectifs */
/* elle doit être utilisée sur chaque variable retournée par une autre fonction 
qui pourrait renvoyer des remarques (voir plus loin comment créer ces remarques) */
function rassemblerRemarques($tab, &$erreurs, &$avertissements, &$informations
{
    if ( !
is_array($tab) ) {echo "<p class\"erreur\">La variable <var>\$tab</var>,dans laquelle vous cherchez des remarques, n'est pas un tableau.</p>";}
    
    if ( 
array_key_exists("erreurs"$tab) )
    {
        
$err $tab['erreurs'];
        if ( 
is_array($err) )
        {
            foreach (
$err as $val)
            {
                
$erreurs[] = $val;
            }        
        }
        else {
$erreurs[] = $err;}
        
array_unique(suppVidesDansTableau($erreurs));
    }
        
    if ( 
array_key_exists("avertissements"$tab) )
    {
        
$avert $tab['avertissements'];
        if ( 
is_array($avert) )
        {
            foreach (
$avert as $val)
            {
                
$avertissements[] = $val;
            }        
        }
        else {
$avertissements[] = $avert;}
        
array_unique(suppVidesDansTableau($avertissements));
    }
    
    if ( 
array_key_exists("informations"$tab) )
    {
        
$info $tab['informations'];
        if ( 
is_array($info) )
        {
            foreach (
$info as $val)
            {
                
$informations[] = $val;
            }        
        }
        else {
$informations[] = $info;}
        
array_unique(suppVidesDansTableau($informations));
    }

    if ( !empty(
$tab['remarques']) )// récursivement 
    
{
        
$remarques $tab['remarques'];
        
rassemblerRemarques($remarques$erreurs$avertissements$informations); 
    }
// FIN  function rassemblerRemarques($tab, &$erreurs, &$avertissements, &$informations)
// à utiliser toute seule (ne retourne rien) mais avec ses 4 arguments


/* une fonction bidon, juste pour montrer que si on veut retourner plusieurs valeurs, il faut un tableau */
/* le but est par après de récupérer ces valeurs de remarque (erreur, avertissement ou information) */
/* les erreurs sont en anglais pour bien les différencier de celles ajoutées hors fonctions */
/* les numéros associés indique la profondeur de laquelle elles ont été "extraites" */
function fonctionBidon()
{
    
$retour = array(
            
0                =>        0,
            
"erreurs"        =>        "<p>[en-1] This is an error extracted from a function.</p>",
            
"bla bla"        =>        'un discours inutile',
            
"informations"    =>        array("<p>[en-2] A piece of information got from an array.</p>"'<p>[en-2] Another piece of information extracted from an array.</p>'),
            
9                =>         "un chiffre tout neuf",
            
"remarques"        =>        array(
                                        
"avertissements"     =>    array("<p>[en-3] An alarming warning.</p>""<p>[en-3] A second warning, deeply hidden.</p>"),
                                        
"informations"         =>    "<p>[en-3] A deep piece of information.</p>",
                                        
"erreurs"            =>     "<p>[en-3] One more error, this one was deeply hidden.</p>"
                                        
),
            
'truc'            =>        'Non, non, rien en fait !'        
    
);
    
    return 
$retour;
}
// attention ci-avant dans [remarques] : ne pas avoir plusieurs fois la même clé, sinon la valeur finale écrase les autres
// plusieurs possibilités pour la création des remarques dans la valeur retournée d'une fonction :
// soit vous créez une clé "erreurs|avertissments|informations" qui contient un élément ou tableau d'éléments
// (condition : n'avoir que ce type de remarques à renvoyer)
// soit vous créer une clé "remarques" qui contient un tableau de tableaus de remarques
// (un array par type de remarques, initialisé à vide)


/* une autre fonction bidon, juste pour exemple d'implantation */
/* les remarques de cet exemple sont en Allemand, pour les différencier */
function fonctionBidon2()

    
/* multi-initialisation de la variable de retour */
    
$retour = array(
                
"retour"        =>        "",
                
"remarques"        =>        array(
                                        
"erreurs"            =>    array(""),
                                        
"avertissement"        =>    array(""),
                                        
"informations"        =>    array("")
                                        )
                );
                
    
/* ici les instruction de la fonctions... */
    
    /* dès qu'il y a une remarque à créer, on l'"enregistre" comme suit : */
    
$retour['avertissements'][] = "<p>[de] Achtung ! ! XD</p>"// si que des avertissements à renvoyer
    
$retour['remarques']['informations'][] = "<p>[de] Ich bin ein Berliner !</p>"// méthode générale
            
    
return $retour;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Afficher les erreurs, avertissements et informations dans un &lt;dl&gt; (remarques balis&eacute;es)</title>
<style type="text/css">
.erreur {    border-color: red;    }
.avertissement {    border-color: orange;    }
.information {    border-color: green;    }
.erreur, .avertissement, .information { /* chaque dl */
    margin: 10px 0; /* top+bottom et right+left */
    border-width: 2px;
    border-style: solid;
    border-left-width: 15px;
    padding: 0 10px 0; /* top, right+left, bottom */
    background: white;
}
.erreur dt, .erreur dd, .avertissement dt, .avertissement dd, .information dt, .information dd { 
    margin: 1ex 0; /* marges verticales fusionnent */
    padding: 0;  
}
.erreur dd {    border-left-color: red;    }
.avertissement dd{    border-left-color: orange;    }
.information dd {    border-left-color: green;    }
.erreur dd, .avertissement dd, .information dd {
    border-left-width: 5px;
    border-left-style: solid;
    padding-left: 5px;
}
</style>
</head>

<body id="body">
<h1>Afficher des remarques à l'utilisateur : erreurs, avertissements et informations</h1>
<p>Les remarques sont balisées avec les balises <a href="http://giminik.developpez.com/xhtml/dl">&lt;dl&gt; (liste de définitions)</a>, <a href="http://giminik.developpez.com/xhtml/dt">&lt;dt&gt; (terme défini)</a> et <a href="http://giminik.developpez.com/xhtml/dd">&lt;dd&gt; (le corps de la définition)</a>. Le code est ainsi s&eacute;mantique et valide.</p>
<p>Modèle : </p>
<blockquote style="background: #BBB; padding: 1ex;" title="fond gris uniquement pour faire ressortir cet exemple">
<dl>
    <dt><strong>Nature de la remarque (nombre de remarques)</strong> :</dt>
    <dd><p>Une première remarque.</p></dd>
    <dd><p>Une autre remarque de même nature, on peut en avoir autant qu'on veut.</p></dd>
</dl>
</blockquote>
<p><a href="http://www.phpsources.org/scripts490-PHP.htm">Page d'explication sur ce bout de code PHP</a>.</p>
<p>Voici des exemples d'affichage de remarques : </p>
<?php
/* DEBUT exemples, les passer en commentaires pour voir comment s'affichent les remarques */
$erreurs[] = "<p>Vous n'avez rien tap&eacute; dans le champ de saisie.</p>";
//$erreurs[] = "<p>Vous devez valider la création de votre compte en cliquant sur le lien dans le courriel qui vient de vous être envoyé.</p>";

$avertissements[] = "<p>Vous devez valider la création de votre compte en cliquant sur le lien dans le courriel qui vient de vous être envoyé. Sinon, votre compte sera supprimé d'ici 5 jours.</p>";
//$avertissements[] = "<p>Votre texte semble très court.</p>";

$informations[] = "<p>Votre compte a bien été validé.</p>";
//$informations[] = "<p>Votre message a bien été envoyé.</p>";
/* FIN exemples ----- ----- ----- ----- ----- */

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

/* on considère maintenant la situation dans laquelle les remarques<br />
se produisent au sein d'une fonction
(donc a priori innacessible en dehors) */
echo "<hr />
<p>On fait tourner une fonction bidon qui ne fait qu'ajouter des remarques (en anglais), et on ré-affiche ces dernières.</p>"
;
$truc fonctionBidon();
rassemblerRemarques($truc$erreurs$avertissements$informations);

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

echo 
"<hr />
<p>On fait tourner une autre fonction bidon (qui retourne des remarques en Allemand) puis on ré-affiche les remarques.</p>"
;
rassemblerRemarques(fonctionBidon2(), $erreurs$avertissements$informations);

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

/* en situation réelle, utiliser plutôt les appels suivants (contrairement aux précédents) :  
*  on n'affiche des avertissements et informations que si il n'y a pas d'erreur
*  (enfin, ça c'est à vous de voir)

$existentErreurs = afficherRemarques($erreurs, "erreur"); 
if (!$existentErreurs)
{
    afficherRemarques($avertissements, "avertissement");
    afficherRemarques($informations, "information");
}

*/
?>
<p><a href="?source">Afficher le code source PHP de cette page</a>.</p>
<p><a href="http://jigsaw.w3.org/css-validator/check/referer" hreflang="mis">V&eacute;rifier la validité du code CSS</a>. <a href="http://validator.w3.org/check?uri=referer" hreflang="en">Vérifier la validité du code HTML</a>.</p>
<p><a href="#body">Retour en haut</a>.</p>
</body>
</html>