Changmnt de la val. d'un tag hidden par un autre fichier php

Petit nouveau ! | 5 Messages

06 févr. 2012, 22:51

Bonjour.
Dans un fichier index.php, j'ai ces déclarations:

// Sert de variable persistante
<input type="hidden" id="may_sub" name="may_sub" value="0" >
// Sert de tampon pour agir sur les éléments de la fenêtre principale sans utiliser AJAX.
<iframe id="buffer" name="buffer" width="0" height="0" frameborder="0"></iframe>
// Sert à vérifier le login et le cas échéant, se logger
<input type="button" id="btn_submit" name="btn_submit" class="button" value="Login" onclick="login_clicked()">

//Dans la procédure login_clicked(), j'appelle un fichier externe qui fait la vérification des info dans la bd.
//________________________________________________________
// Validation des champs de login sans ajax
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

function login_clicked()
buffer.location.replace("check_login.php?email=" + document.getElementById("email").value +
"&pwd="+ document.getElementById("pwd").value);

stat = document.getElementById("may_sub").value ;

if (stat != 1){
alert("Invalid e-mail or password!");
}

//Dans le cas qui m'intéresse, l'info retourné sur le buffer est ainsi:
else {
print <<<eot
<script language="JavaScript">
parent.document.getElementById('btn_submit').value = 'buz'; //***Juste pour un test
parent.document.getElementById('may_sub').value = '0';
</script>
eot;


//Puisque ces info sont envoyées dans le iframe du fichier index, elles sont automatiquement interprétées, sans rafraîchir la page. Le problème que j'expérimente, est que le tag hidden may_sub n'est jamais mis à jour. J'ai essayer de modifier une autre élément de la page (voir ***) et ça fonctionne.

La grande question. pourquoi, je peux changer la valeur d'un input de type button, mais pas celle d'un type hidden...???

ViPHP
ViPHP | 2287 Messages

07 févr. 2012, 03:11

Bonjour,

Déjà tu peux dans le futur utiliser la coloration syntaxique du forum qui ne te causera aucune fatigue, fonctionne très bien et pique moins les yeux de tes lecteurs... (ouch le rose :mrgreen: )
La grande question. pourquoi, je peux changer la valeur d'un input de type button, mais pas celle d'un type hidden...???
Il n'y a aucune raison, ils ne sont pas censés être traités différemment par le navigateur (d'ailleurs lequel utilises-tu pour ton test ?). Si tu transformes ton hidden en button, ou en text (en changeant juste l'attribut type donc) tu en auras le coeur net et tu pourras visualiser si oui ou non ça marche avec ce champ (je soupçonne que ton problème vienne d'ailleurs, un conflit d'id ou un truc du genre).

Comme ton problème est peut-être lié à une version de navigateur, tu peux éventuellement nous donner un lien vers la page si tu veux qu'on puisse tester le souci sur d'autres plate-formes ?

Sinon pense à passer tes pages au validateur html, ça peut aider à détecter le souci : http://validator.w3.org (tes tags input ne sont pas fermés, à moins que tu utilises un vieux doctype cela est invalide, autant tout vérifier).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

08 févr. 2012, 08:05

J'ai trouvé la réponse, enfin, je crois.

Dans la fonction login_clicked(),la commande [buffer.location.replace("check_login.php...] renvoi dans le buffer cette réponse:

print <<<eot
<script language="JavaScript">
parent.document.getElementById('btn_submit').value = 'buz'; //***Juste pour un test
parent.document.getElementById('may_sub').value = '0';
</script>
eot;

Le problème, c'est que l'évaluation du tag [may_sub] est faite trop rapidement, avant même que [buffer.location.replace] ait terminé.
J'ai expérimenté en mettant un autre bouton sur la page qui affichait [alert()] la valeur de [may_sub] après le reload, et elle était bien changée.

Le hic, c'est que javascript exécute les commandes de [function login_clicked()] à la file, sans attendre la terminaison des commandes précédentes, c'est pourquoi ça échoue... :-(

J'ai peux-être trouvé une façon de contourner le problème, (sans ajax) mais encore là, je suis coincé (merde). On pourrait ajouter une fonction qui attendrait un flag avant de poursuivre avec les autres procédures comme suit:


<?php
?>

<html>
<head>
<title>Untitled</title>
</head>
<body>
<input type="hidden" id="test_val" value="0" />
<input type="button" id="btn" name="btn" value="start" onclick="javascript:check_stat(document.getElementById('test_val').value, display())" />
<input type="button" id="btn1" name="btn1" value="change" onclick='change_state()' />

<script type="javascript">
//________________________________________________________
// Verify the state of a hidden tag and send the next
// procedure when true, else, wait some time
//________________________________________________________
function check_state(variable, other_func){
if (variable){
other_func();
} else {
setTimeout('check_state()', 500);
}
}

//________________________________________________________
// Change the state of the hidden tag
//________________________________________________________
function change_state(){
document.getElementById('test_val').value = 1 ;
}

//________________________________________________________
// Display when the state of the hidden tag has changed
//________________________________________________________
function display(){
alert('change made');
}
</script>

</body>
</html>


Le problème, c'est que je coince sur un "object expected" depuis au moins 3 heures sur le deuxième <input>, je ne peux donc pas vérifier si ma nouvelle solution fonctionne. Je suis certain que c'est con comme erreur, mais je n'en peux plus... :oops:

Un coup de main serait bien apprécié... :priere:

En passant, la couleur, c'est mieux ? :-)

ViPHP
ViPHP | 2287 Messages

08 févr. 2012, 11:25

En passant, la couleur, c'est mieux ? :-)
Pour moi oui mais saches que tu as des boutons (au dessus du wysiwyg de ce forum) qui te feront ça encore mieux :)

Dans le dernier code que tu as posté, tu appelle check_stat au lieu de check_state (dans le onclick du bouton), est-ce normal ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

08 févr. 2012, 16:40

Désolé, c'est un petit typo introduit quand j'ai fais de l'épuration dans le code avant de le poster.
Même une fois corrigé, j'ai le même code d'erreur, "object expected" pour le deuxième <input>...
Je ne comprend plus rien, cette page de test en est une comme j'en ai fais des quantités, mais il y a des moments où on ne voit plus rien :(

J'ai vérifié avec le validateur et il n'a rien trouvé de spécial.

Pour ce qui est de la couleur, merci pour l'info.

Mammouth du PHP | 2278 Messages

08 févr. 2012, 19:55

Il y a moyen de faire plus simple:
<?PHP
// $cacher est une variable indiquant si on  doit cacher ou non
$cachage = ($cacher == true) ? "type = 'hidden'": "type ='text'";
plus loin:
print "<input $cachage ..... />
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

08 févr. 2012, 21:54

J'ai un peu de misère à suivre ton approche, pourrais-tu s'il te plait, y mettre un peu plus de détail.

Mammouth du PHP | 2278 Messages

09 févr. 2012, 15:57

/**$cacher est une variable indiquant si on  doit cacher ou non
* soit elle a été précisée quelque part et elle garde cette valeur,
* soit elle n'a jamais été précisée et elle prend la valeur true
*/
$cacher = isset($_POST['cacher']) ? $_POST['cacher'] ? 1;
/* $cachage est une variable qui se substitue à l'attribut type=''*/
$cachage = ($cacher == 1) ? "type = 'hidden'": "type ='text'";
plus loin:
print "<input $cachage ..... />
<!-- ca veut dire que chaque fois que tu passes par là tu rends  les choses visibles -->
         <input type = 'hidden'  name ='cacher' value ='0' />
...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

09 févr. 2012, 21:31

Ne cherchez plus, la solution a été trouvée sur un autre forum.

Ma proposition originale était adéquate. Le problème principal de celle-ci était cette erreur simple "<script type="text/javascript">".
Après, il n'y avait que du fine tuning à faire...

Voici:

Code : Tout sélectionner

<?php ?> <html> <head> <title>Untitled</title> </head> <body> <input type="hidden" id="test_val" value="0" /> <input type="button" id="btn" name="btn" value="start" onclick="check_state(document.getElementById('test_val'), display)" /> <input type="button" id="btn1" name="btn1" value="change" onclick='change_state()' /> <script type="text/javascript"> //________________________________________________________ // Verify the state of a hidden tag and send the next // procedure when true, else, wait some time //________________________________________________________ function check_state(variable, other_func){ if (variable.value == 1){ other_func(); } else { setTimeout(function() {check_state(variable, other_func);}, 500); } } //________________________________________________________ // Change the state of the hidden tag //________________________________________________________ function change_state(){ document.getElementById('test_val').value = 1 ; } //________________________________________________________ // Display when the state of the hidden tag has changed //________________________________________________________ function display(){ alert('change made'); } </script> </body> </html>
Cette solution fonctionne parfaitement, et me permet d'obtenir suffisamment de temps pour permettre au relaod de terminer avant d'évaluer les tag hidden.

Tout de même Merci pour l'aide.

Mammouth du PHP | 2278 Messages

11 févr. 2012, 10:43

Comme quoi, il suffirait parfois de consulter la console d'erreurs javascript du navigateur.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD