Réalisation d'une carte cliquable

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 14:11

Dans chacun de tes area tu mets un onclick qui exécute une fonction javascript qui affiche ton div avec à l'intérieur les informations correspondantes. Dans l'aréa "Cher" tu auras onclick = "affiche('Cher'), dans l'area "Loire et Cher" tu auras onclick = "affiche('Loire et Cher') etc.

Pour moi je ne ferai qu'un seul div positionné à un endroit précis de ta page qui s'afficherait onclick et dont le contenu changerait suivant le département concerné.

Ce fonctionnement te convient-il ?

Si oui, il faut transférer le contenu de ton tableau php dans un tableau javascript, et affiche('Cher') affichera le contenu du tableau javascript.

Remarque que cela aurait été plus facile si dans tes tables on avait pu récupérer le numéro du département en plus de son nom. Si c'est possible, c'est préférable.

Une autre solution serait d'écrire les infos dans autant de div différentes que de départements et comme cela tu n'aurais pas à créer de tableau javascript... La page mettrait un peu plus de temps à s'afficher mais la charge serait moins lourde pour le navigateur.

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 14:30

Au fait pour tes infobulles tu n'est pas obligé de garder ton code puisque le tableau $donnees contient toutes les informations.

Ainsi dans l'aréa "Cher" tu peux écrire

Code : Tout sélectionner

title = "<?php echo isset($donnees["Cher"]['Nb_Clients'])? $donnees["Cher"]['Nb_Clients'] : 0 ?>"

Eléphant du PHP | 51 Messages

26 mai 2009, 14:34

La partie du code que j'ai laissé permet en ajoutant un '0' pour les chiffre de 1 à 9 de récupérer les numéros de départements (colonne 'id' dans ma base):
while ($dpts = mysql_fetch_array($reponse))
	{
		$StrTest = "";
		if (strlen($dpts['id'])<2)
		{
			$StrTest = "0";
		}
		$StrTest = $StrTest . $dpts['id'];
		
		$Test = $dpts['id'];
		
		$NbClient = mysql_query("SELECT  Nb_Clients FROM departements WHERE id=$Test");
		$donnees = mysql_fetch_array($NbClient);
	
		$StrTest = $StrTest . " - " . $dpts['Nom_Departement'] . " : "; 
		$StrTest = $StrTest . $donnees['Nb_Clients'] . " contact(s) dans cette r&eacute;gion.";
		$StrInfo[] = $StrTest;
			
	}
On peut donc récupérer cette valeur?

La première solution m'irait mais je ne vois pas comment réaliser le tableau JS. Il faut créer une fonction Affiche() , mais je ne vois pas pour le transfert

La deuxième solution me parâit fastidieuse...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 mai 2009, 14:40

Pour créer automatiquement un tableau javascript à partir d'un tableau PHP, utilise la fonction json_encode() sous PHP.
Voir son usage ici: http://fr.php.net/manual/fr/function.json-encode.php

Par exemple:
<?php
   // soit un tableau sous PHP
   $tab_php = array('Lundi', 'Mardi', 'Mercredi');

   // transmettre ce tableau PHP à un tableau Javascript
   echo '<script type="text/javascript"> var tab_js = ', json_encode($tab_php), '; </script>';
?> 

<script type="text/javascript">
if (tab_js){
	for (i=0; i<tab_js.length; i++)
	{
		alert(tab_js[i]);
	}
}
</script>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 51 Messages

26 mai 2009, 15:12

Dans l'exemple, pourquoi un echo avant le json_encode? L'alert dans la boucle for en dessous correspond à quoi?

(Désolé le javascript ne me parle pas trop encore...)

Je commence à m'embrouiller :

Si j'essai de résumer il faut donc dans mon php que je transformele tableau $donnees en tableau JS, ensuite dans le JS que je crée la fonction affiche()et que dans chaque area je mette cette fonction affiche()...

C'est sa pour la demarche?

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 15:54

Bon ok pour terminer d'abord la partie php on modifie donc la requête pour récupérer les numéros de départements et on les formate avec sprintf() pour avoir minimum un nombre à deux chiffres:
$query = "SELECT 

departements.id,
departements.Nom_Departement,
departements.Nb_Clients,

informations.Nom_Maintenance,
informations.Num_Maintenance,
informations.Nom_Travaux,
informations.Num_Travaux,
informations.Adresse

FROM departements 

LEFT JOIN informations 

ON departements.Nom_Departement = informations.Nom_Departement";

$ressource = mysql_query($query);

$donnees = array();

