Action JS pour une prévisualisation d'image dans un formulaire

Résolu/Fermé
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 - 21 juil. 2015 à 18:23
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 - 6 août 2015 à 15:13
Bonjour,



J'ai un formulaire qui comprend 2 photos d'identité. Une pour Mr et une pour Mme. Lors de la présentation du formulaire, je prends les 2 photos dans un répertoire de mon serveur.La présentation du formulaire reflète donc les dernières photos enregistrées, puisque j'ai pris soin de rafraichir le cache du navigateur si une modification survient.
J'aimerai améliorer encore le système.
Comme je veux saisir une modification, je donne la possibilité à mon interlocuteur de changer sa photo. Actuellement, comme mon script est fait, il faut valider le formulaire pour voir le résultat de la photo modifiée.
Lors de la saisie du formulaire, je souhaiterai avoir directement la photo proposée avant de valider. En fait un clic sur une photo choisie sur mon dd par exemple devrait s'afficher directement sur la photo que je veux modifier.
je vous donne l'architecture de mon code:

<?php
$chemin1= 'Photosmembres/'.$donnees['Prenom'].$donnees['Nom'].'/M.jpg';
$chemin2= 'Photosmembres/'.$donnees['Prenom'].$donnees['Nom'].'/F.jpg';
?>

<form method = "post" action = "modifs.php" enctype="multipart/form-data">
<input type="image" src ="<?php echo $chemin1."?".filectime($chemin1);?>" id ="Mr" name ="Mr" alt ="Mr." style="vertical-align: middle;border:solid 1px silver;border-radius:10px; width:60px;height:60px;background-color:#CCC;" onclick="$('#InputFileM').click();return false;"/>
<input type="image" src ="<?php echo $chemin2."?".filectime($chemin2);?>" id ="Mme" name ="Mme" alt ="Mme." style="vertical-align: middle;border:solid 1px silver;border-radius:10px; width:60px;height:60px;background-color:#CCC;" onclick="$('#InputFileF').click();return false;"/>
<input type="file" id="InputFileM" name = "M" style="visibility:hidden"/>
<input type="file" id="InputFileF" name = "F" style="visibility:hidden"/>
<INPUT class ="champs" type="submit" value="Valider vos modifications"/>
</form>
A voir également:

3 réponses

Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
21 juil. 2015 à 19:09
Une solution serait d'utiliser une image temporaire et de l'Ajax.

Lorsqu'un utilisateur sélectionne une image :
=>utilisation d'une image temporaire
(Si l'utilisateur test 3 images avant de valider, la sauvegarde du dernier test écrase l'image temp du test précédent !)

Lorsqu'un utilisateur valide une image :
=> dupliquer l'image temporaire + la renommer et la ranger dans un dossier particulier par exemple...

Tout cela est faisable avec des fonctions PHP mais pour que cela soit instantané il faut se lancer dans l'Ajax ^^
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
21 juil. 2015 à 19:17
merci Yuh12.
Saurais-tu où je pourrais trouver une référence à ce sujet en AJAX ?
tutoriel, exemple etc.....
J'ai un peu cherché, mais je ne sais pas bien comment formuler la recherche.
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
22 juil. 2015 à 11:40
J'ai finalement trouvé des sources traitant du sujet et je te remercie de m'avoir mis sur la voie.
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
22 juil. 2015 à 16:22
Pour l'explication globale, tu va avoir un fichier PHP "flottant" ce que je veux dire par là qu'il va juste servir à interpréter du code PHP mais sur ton site personne ne pourra y accéder.

Donc tu as ta page html (ou php) avec le traitement de l'image la page de base donc.
On va dire image.php


Tu as un fichier javascript avec une fonction ajax (on y vient) qui intervient dès lors d'un clic sur le bouton envoyer par exemple :

$('.mon_objectif').click(function()
{
	var clic=true; // cette variable ne sert à rien je la transmet juste a ajax.php pour montrer que c'est possible
	$.ajax({
		type: "POST",
		url: "./ajax.php",
		dataType: "json",
		data: "donnee="+clic,
		success: function(data)
		{
			content=""; 
			if (data=="tab_empty")
				console.log("pas de retour");
			else 
			{
				// Instructions avec data qui contient les informations de ajax.php donc affichage de la nouvelle 

				// On utilise les données récupérées par ajax.php (voir en dessous)
				data.forEach(function(entry)
				{
					id 	= entry[0];
					link = entry[1];
					title = entry[2];

					content+="<div class='block_image'>";
						content+="<h6>"+title+"</h6>";
						content+="<img alt='image numero "+id+"' src='"+link+"'>";
					content+= "</div>";

				});
				$(".affiche_image").html(content); // on affiche la nouvelle image dans la section qui nous interesse
			}
		}
	});
});



Et enfin tu as ta page PHP spécial ajax dans laquelle tu veux modifier des éléments "en live" !

Admettons ajax.php

	
if(isset($_POST['donnee'])) // c'est la data que ajax lui envoi avec le clic=true (par exemple)
	{
		$bool=$_POST['donnee']; // donc true (ne sert à rien dans cet exemple juste pour montrer qu'on peut faire passer variables de l'ajax à l'ajax.php)

		$tab=recup_infos_img(); // fonction qui contient un SELECT de tes images et qui renvoi un tableau avec les données qui t'interessent.

		if(!empty($tab))
		{
			foreach($tab as $ligne)
			{	
				$id=$ligne['id_img'];
				$link=$ligne['lien_img'];
				$title=$ligne['title_img'];
				
				array_push($retour, array($id,$link,$title));
			}
			echo json_encode($retour); // Manière de réenvoyer un tableau d'infos en live à ajax dans la fonction success (si ça marche).
		}
		else
			echo json_encode("tab_empty");
	}


Ce site peut certainement t'aider !
http://jquery.developpeur-web2.com/documentation/ajax/$.ajax.php
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
22 juil. 2015 à 20:48
merci Yuh12 de tes explications. j'assimile doucement et j'essaie de comprendre.
J'aurai probablement des explications à te demander ultérieurement.
J'ai un bouquin de Javascript, qui traite un peu d'AJAX pour m'aider, mais comme je ne suis pas un expert en JS, c'est un peu dur ......
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
23 juil. 2015 à 00:16
Oui ! Mais c'est tellement cool que tu ne pourra plus t'en passer :) !
ça vaut le coup, courage, et n'hésite pas pour les questions.
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
Modifié par Yuh12 le 23/07/2015 à 21:07
Oui je suis désolé c'est ma faute !
J'ai copié mes codes et en fait j'utilise jQuery pour faciliter la tâche ce que j'ai omis de préciser, j'espère que ça ne t'a pas valu moultes galères ^^' !

$('#machin').click();

correspond en javascript à un
document.getElementById('machin').onclick();


Soit je sélectionne l'élément par son Id pour m'y adresser et si l'utilisateur clique dessus alors je lui donne une instruction.

Avec jQuery le $ sert à remplacer cette lourde instruction, et donc cela sert à s'adresser à ton HTML à la div suivante :
<div id='bidule' class='machin' ></div>

Pour s'y adresser par l'ID :
$('#bidule').click(){   // click ou autre il y a pleins de fonctions ! 
// mon instruction
}


Pour s'y adresse par la classe :
$('.machin').click(){ 
// mon instruction
} 

