Pourquoi ca marche plus ?

Eléphanteau du PHP | 25 Messages

08 mai 2006, 18:45

**** MODERATEUR --> Merci de placer ce message dans la section Javascipt car poste ici par erreur, merci. ****

Bonjour,

La il faut m'expliquer brievement. J'ai une fonction en javascript qui marche dans un cas et pas dans d'autre. Je m'explique :
- Une page de selection de dossier en php avec des boutons de radio.
- Sur cette page un lien vers une fonction javascipt = afficher le dossier selectionne dans un pop up.

Tout cela marche sauf quand il n'y a qu'un seul dossier dans la liste avec donc un seul bouton radio. Quand j'essaye de debugguer avec des alert, il me dit que ma variable window.cdd.candselect.length est non definie. Pourtant, il y a bien sur la page l'affichage d'un bouton radio a cote du dossier.

Je vous mets les codes php de la page (en raccourci) et de la fonction javascript en question.

Merci d'avance si vous trouvez.

La page
/* Le formulaire */

echo "<form name=\"cdd\" action=\"myac.php?key=$key\" method=\"post\">";

/* le haut de la table avec une serie d'image dont celle qui appelle la fonction javascript avec OnClick */
echo "<br><table width=\"600\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\">";
echo "<tr>";
echo "<td align=left width=\"400\"><b>Liste de vos candidatures</b></td>";
echo "<td align=right><a href=\"myaccandnew.php?key=$key\" title=\"Nouvelle candidature\"><img src=\"pic/new.jpg\" border=\"0\"></a><img src=\"pic/voir.jpg\" border=\"0\" title=\"Voir la candidature selectionnée\" OnClick=\"visudossiercand()\"><img src=\"pic/modif.jpg\" border=\"0\" title=\"Modifier la selection\" OnClick=\"nondispo('Modifier la sélection')\"><img src=\"pic/suppr.jpg\" border=\"0\" title=\"Supprimer la selection\" OnClick=\"nondispo('Supprimer la selection')\"><img src=\"pic/pdf.jpg\" border=\"0\" OnClick=\"nondispo('Make PDF')\"></td>";
echo "</tr></table>";

$nom_hote="localhost";
$nom_utilisateur="root";
$password="";
mysql_connect($nom_hote, $nom_utilisateur, $password);
$base=mysql_select_db("wopr");
$demandes=mysql_query("SELECT * FROM candidatures WHERE student='$key' ORDER BY `inscrit` ASC ")or die('Erreur SQL !<br>'.$auto2.'<br>'.mysql_error());

/* (... definition des variables dimention $dim et de la banderole etiquettes du tableau...) */

/* Les lignes contenant les dossiers a visualiser dans le popup */

echo "<table width=\"600\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\">";
$contcandid=0;
while ($lign=mysql_fetch_object($demandes)) {
		$idcand=$lign->ID;
		$programme=$lign->programme;
		$pays1=$lign->pays1;
		$pays2=$lign->pays2;
		$pays3=$lign->pays3;
		$du=$lign->datedebut;
		$au=$lign->datefin;
		$motiv=$lign->motivation;
		$statut=$lign->statut;
		echo "<tr bgcolor=\"$colortabcase1\" OnMouseOver=\"bgColor='$colortabcase2'\" OnMouseOut=\"bgColor='$colortabcase1'\">";
		echo "<td align=center width=\"$dimprog\"><font class=\"tab\"><b>$programme</b></font></td>";
		echo "<td width=\"$dimpays\"><font class=\"tab\">1 : $pays1<br>2 : $pays2<br>3 : $pays3</font></td>";
		echo "<td width=\"$dimduau\" align=center><font class=\"tab\">Du $du<br>Au $au</font></td>";
		echo "<td width=\"$dimmotiv\" align=center><font class=\"tab\"><img src=\"pic/motiv.jpg\" border=\"0\" OnClick=\"visumotiv('$idcand')\"></font></td>";
		echo "<td width=\"$dimstatut\" align=center><font class=\"tab\">$statut</font></td>";
		echo "<td width=\"$dimcheck\" align=center><input name=\"candselect\" type=\"radio\" value=\"$idcand\"></td></tr>";
		$contcandid=$contcandid+1;
}
if ($contcandid==0){
	echo "<tr><td align=left>Aucune candidature enregistrée</td></tr>";
}
echo "</table>";
echo "</form>";
Le Javascript