while ($resultat = mysql_fetch_assoc($ressource)) 

    {
    $num_dep = sprintf("%02d", $resultat['id']); 

    $donnees[$num_dep]['Nom_Departement'] = $resultat['Nom_Departement'];
    $donnees[$num_dep]['Nb_Clients'] = $resultat['Nb_Clients'];
    $donnees[$num_dep]['Nom_Maintenance'] = $resultat['Nom_Maintenance'];
    $donnees[$num_dep]['Num_Maintenance'] = $resultat['Num_Maintenance'];
    $donnees[$num_dep]['Nom_Travaux'] = $resultat['Nom_Travaux'];
    $donnees[$num_dep]['Num_Travaux'] = $resultat['Num_Travaux'];
    $donnees[$num_dep]['Adresse'] = $resultat['Adresse'];
    }

// pour contrôle du contenu du tableau en phase de test 
echo '<pre>';
print_r($donnees);
echo '</pre>'; 
puis dans ton area pour le département du cher

Code : Tout sélectionner

title = "<?php echo isset($donnees['18']['Nb_Clients'])? $donnees['18']['Nb_Clients'] : 0 ?>"
Alors tu peux faire fonctionner tes infobulles maintenant ?


EDIT : Après tout ça tu te documente sur le lien de sadeq pour transférer ton tableau php dans un tableau javascript. Mais bon tu ne fais pas afficher

Code : Tout sélectionner

<script type="text/javascript"> if (tab_js){ for (i=0; i<tab_js.length; i++) { alert(tab_js[i]); } } </script>
Sinon tu n'a pas fini de cliquer :wink:

Quand tout le code php sera au point (et on devrait pas en être loin) cliques sur résolu puis ouvre un autre topic dans le forum javascript car on va changer de sujet : "Ecrire dynamiquement dans un div les éléments d'un tableau javascript"
Modifié en dernier par AB le 26 mai 2009, 16:13, modifié 2 fois.

Eléphant du PHP | 51 Messages

26 mai 2009, 16:06

Oui elle fonctionne mais le nombre de contacts est indiqué par ce que je met dans area... Avant c'etait tiré de la base departements [Nb_Clients].

Donc la façon d'avant correspondait mieux nan?

EDIT : tu utilises printf ou sprintf?

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 16:24

Oui elle fonctionne mais le nombre de contacts est indiqué par ce que je met dans area... Avant c'etait tiré de la base departements [Nb_Clients].

Donc la façon d'avant correspondait mieux nan?

EDIT : tu utilises printf ou sprintf?

Je ne comprend pas ce que tu veux dire. $donnees['18']['Nb_Clients'] est bien tiré de ta bdd et doit donner le même résultat que le précédent $StrInfo['18'], non?


C'était effectivement sprintf(), j'ai édité mon précédent message, jetes-y un oeil.

Eléphant du PHP | 51 Messages

26 mai 2009, 16:29

je viens de voir pour sprintf() ^^

cependant pour $donnees[18]

Code : Tout sélectionner

title = "<?php echo isset($donnees['18']['Nb_Clients'])? $donnees['18']['Nb_Clients'] : 0 ?>"
tu mets bien : 0 à la fin et c'est cet argument qui devient l'infobulle(quand je survolle je vois 0)... alors qu'avec

Code : Tout sélectionner

title="<?php echo $StrInfo[61]; ?>"
il va le chercher directement dans la BDD et utiliser le bout de code qui affichait "x contacts dans le département"...

Oula l'embrouille, ca sent la fin de journée :)[/quote]


EDIT : Pour mes StrInfo, l'argument [18] par exemple correspondait au departement 19

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 17:06

je viens de voir pour sprintf() ^^

cependant pour $donnees[18]

Code : Tout sélectionner

title = "<?php echo isset($donnees['18']['Nb_Clients'])? $donnees['18']['Nb_Clients'] : 0 ?>"
tu mets bien : 0 à la fin et c'est cet argument qui devient l'infobulle(quand je survolle je vois 0)... alors qu'avec

Code : Tout sélectionner

title="<?php echo $StrInfo[61]; ?>"
il va le chercher directement dans la BDD et utiliser le bout de code qui affichait "x contacts dans le département"...

Oula l'embrouille, ca sent la fin de journée :)


EDIT : Pour mes StrInfo, l'argument [18] par exemple correspondait au departement 19
Si

Code : Tout sélectionner

title = "<?php echo isset($donnees['18']['Nb_Clients'])? $donnees['18']['Nb_Clients'] : 0 ?>"
affiche 0 c'est que $donnees['18']['Nb_Clients'] est indéfini et donc que ça affiche la valeur par défaut que j'ai fixé arbitrairement à 0.


Pour le formatage de tes données title tu le faisais bien à partir d'un tableau alors qu'est-ce qui t'empèche d'en faire autant en rajoutant une ligne au tableau $donnees ?

Par exemple
$donnees[$num_dep]['infobulle'] = $resultat['Nom_Departement'].' : '.$resultat['Nb_Clients'].' contacts dans le département'; 
Sinon l'argument 18 qui correspond au département 19 c'est juste pour l'embrouille ?

ViPHP
AB
ViPHP | 5818 Messages

26 mai 2009, 17:17

Remarque que si tu as compris le principe tu pourrais aussi éviter de modifier ton code HTML en créant un tableau $StrInfo
$query = "SELECT 

departements.id,
departements.Nom_Departement,
departements.Nb_Clients,

informations.Nom_Maintenance,
informations.Num_Maintenance,
informations.Nom_Travaux,
informations.Num_Travaux,
informations.Adresse

FROM departements 

LEFT JOIN informations 

ON departements.Nom_Departement = informations.Nom_Departement";

$ressource = mysql_query($query);

$StrInfo = array();

$donnees = array();

while ($resultat = mysql_fetch_assoc($ressource)) 

    {
    $num_dep = sprintf("%02d", $resultat['id']); 

    $StrInfo[$num_dep] = $resultat['Nom_Departement'].' : '.$resultat['Nb_Clients'].' contacts dans le département';

    $donnees[$num_dep]['Nom_Departement'] = $resultat['Nom_Departement'];
    $donnees[$num_dep]['Nb_Clients'] = $resultat['Nb_Clients'];
    $donnees[$num_dep]['Nom_Maintenance'] = $resultat['Nom_Maintenance'];
    $donnees[$num_dep]['Num_Maintenance'] = $resultat['Num_Maintenance'];
    $donnees[$num_dep]['Nom_Travaux'] = $resultat['Nom_Travaux'];
    $donnees[$num_dep]['Num_Travaux'] = $resultat['Num_Travaux'];
    $donnees[$num_dep]['Adresse'] = $resultat['Adresse'];
    }

// pour contrôle du contenu du tableau en phase de test 
echo '<pre>';
print_r($donnees);
echo '</pre>'; 

echo '<pre>';
print_r($StrInfo);
echo '</pre>'; 

Eléphant du PHP | 51 Messages

27 mai 2009, 08:57

Bonjour,

Ok je n'avais pas saisi pour les tableaux, j'ai collé ton code et changé tout mes areas par :

Code : Tout sélectionner

<area shape="poly" coords="471,353,484,354,488,357,492,361,492,367,496,370,499,369,503,372,504,375,502,378,497,381,495,381,491,385,491,388,489,390,486,391,480,391,475,389,471,389,471,394,469,393,466,391,461,393,461,397,457,402,455,407,450,406,449,402,446,400,443,398,435,391,447,391,444,386,443,382,450,382,452,379,456,373,458,376,462,371,467,371,472,364,468,357" href="index.php?d=05" onMouseOver="change_image(0,color5)"onMouseOut="change_image(0,Normal5)" title="<?php echo $StrInfo[05];?>" alt="<?php echo $StrInfo[05]; ?>" />
Il subsiste un soucis quand je suis sur les departements de 01 à 09 il y a un bug... Pourtant avec le sprintf() ca devrait aller... j'ai essayé avec [1], [2]... ou [01] , [02]etc...

ViPHP
AB
ViPHP | 5818 Messages

27 mai 2009, 12:30

Et c'est quoi le souci ? que te retourne php comme erreur ?

Essaies avec des quotes : title="<?php echo $StrInfo['05'];?>"

Note aussi que tes area sont faits indépendamment des tes informations en base. Si un département n'est pas renseigné en base, l'appel à un élément du tableau qui sera donc inexistant devrait buggué.
C'est pour cette raison qu'il serait préférable d'écrire

Code : Tout sélectionner

title="<?php echo isset($StrInfo['05'])? $StrInfo['05'] : 0 ;?>"
Avec cette syntaxe si le département n'est pas renseigné en base, title affichera 0, mais tu pourrais écrire aussi 'Département non renseigné' comme valeur par défaut à la place de 0.

Eléphant du PHP | 51 Messages

27 mai 2009, 13:39

:D C'est bon avec les quotes!


Bizarre que sa fonctionne avec les depts à 2 chiffres et pas avec les autres.. bref...

Tous mes departements sont rentrés dans ma base donc je pense laisser comme sa.

Je n'arrive toujours pas à afficher onclick les infos que je souhaite...

j'ai ouvert le topic dans JavaScript, mais je pense que mon php n'est pas encore complet...

ViPHP
AB
ViPHP | 5818 Messages

27 mai 2009, 13:58

Et qu'est-ce qu'il a de pas complet maintenant ?