Donc # pour l'ID et . pour la classe.
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
23 juil. 2015 à 21:06
Pour ce qui est du fichier PHP ajax.php Il peut être ou tu veux !
Si tu le met à la racine dans ta fonction ajax ce sera :
	$.ajax({
		type: "POST",
		url: "./ajax.php", // A cet endroit !
		dataType: "json",
		data: "donnee="+clic,
		success: function(data)
		{ ...

Sinon :
url: "./mon_chemin/dossier_ici/puis_la_bas/ajax.php",
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
24 juil. 2015 à 16:43
J'y suis presque :
le script se déclenche bien sur un click sur le input file.
Maintenant je ne sais pas afficher la photo sélectionnée.
Qu'est ce que je dois mettre comme div dans mon formulaire ?
<div class='block_image'></div> -----> je ne reçois rien.
<div class='affiche_image'></div> ----> idem.

$(".affiche_image").html(content); // on affiche la nouvelle image dans la section qui nous interesse

Je comprends : on affiche dans une div de class "affiche_image" le contenu de html(content) ?????
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
Modifié par Yuh12 le 24/07/2015 à 17:16
Exactement :D !

Dans ta :
<div class='affiche_image'></div>


Tu va essayer d'afficher le contenu suivant (c'est à dire le contenu récupéré depuis le fichier ajax.php par ta fonction $ajax présente dans ton javascript ! )

content+="<div class='block_image'>";
  content+="<h6>"+title+"</h6>";
  content+="<img alt='image numero "+id+"' src='"+link+"'>";
content+= "</div>";


Grâce au
$(".affiche_image").html(content);


Un truc assez pénible en ajax, tu ne peux pas voir les erreurs de ajax.php donc pour tester ce que tu as fait dans ce fichier (soit une récupération des informations de l'image que tu veux afficher) il faut que tu affiches ce qu'il renvoie.

Dans ta fonction $ajax tu va donc faire (quand tu veux faire des tests) :
$.ajax ( {
  type: "POST",
  url: "./ajax.php",
  dataType: "json",
  data: "donnee="+clic,
       
         success: function(data){
           console.log(data); // On regarde ce qu'il y a dans data dans la console et de temps en temps il y a des erreurs PHP affichées ici si le code de ajax.php est faux.
         },
         error: function(data{
            console.log(data); // On regarde aussi si cela ne crée pas une réponse négative pour le js grâce à la méthode error. 
         }
      });
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
24 juil. 2015 à 17:52
La magie n'opère toujours pas !... Je me résouds à te donner mon code pour correction, car là je patine sérieux .... Pas d'affichage de div, pas d'affichage console ??..


<form method = "post" action = "modifs.php" enctype="multipart/form-data"><!-- action neutralisée pour l'essai-->
<input type="image" src ="<?php echo $chemin1."?".filectime($chemin1);?>" id ="Mr" name ="Mr" alt ="Mr." style="vertical-align: middle;border:solid 1px silver;border-radius:10px; width:60px;height:60px;background-color:#CCC;" onclick="$('#InputFileM').click();return false;"/>
<input type="image" src ="<?php echo $chemin2."?".filectime($chemin2);?>" id ="Mme" name ="Mme" alt ="Mme." style="vertical-align: middle;border:solid 1px silver;border-radius:10px; width:60px;height:60px;background-color:#CCC;" onclick="$('#InputFileF').click();return false;"/>
<input type="file" id="InputFileM" name = "M" style="visibility:hidden"/>
<input type="file" id="InputFileF" name = "F" style="visibility:hidden"/><br><br>
<INPUT type="submit" value="Valider vos modifications"/>
</form>
<div affiche_image></div>

<script>

$('#InputFileM').click(function()
{
var clic=true; // cette variable ne sert à rien je la transmet juste a ajax.php pour montrer que c'est possible
$.ajax({
type: "POST",
url: "./ajax.php",
dataType: "json",
data: "donnee="+clic,
success: function(data){
console.log(data); // On regarde ce qu'il y a dans data dans la console et de temps en temps il y a des erreurs PHP affichées ici si le code de ajax.php est faux.
},
error: function(data{
console.log(data); // On regarde aussi si cela ne crée pas une réponse négative pour le js grâce à la méthode error.

if (data=="tab_empty")
console.log("pas de retour");
else
{
// Instructions avec data qui contient les informations de ajax.php donc affichage de la nouvelle

// On utilise les données récupérées par ajax.php (voir en dessous)
data.forEach(function(entry)
{
id = entry[0];
link = entry[1];
title = entry[2];

content+="<div class='block_image'>";
content+="<h6>"+title+"</h6>";
content+="<img alt='image numero "+id+"' src='"+link+"'>";
content+= "</div>";

});
$(".affiche_image").html(content); // on affiche la nouvelle image dans la section qui nous interesse
}
});
});
});
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24 > janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015
Modifié par Yuh12 le 24/07/2015 à 18:06
Ce que je voulais dire dans mon message sur le javascript c'est que :
- soit tu fais du javascript pur et dur (document.getElementById etc..)
- soit tu utilises jQuery ou une autre librairie javascript, mais si tu utilises des librairies il faut les télécharger :/ ...

Tu avais l'air de comprendre et d'appliquer rapidement donc j'ai pensé que tu connaissais.

En gros il faut inclure un ce fichier :
http://code.jquery.com/jquery-1.11.3.min.js
( Ne pas avoir peur ce n'est qu'une librairie !! => clic droit enregistrer-sous).

Ainsi qu'un
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>


A partir de là cela te permettras d'utiliser ces fameux $ à la place des document.getElement machin truc...

De plus AJAX ressemble beaucoup plus à pas mal de boulot et de debug qu'à de la magie ^^ .. mais tu va y arriver :p !

Utilise beaucoup la console de Chrome ou de Firefox, indispensable en javascript, en faisant un clic droit => inspecter élément de ta page et l'onglet console.

C'est ici que tout les messages te seront repertoriés.
A chaque fois que je parle de la console dans mes explications c'est de cela qu'il s'agit.
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
26 juil. 2015 à 14:31
Mais ça ne déclenche pas l'ajax en fait si?
Parce que ton onclick() me parait étrange...

Pour que l'ajax JS se déclenche il faut que tu clique sur la div #InputFileM
car tu commences ton ajax par :
$('#InputFileM').click(function() ...


Pour cela pas besoin de onclick vu que tu lui dis déjà, avec la fonction click(), que si tu clique dessus alors => fonction Ajax.

Tu as seulement besoin de pouvoir cliquer sur cet élément :
<input type="file" id="InputFileM" name = "M" style="visibility:hidden"/> 


Or tu ne peux pas puisqu'il est en visibility:hidden.
Donc je pense que ton ajax ne se déclenche juste pas.

Si tu veux que cela se déclenche au clic sur l'image Mr il faut faire :
$('#Mr').click(function() ...


Et pas de onclick() ( parce que le :
onclick="$('#InputFileM').click();return false;"

consiste un peu à lui dire si tu cliques dans mon clic je te clic..


Je vais également te faire rajouter ceci au TOUT DEBUT de ton javascript :
$(document).ready(function()
{
// tout ton AJAX doit être compris dedans. cela sert à préparer le document à utiliser AJAX.
});
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
26 juil. 2015 à 16:59
Le cheminement de mon raisonnement :
J'ai une image src ="<?php echo $chemin1."
Je désire éventuellement la changer.
Si je clique dessus, je souhaite avoir le choix d'une autre image ----> donc je souhaite que me soit présenté le "parcourir".
Pour cela je fais un onclick sur l'image pour que cela me présente le "parcourir", parce que le onclick m'emmène au InputFileM
Pour l'instant, il n'y a pas d'image proposée, donc pas de déclenchement de l'ajax.
Lorsque "parcourir" m'a été proposé, je choisis un fichier, et c'est là que j'attribue à
<input type="file" id="InputFileM" name = "M" style="visibility:hidden"/>
la valeur du fichier choisi.
d'où le déclenchement de l'Ajax : $('#InputFileM').click(function()
Je considérais jusqu'à présent que le clic se faisait sur le 'choisir' du parcourir !.....
puisque c'est lui qui attribuait à l'inputFileM sa valeur.
Là, je ne distingue pas bien les futilités des clics.
C'est peut-être là que réside l'incompréhension.....


Par contre, je viens de tester la non présence du click() dans
onclick="$('#InputFileM').click();return false;"/>
ça ne marche pas, car ça ne me propose pas la fenêtre "parcourir" de recherche .
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
27 juil. 2015 à 16:41
Pris d'un doute avec les versions de jQuery, j'ai mis dans mon head les chargements de bibliothèque jQuery, tels que tu me les as indiqués .
<script type="text/javascript" src ="http://code.jquery.com/jquery-1.11.3.min.js"/></script>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>

Dans la console, j'obtiens :
reflow : 0.37ms fonction m.event.fix, jquery-1.11.3.min.js ligne 4
Il semble que ce soit une erreur qui fait 1 km de long !....
J'ai lu quelque part qu'il existe des conflits avec diverses versions de jQuery.
Est-ce là le problème ?
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
Modifié par Yuh12 le 28/07/2015 à 10:55
Non je ne voulais pas dire d'en ajouter deux... Il vont se mettre en conflit.

Mon message c'était de télécharger le fichier à cette adresse :
http://code.jquery.com/jquery-1.11.3.min.js

Et l'inclure de cette marnière :
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>


Après oui j'ai écrit jquery-1.11.0.min.js et je comprend que le 1.11.0 ait porté à confusion..

J'ai copié coller ma ligne de code et je suis aller chercher le dernier lien jquery donc comme je suis pas à jour à 3 versions près voilà.. mais il faut vraiment n'en inclure qu'un seul.
0
janmar Messages postés 148 Date d'inscription vendredi 17 mai 2013 Statut Membre Dernière intervention 29 août 2015 3
Modifié par janmar le 28/07/2015 à 11:54
OK, j'avais rectifié tout seul. Merci quand même.
Je continue.
0
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
28 juil. 2015 à 11:49
Peut-être que ce lien pourra t'aider.
http://chez-syl.fr/2015/02/jquery-uploader-une-image-en-ajax-avec-un-apercu-avant-envoi/

C'est un tuto qui se rapproche de ce que tu veux faire je pense.
0