Code : Tout sélectionner

function visudossiercand(){ var pas=0; var dossier; var nbcase=window.cdd.candselect.length; var i=0; var wPopup; for (i; i<nbcase; i++) { if (cdd.candselect[i].checked) { dossier=cdd.candselect[i].value; pas += 1; } } if (pas==0){ alert("Aucun case selectionnée"); }else{ wPopup = window.open('candidature.php' + '?idcand=' + dossier, 'img_popup', 'width=400, height=300, top='+(screen.height-50)/3+', left='+(screen.width-50)/3+', status=no, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, resizable=yes'); wPopup.document.close(); } }

Mammouth du PHP | 19672 Messages

08 mai 2006, 18:54

Il me semble que, même avec une certaine déficience visuelle, on peut noter une certaine différence entre "SQL" et "JavaScript" :-k

Sujet déplacé.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 25 Messages

08 mai 2006, 19:02

Il me semble que, même avec une certaine déficience visuelle, on peut noter une certaine différence entre "SQL" et "JavaScript"
C'est pour cela qu'on marque bien en haut de son message "**** MODERATEUR --> Merci de placer ce message dans la section Javascipt car poste ici par erreur, merci. **** " apres avoir passer 1/4 h a editer son post pour le rendre clair au maximum... Mais le moderateur bienveillant l'a note a peine le message poste, si c'est pas merveilleux ! :love5:

Mammouth du PHP | 19672 Messages

08 mai 2006, 19:10

mouais, ben à mon sens, au lieu de la source PHP de ta page, il serait plus approprié de mettre la source générée en HTML : la chance de trouver l'erreur par rapport à ton JavaScript sera plus grance.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 656 Messages

08 mai 2006, 19:11

Pour ton problème j'ai pas très bien compris, mais mettre un input de type radio tout seul c'est pas normal, dans ce cas on utilise une checkbox.

Eléphanteau du PHP | 25 Messages

08 mai 2006, 19:24

J'ai essaye avec la checkbox (On ne peut pas mettre un bouton radio seul ?) et ca donne toujours la mem chose pour la variable window.cdd.candselect.length = non definie

Je mets la traduction HTML.
Code HTML genere

Code : Tout sélectionner

<form name="cdd" action="myac.php?key=5" method="post"><br> <table width="600" cellspacing="1" cellpadding="0" border="0"> <tr> <td align=left width="400"> <b>Liste de vos candidatures</b> </td> <td align=right> <a href="myaccandnew.php?key=5" title="Nouvelle candidature"><img src="pic/new.jpg" border="0"></a> <img src="pic/voir.jpg" border="0" title="Voir la candidature selectionnée" OnClick="visudossiercand()"> <img src="pic/modif.jpg" border="0" title="Modifier la selection" OnClick="nondispo('Modifier la sélection')"> <img src="pic/suppr.jpg" border="0" title="Supprimer la selection" OnClick="nondispo('Supprimer la selection')"> <img src="pic/pdf.jpg" border="0" OnClick="nondispo('Make PDF')"> </td> </tr> </table> <table width="600" cellspacing="1" cellpadding="0" border="0"> <tr bgcolor="#aad5ff"> <td width="150"align=center><font class="tab"> <b>Programme</b></font> </td> <td width="190" align=center> <font class="tab"><b>Pays</b></font> </td> <td width="110"align=center> <font class="tab"><b>Période</b></font> </td> <td align=center width="55"> <font class="tab"><b>Lettre</b></font> </td> <td align=center width="75"> <font class="tab"><b>Statut</b></font> </td> <td align=center width="20"> <font class="tab"><b>-</b></font> </td> </tr> </table> <table width="600" cellspacing="1" cellpadding="0" border="0"> <tr bgcolor="#dfefff" OnMouseOver="bgColor='#ffffff'" OnMouseOut="bgColor='#dfefff'"> <td align=center width="150"> <font class="tab"><b>IFMSA (ACEML)</b></font> </td> <td width="190"> <font class="tab">1 : Mexique<br>2 : Mexique<br>3 : Mexique</font> </td> <td width="110" align=center> <font class="tab">Du 2004-07-01<br>Au 2004-09-01</font> </td> <td width="55" align=center> <font class="tab"><img src="pic/motiv.jpg" border="0" OnClick="visumotiv('5')"></font> </td> <td width="75" align=center> <font class="tab">Acceptée</font> </td> <td width="20" align=center> <input name="candselect" type="radio" value="5"> </td> </tr> </table> </form>

