Page 1 sur 2

Activer un bouton ?

Posté : 08 déc. 2006, 12:49
par Sebe
Bonjour,

Il y avait encore une semaine, je n'y connaissais rien en fonction ... j'ai commencé avec les fonction PHP mais ici j'ai besoin de faire une fonction de 'test/activation de fonction PHP' en javascript.

<?php
// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );

// Fonction de calcul de la vitesse
function vitesse($tempsp, $palier, $facteur) {
    if($tempsp != 0) return ($palier*$facteur/$tempsp);
	return (false);
} 

// Validation du formulaire (c'est ici que j'ai besoin de vous !)
function validation ()  {
  	if(document.formulaire.tempsp1.value > 0) // Temps du palier 1
	{
	alert('Le temps du palier 1 ne peut pas être égal à 0 !');
	document.formulaire.tempsp1.focus();
 	}

	if(document.formulaire.fcp1.value==0) // Fréquaence cardiaque du palier 1
{
alert('La fréquence cardiaque du palier 1 ne peut pas être égal à 0 !');
document.formulaire.fcp1.focus();
  }
}
?>
// je vous passe les entêtes !
<form id="formulaire" name="formulaire" method="post" action="">

// je vous passe la mise en page !
<input name="tempsp1" type="text" id="tempsp1" value="00:00:00" size="8" maxlength="8" />
<input name="fcp1" type="text" id="fcp1" value="0" size="3" maxlength="3" />

// utilisation de la fonction calcul de la vitesse
<?php
$palier = 800;
$facteur = 1/(24*60);
// Appel de la fonction
$vitesse = vitesse($tempsp1, $palier, $facteur);
// Affichage de la valeur
echo $vitesse; 
?>

// on passe aussi ce qui n'est pas important pour ma question !
<input type="button" value="calcule" onClick="validation(this.form);">
Voilà dans un premier temps, j'essaye de faire un test avec le bouton mais lorsque je l'actionne, il n'y a aucun message ! Qu'est-ce qui se passe ?

Enfin, comment lancé l'action de la fonction php (calcul de la vitesse)?

Merci beaucoup pour le tuyautage

Posté : 09 déc. 2006, 00:44
par Sebe
Re,

J'ai continué à chercher de mon coté et j'ai trouvé tout seul, comme un grand ... le Javascript ne doit pas être dans les balise PHP !


Merci

Posté : 09 déc. 2006, 00:52
par Sebe
Re,

Par contre, je me pose encore une question ... lors de la validation, j'appelle cette fonction:

Code : Tout sélectionner

<script language="JavaScript"> // Validation du formulaire function validation () { if(document.formulaire.tempsp1.value<=0) // Temps au palier 1 { alert('Le temps du palier 1 n est pas correcte !'); document.formulaire.tempsp1.focus(); } } </script>
La valeur du 'tempsp1' par défaut est '00:00:00' et je n'ai pas de message d'erreur si je valide sans rien y mettre d'autre ... comment est-ce possible ?

Merci

Posté : 09 déc. 2006, 01:22
par Cyrano
Dans ta fonction, tu compares : "document.formulaire.tempsp1.value<=0" : la valeur par défaut "00:00:00" sera interprété comme une chaine de caractère et non comme un entier, or ta comparaison est faite avec un entier. La fonction est donc au départ fausse.
Tu devrais peut-être t'intéresser aux expressions régulières en JavaScript :)

Posté : 09 déc. 2006, 01:29
par Ajoloca
Bonsoir,

Il est préférable de tester des valeurs du même type.
Dans ton cas tu as un entier 0 et une chaîne de caractères '00:00:00'.
Je te propose de transformer ta chaîne de caractères en un entier.
Comme la valeur obtenue ne sert pas aux calculs mais à la vérification d'une saisie
on peut additionner les heures + les minutes + les secondes.
Le but est que le résultat de cette somme soit supérieur à 0

Code : Tout sélectionner

<script language="JavaScript"> // Validation du formulaire function validation () { // Récupération de la valeur du champ et transformation en tableau var temps = document.formulaire.tempsp1.value.split(':'); // Initialisation de la variable du temps total var totalTemps = 0; // Calcul du temps total for(i = 0; i < temps.length ; i++){ totalTemps += temps[i]; } if( totalTemps <= 0) { // Temps au palier 1 alert('Le temps du palier 1 n est pas correcte !'); document.formulaire.tempsp1.focus(); } } </script>

Posté : 09 déc. 2006, 11:06
par Sebe
Re,

J'ai regardé ce que me propose Ajoloca et, grâce au lien de Cyrano, j'ai eu des infos sur la commande 'split'. Je comprend le système et cela n'empêchera pas le visiteur de marquer n'importe quoi ... je vais fouiller pour trouver une solution et qu'il soit obligé d'indiquer un résultat correspondant à l'heure (chaque chose en son temps, je vous tiendrais au courant !)

Par contre, j'aimerai savoir si, comme pour les fonctions PHP, il y a moyen de rassembler les fonctions Javascript ?

Expliquation: j'en ai 3 qui doivent tester un temps
  function validation ()  {
     // Récupération de la valeur du champ et transformation en tableau
     var temps = document.formulaire.tempsp1.value.split(':');
     // Initialisation de la variable du temps total
     var totalTemps = 0;
     // Calcul du temps total
     for(i = 0; i < temps.length ; i++){
        totalTemps += temps[i];
     }
     if( totalTemps <= 0) {  // Temps au palier 1
        alert('Le temps du palier 1 n est pas correcte !');
        document.formulaire.tempsp1.focus();
      }

     // Récupération de la valeur du champ et transformation en tableau
     var temps = document.formulaire.tempsp2.value.split(':');
     // Initialisation de la variable du temps total
     var totalTemps = 0;
     // Calcul du temps total
     for(i = 0; i < temps.length ; i++){
        totalTemps += temps[i];
     }
     if( totalTemps <= 0) {  // Temps au palier 2
        alert('Le temps du palier 2 n est pas correcte !');
        document.formulaire.tempsp2.focus();
      }

     // Récupération de la valeur du champ et transformation en tableau
     var temps = document.formulaire.tempsp3.value.split(':');
     // Initialisation de la variable du temps total
     var totalTemps = 0;
     // Calcul du temps total
     for(i = 0; i < temps.length ; i++){
        totalTemps += temps[i];
     }
     if( totalTemps <= 0) {  // Temps au palier 3
        alert('Le temps du palier 3 n est pas correcte !');
        document.formulaire.tempsp3.focus();
      }
Si vous avez encore des liens vers des trucs intéressants, je suis preneur !

Merci à tous

Note à Cyrano: J'avais trouvé ce site mais j'ai certainement dû passer au dessus de la page dont tu m'as filer l'url

Posté : 09 déc. 2006, 18:12
par Sebe
Re,

J'ai regardé un peu partout et je n'ai pas trouvé d'exemple pour fondre toutes les fonctions en une ... c'est pas vraiment beau mais cela fonctionne très bien !

Par ailleurs, j'ai l'intention de séparer les pages ... toutes les fonctions dans une ! Ainsi, on a moins de chance de voir que ce n'est pas esthétique ! ! !

A+

Posté : 10 déc. 2006, 14:25
par Sebe
Salut,

J'ai encore regardé et j'ai trouvé une idée pour que mon code soit plus lisible:

Code : Tout sélectionner

fonction testleszones (){ testzone(zone1) testzone(zone2) }
Cela peut vous paraître bizarre que je me complique la vie pour rendre mon code lisible (hors que je suis néophyte en programation) mais je mets mon premier composant pour Joomla! au point .... Joomla! étant un CMS, ceci explique cela !

Posté : 10 déc. 2006, 16:31
par Ajoloca
Bonjour,

Et QQ chose du style?

Code : Tout sélectionner

// Vérifie que un champ de type 'hh:mm:ss' // est numérique et supérieur à 0 function verifTemp(chpTemps){ var tempTab = chpTemps.split(':'); var temps = 0; for(i = 0; i < tempTab.length; i++){ // Conversion de la valeur en entier var t = parseInt(tempTab[i]); // Teste si la valeur est un chiffre // Retourne faux (invalide) si c'est pas le cas if(isNaN(t)) return (false); // Cumul du temps temps += t; } // Si cumul <= 0 return faux (invalide) if(temp > 0) return(true); return (false); } function verifFormulaire(){ // Test du premier palier var palier1 = document.formulaire.tempsp1; if(!verifTemp(palier1.value)){ alert('Le temps du palier 1 n\'est pas correcte !'); palier1.focus(); } // Test du second palier var palier2 = document.formulaire.tempsp2; if(!verifTemp(palier2.value)){ alert('Le temps du palier 2 n\'est pas correcte !'); palier2.focus(); } // Test du troisième palier var palier3 = document.formulaire.tempsp3; if(!verifTemp(palier3.value)){ alert('Le temps du palier 3 n\'est pas correcte !'); palier3.focus(); } }

Posté : 10 déc. 2006, 19:15
par Sebe
Salut,

Merci Ajoloca, cela me semble visuellement plus clair !
Y'a quand même une question par rapport à cette proposition !

J'ai fait mon formulaire avec 2 boutons:
- 'button' pour faire les tests sur les entrées et faire les calcules
<input name="button" type="button" onclick="validation(this.form);" value="Validation du test" />
- 'submit' pour mettre les saisies dans les tables après avioir utilisé le 1er bouton
<input name="submit" type="submit" onclick="POST" value="Enregistrement du test" />
C'est le premier qui nous intéresse car il renvoyait vers la fonction que tu as transformé pour la visibilité !

Mes questions:
Etant donné que tu m'ais proposé 2 fonctions, je rique d'avoir un problème avec mon bouton ? J'ai bien l'impression d'avoir trouvé qqch mais pour remedier à cela ... je me lance, faudra pas me frapper si je suis dans le faux :roll:
document.validation(verifTemp(chpTemps), verifFormulaire())
Enfin, pour lancer mes calcules si les 'if' sont respectés, puis-je directement y mettre un 'else' ?

Indulgence SVP et merci :D

Posté : 10 déc. 2006, 19:41
par Ajoloca
Re,
Dans ce cas tu devrais supprimer le bouton de validation.
Que separait-il si l'utilisateur valide (submit) sans utiliser le bouton de test (validation) ?

Tes champs ne seront jamais vérifiés.

Sert toi de l'évenement "onblur()" qui est l'invers du "focus()".
L'évenement "onblur()" se déclange quand le champ (zone) perds le focus (on quite le champ)

Tu as juste une petite modif à faire dans la fonction verifTemps().
Elle deviendrait

Code : Tout sélectionner

function verifTemps(chpTemps){ var tempTab = chpTemps.value.split(':'); var temps = 0; for(i = 0; i < tempTab.length; i++){ // Conversion de la valeur en entier var t = parseInt(tempTab[i]); // Teste si la valeur est un chiffre // Retourne faux (invalide) si c'est pas le cas if(isNaN(t)){ alert('Seuls les chiffres sont accétés'); chpTemps.focus(); } // Teste si les minutes et (ou) les secondes // sont comprises entre 0 et 59 if(i != 0 && tempTab[i] > 59){ alert('Les minutes ou les secondes ne peuvent exéder 59'); chpTemps.focus(); } // Cumul du temps temps += t; } // Si cumul <= 0 return faux (invalide) if(temp > 0) return(true); alert('Le temps doit être supérieur ou égal à une seconde'); chpTemps.focus(); }
Et dans tes champs de saisie
<input type="text" name="palier1" value="00:00:00" onblur="JavaScript:verifTemps(this);">

Posté : 10 déc. 2006, 21:35
par Sebe
Re,

Ben là, y'a un petit problème car plus rien ne se passe ...pas demessage d'erreur comme avant !

Tu m'as dit:
Dans ce cas tu devrais supprimer le bouton de validation.
Mais ne faut-il pas changer quelque chose dans autre bouton ... je devrais appeler une fonction ? A noter que je n'ai pas encore fait les requêtes qui me serviront à stocker dans les tables !

Merci

Posté : 10 déc. 2006, 23:27
par Ajoloca
Re,

Voilà un bout de code qui ne sert qu'à tester la fonction, mais il fonctionne.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta name="generator" content="Bluefish 1.0.7"/>
		<meta name="author" content="José LOPEZ"/>
		<meta name="date" content="2006-12-10T22:19:52+0100"/>
		<meta name="copyright" content=""/>
		<meta name="keywords" content=""/>
		<meta name="description" content=""/>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
		<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
		<meta http-equiv="content-style-type" content="text/css"/>
		<meta http-equiv="expires" content="0"/>
		<!--<meta http-equiv="refresh" content="5; URL=http://"/>-->
		<title>V&eacute;rif temps</title>
		<script type="text/JavaScript">
			function verifTemps(chpTemps){
   			var tempTab = chpTemps.value.split(':');
   			var temps = 0;
   			for(i = 0; i < tempTab.length; i++){
      			// Conversion de la valeur en entier
      			var t = parseInt(tempTab[i]);
      			// Teste si la valeur est un chiffre
      			if(isNaN(t)){
         			alert('Seuls les chiffres sont acceptés');
         			chpTemps.focus();
         			return(true);
      			}
      			// Teste si les minutes et (ou) les secondes
      			// sont comprises entre 0 et 59
      			if(i != 0 && tempTab[i] > 59){
         			alert('Les minutes ou les secondes ne peuvent exéder 59');
         			chpTemps.focus();
         			return(false);
      			}
      			// Cumul du temps
      			temps += t;
   			}
   			// Si cumul <= 0 return faux (invalide)
   			if(temps <= 0) {
   				alert('Le temps doit être supérieur ou égal à une seconde');
   				chpTemps.focus();
   				return(true);
   			}
			} 
		</script>
	</head>
<body>
	<div>
		<form name="test" action="" method="post">
			<input type="text" name="palier1" size="6" value="00:00:00" onblur="verifTemps(this);" />
		</form>
	</div>
</body>
</html>

Posté : 11 déc. 2006, 00:38
par Sebe
Re,
Il ne faut surtout pas hésiter à poser des questions quant tu ne comprends pas.
N'oublie pas ceci : Il n'y a pas de question con, seuls le cons ne posent pas de questions.
Bon alors, je n'ai pas saisis à quoi servent exactement les arguments, et ce morceau de code 'JavaScript&#058' livré avec le bouton ... j'ai beau lire sur le web ou dans 'Javascript pour les Nuls' mais ces 2 choses restent incompréhensibles pour moi ! Il faut ajouter aussi que je comprends pas pourquoi mon bouton ne me renvoit pas d'erreur à la soumission du formulaire !

Voiloù

Posté : 11 déc. 2006, 00:59
par Ajoloca
Re,

Pour la citation, tu peux me citer. En régle générale je dis ce que je pense et j'assume.
Pour cetains c'est un défaut pour moi une qualité. A chacun de juger.

Le onblur="JavaScript:nom_fonction(this);"

Comme tu l'as compris le '&#058' (il manque le ; si je le mts il le transforme en :) c'est le code HTML pour écrire le caractère : (deux points). J'avais au départ mis les deux points mais le parseur de code les transforme en '&#058' (surement parce que je l'ai mis entre les balises php au lieu des balises code).

L'intérêt du paramètre this.

Tou simplement je passe à la fonction le champ lui même ce qui me permet d'exploiter dans la fonction le "caractéristiques" qui m'intéressent.
Dans ce cas son contenu(la valeur) chpTemps.value mais aussi de forcer un évenement chpTemps.focus().

Un autre intérêt, c'est de pouvoir utiliser la même fonction pour le même type de champ (seul le champ - this - est différent)