Mammouth du PHP | 19672 Messages

08 mai 2006, 21:48

Ok, ben au moins là, c'est plus facile à suivre.

Sur la base de ce code, je suggère effectivement de remplacer les boutons radios par des cases à cocher (à moins bien sûr qu'une seule sélection ne soit autorisée.)

Remplace l'attribut name de ta balise form par un attribut id et fais la même chose pour les cases à cocher en ajoutant une petite modification dans le code de génération: il faut que chaque id soir différent : donc ajoute un pointeur et concatène-le avec la valeur de l'atttribut id, ce qui donnera candselect0, candselect1, candselect2, etc..
Avant de passer au javascript, ton code php revu et corrigé :
<?php
/* Le formulaire */
?>
<form id="cdd" action="myac.php?key=$key" method="post">
<?php
/* le haut de la table avec une serie d'image dont celle qui appelle la fonction javascript avec OnClick */
?>
  <table width="600" cellspacing="1" cellpadding="0" border="0">
    <tr>
      <td align="left" width="400" >
        <b>Liste de vos candidatures</b>
      </td>
      <td align="right">
        <a href="myaccandnew.php?key=<?php echo($key); ?>" title="Nouvelle candidature"><img src="pic/new.jpg" border="0"></a>
        <img src="pic/voir.jpg" border="0" title="Voir la candidature selectionnée" OnClick="visudossiercand()">
        <img src="pic/modif.jpg" border="0" title="Modifier la selection" OnClick="nondispo('Modifier la sélection')">
        <img src="pic/suppr.jpg" border="0" title="Supprimer la selection" OnClick="nondispo('Supprimer la selection')">
        <img src="pic/pdf.jpg" border="0" OnClick="nondispo('Make PDF')">
      </td>
    </tr>
  </table>
<?php
$nom_hote="localhost";
$nom_utilisateur="root";
$password="";
mysql_connect($nom_hote, $nom_utilisateur, $password);
$base=mysql_select_db("wopr");
$demandes=mysql_query("SELECT * FROM candidatures WHERE student='$key' ORDER BY `inscrit` ASC ")or die('Erreur SQL !<br>'.$auto2.'<br>'.mysql_error());

/* (... definition des variables dimention $dim et de la banderole etiquettes du tableau...) */

/* Les lignes contenant les dossiers a visualiser dans le popup */
?>
  <table width="600" cellspacing="1" cellpadding="0" border="0">
<?php
$contcandid=0;
$i = 0;
while ($lign=mysql_fetch_object($demandes)) 
{
    $idcand    = $lign->ID;
    $programme = $lign->programme;
    $pays1     = $lign->pays1;
    $pays2     = $lign->pays2;
    $pays3     = $lign->pays3;
    $du        = $lign->datedebut;
    $au        = $lign->datefin;
    $motiv     = $lign->motivation;
    $statut    = $lign->statut;
?>
    <tr bgcolor="<?php echo($colortabcase1); ?>" OnMouseOver="bgColor='<?php echo($colortabcase2); ?>'" OnMouseOut="bgColor='<?php echo($colortabcase1); ?>'">
      <td align="center" width="<?php echo($dimprog); ?>"><font class="tab"><b><?php echo($programme); ?></b></font></td>
      <td width="<?php echo($dimpays); ?>"><font class="tab">1 : <?php echo($pays1); ?><br>2 : <?php echo($pays2); ?><br>3 : <?php echo($pays3); ?></font></td>
      <td width="<?php echo($dimduau); ?>" align="center"><font class="tab">Du <?php echo($du); ?><br>Au $au</font></td>
      <td width="<?php echo($dimmotiv); ?>" align="center"><font class="tab"><img src="pic/motiv.jpg" border="0" OnClick="visumotiv('<?php echo($idcand); ?>')"></font></td>
      <td width="<?php echo($dimstatut); ?>" align="center"><font class="tab"><?php echo($statut); ?></font></td>
      <td width="<?php echo($dimcheck); ?>" align="center"><input id="candselect<?php echo($i); ?>" type="checkbox" value="<?php echo($idcand); ?>"></td>
    </tr>
<?php
    $contcandid=$contcandid+1;
}
if ($contcandid==0)
{
?>
    <tr>
      <td align="left">Aucune candidature enregistrée</td>
    </tr>
<?php
}
?>
  </table>
</form>
Pour la JavaScript maintenant : là, ça va être plus facile: ton formulaire n'a pas d'autres éléments que ces cases à cocher, donc au lieu de compter ces éléments là, compte les éléments du formulaire. Si tu dois rajouter d'autres éléments, boutons ou autres, il faudra en tenir compte dans la définition de ta variable nombre de cases et les décompter.
Ensuite, on va modifier le code comme ceci:
function visudossiercand()
{
    var pas = 0;
    var dossier;
    var cdd = document.forms['cdd'];
    var nbcase = document.forms['cdd'].length;
    var wPopup;
    for (var i = 0; i < nbcase; i++)
    {
        var select = 'candselect'+ i;
        var idcase = cdd.elements[select];
        if (idcase.checked)
        {
            dossier = idcase.value;
            pas += 1; 
        }
    }
    if (pas == 0)
    {
        alert("Aucune case selectionnée");
    }
    else
    {
        wPopup = window.open('candidature.php' + '?idcand=' + dossier, 'img_popup', 'width=400, height=300, top='+(screen.height-50)/3+', left='+(screen.width-50)/3+', status=no, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, resizable=yes');
        wPopup.document.close(); 
    }
}
Attention, j'insiste sur un point : ce code fonctionnera si tu remplace bien les "name" par des "id" dans les balises form et input.

Enfin, je te signale aussi qu'au lien de trois tables, tu pourrais n'en faire qu'une seule histoire d'optimiser un peu tout ça.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 25 Messages

10 mai 2006, 19:54

Bon, en fait, j'y ai repense du ma garde hier soir... je me suis dit, ca bidouille avec 1 bouton radio, et des qu'il y en a deux, ca marche, donc en fait, j'ai essaye avec un bouton de radio vide (valeur = 0) dans la barre des entete de colone, et ca marche.

Maintenant, j'etais curieux par rapport au script que tu m'as envoye et qui marche aussi. Pourquoi le fait de changer name= en id= change tout comme ca ? Javascript le comprends mieux... c'est koi donc ?

(sinon, merci pour le script, j'ai fait un mix des deux et tout marche comme sur des roulettes).

Mammouth du PHP | 19672 Messages

10 mai 2006, 20:05

La différence entre name et id me sert dans la manière de pointer les éléments depuis le JavaScript : regarde la différence sur ce point entre mon code et le tiens.
J'ajoute qu'avec la standardisation progressive du web vers le XHTML en lieu et place du HTML, l'attribut name devient interdit dans la balise form. Ceci dit, pour la récupération des valeurs des éléments, tu peux avoir les deux dans les balises qui sont à l'intérieur du formulaire : input, textarea etc... : l'id servira pour le JavaScript et éventuellement les CSS, le name pour la récupération des valeurs dans la page de traitement via $_POST ou $_GET selon la méthode employée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: