Page 1 sur 1

Liste déroulante gestion date (Jour, Mois et Année)

Posté : 27 juin 2006, 09:24
par leakcim51
Bonjour,

je suis sur un site qui gère des projets composés de tâches.

J'ai un formulaire qui permet l'ajout d'une tâche. Lors de cet ajout, j'ai une liste qui contient les tâches déjà associées au projet, et j'affecte une tâche précédente (prev_task) à la nouvelle tâche.

Je souhaiterai que lorsque je choisi une prev_task dans la liste, les trois listes en dessous qui contiennent la date de début de la tâche (jour, mois et année) se mettent à jour automatiquement avec la date de fin de la prev_task.

Actuellement, j'ai ajouté l'option onChange mais ça ne donne rien lors de la création d'une tâche.

Cependant, si je modifie la tâche par la suite, je n'obtient que la date de la tâche (prev_task) qui était sélectionnée avant mais pas les autres dates des tâches de la liste (prev_task).

Merci d'avance
Mick
<?
print "<select name=\"prev_task\" onChange=\"prev_date(this.form,'$start_day','$start_month','$start_year',$value_day,$value_month,$value_year)\" style=\"width:100%;\">\n";
?>

Code : Tout sélectionner

<script language="JavaScript"> <!-- function prev_date(formulaire, champday, champmonth, champyear, valeurday, valeurmonth, valeuryear) { formulaire.elements[champday].value = valeurday; formulaire.elements[champmonth].value = valeurmonth; formulaire.elements[champyear].value = valeuryear; } // --> </script>

Posté : 28 juin 2006, 15:31
par leakcim51
Re!

J'ai effectué quelques modifications mais toujours rien!

Personne n'a d'idées qui pourraient m'aider??

Code : Tout sélectionner

<script language="JavaScript"> <!-- function setValue(FieldName, FieldValue) { if (E = getObjectById(FieldName)) E.value = FieldValue; } // --> </script>
function prev_date($prev_task,$start_day="",$start_month="",$start_year="")
{
	if ($prev_task!=-1)
		{
			$query = "SELECT DATE_FORMAT(end_date, '%d') as start_day, DATE_FORMAT(end_date, '%m') as start_month,".
				" DATE_FORMAT(end_date, '%Y') as start_year FROM $TASK_TABLE WHERE task_id=".$prev_task;
			list($qh,$num) = dbQuery($query);
			if ($num>0){
				$dat = dbResult($qh);
				$value_day = $dat["start_day"];
				$value_month = $dat["start_month"];
				$value_year = $dat["start_year"];
			}
		}
		else
		{
			$value_day = $data["start_day"];
			$value_month = $data["start_month"];
			$value_year = $data["start_year"];
		}
	//setValue($start_day, $value_day);
	//setValue($start_month, $value_month);
	//setValue($start_year, $value_year);
	//prev_date_js($form,$start_day,$start_month,$start_year,$value_day,$value_month,$value_year);
}
$query = "SELECT task_id, name FROM $TASK_TABLE WHERE proj_id=".$data["proj_id"];
      
list($qh, $num) = dbQuery($query);
if ($num > 0) { 
  print "<select name=\"prev_task\" onChange=\"prev_date(".$data["prev_task"].",'start_day','start_month','start_year')\" style=\"width:100%;\">";
  print "<option value='-1'></option>";
  while ($return = dbResult($qh)) {
    if ($return["task_id"]!=$task_id){
      print "<option value=\"$return[task_id]\"";
      if ($data["task_id"] == $return["task_id"])
        print " selected";
      print ">$return[name]</option>\n";
    }
  }
print "</select>";
}

Posté : 28 juin 2006, 15:46
par leakcim51
Pour informations,

lorsque je lance la page :

le code HTML me donne ceci (enfin je vais pas tout mettre non plus):

Code : Tout sélectionner

<td align="right">Preview Task:</td> <td> <select name="prev_task" onChange="prev_date 2,'start_day','start_month','start_year')" style="width:100%;"> <option value='-1'></option> <option value="1">Tache 1</option> <option value="2" selected>Tache 2</option> </select> </td> </tr> <tr> <td align="right">Start Date:</td> <td><select name="start_day"> <option value=0>None <option value="1">1 <option value="2">2 <option value="3">3 <option value="4">4 <option value="5">5 etc... </select><select name="start_month"> <option value=0>None</A><option value="1">Jan <option value="2">Feb <option value="3">Mar etc... </select><select name="start_year"> <option value=0>None</A><option value="2006" selected>2006 <option value="2007">2007 <option value="2008">2008 etc... </select></td>
J'attends vos remarques avec impatience!
Merci

Posté : 29 juin 2006, 00:07
par Truc
Salut,
onChange="prev_date 2,'start_day','start_month','start_year')"
manque une parenthèse de début.
<option value=0>None 
pas de </option>
else
{ 
$value_day = $data["start_day"];
Dans le cas du "else" à quoi correspond "$data" ?

Posté : 29 juin 2006, 09:13
par leakcim51
Merci pour ton aide.
A priori dans le onChange il ne passait pas dans la fonction, et la paranthèse en moins ça doit être un problème de copier/coller car j'ai verifié et elle est bien là.

Sinon j'ai modifié et il passe bien dans la fonction prev_date maintenant mais il n'arrive pas à passer dans la fonction javaScript setValue.
"Call to undefined function: setvalue() in ..."
<?
...

function prev_date($prev_task,$start_day="",$start_month="",$start_year="")
{
	include("table_names.inc");
	
	if ($prev_task!=-1)
		{
			$query = "SELECT DATE_FORMAT(end_date, '%d') as start_day, DATE_FORMAT(end_date, '%m') as start_month,".
				" DATE_FORMAT(end_date, '%Y') as start_year FROM $TASK_TABLE WHERE task_id=".$prev_task;
			list($qh,$num) = dbQuery($query);
			if ($num>0){
				$dat = dbResult($qh);
				$value_day = $dat["start_day"];
				$value_month = $dat["start_month"];
				$value_year = $dat["start_year"];
			}
		}
		else
		{
			//$value_day = $data["start_day"];
			//$value_month = $data["start_month"];
			//$value_year = $data["start_year"];
			$value_day = "6";
			$value_month = "3";
			$value_year = "2005";
		}
	setValue($start_day, $value_day);
	setValue($start_month, $value_month);
	setValue($start_year, $value_year);
}

....

?> 
<html>
<head>

<script language="JavaScript">
<!--
function setValue(FieldName, FieldValue)
{
	if (E = getObjectById(FieldName))
		E.value = FieldValue;
}
// -->
</script>

<title>Edit Task</title>
<?php include ("header.inc"); ?>
</head>
<body <? include ("body.inc"); ?> >
....

<? $query = "SELECT task_id, name FROM $TASK_TABLE WHERE proj_id=".$data["proj_id"];
      
		list($qh, $num) = dbQuery($query);
		if ($num > 0) {
			//print "<select name=\"prev_task\" onChange=\"prev_date(".$data["prev_task"].",'start_day','start_month','start_year')\" style=\"width:100%;\">";?>
			<select name="prev_task" onChange="<? echo prev_date($data["prev_task"],'start_day','start_month','start_year');?>" style="width: 100%">
			<?
			print "<option value='-1'></option>";
			while ($return = dbResult($qh)) {
				if ($return["task_id"]!=$task_id){
					print "<option value=\"$return[task_id]\"";
					if ($data["prev_task"] == $return["task_id"])
						print " selected";
					print ">$return[name]</option>\n";
				}
			}
			print "</select>";
		}

....
Merci
@+

Posté : 30 juin 2006, 13:53
par Truc
tu confonds Javascript et PHP:

"prev_date" est une fonction PHP qui ne peut pas être appelée sur "onchange" de javascript.
Même genre de remaque pour "setValue" qui est cette fois du javascript mais appelé depuis PHP.

Je n'ai pas vraiment le temps de voir ça de plus près maintenant (pas vraiment saisi ce que tu veux faire) je repasserai plus tard.

Posté : 30 juin 2006, 14:16
par leakcim51
Merci,
après de nombreuses recherches j'ai compris que je ne pouvais pas appeler la fonction setValue (Javascript) dans une fonction PHP.

Donc ma question est si vous connaissez un moyen d'attribuer une valeur à une liste déroulante comme avec la fonction setValue.

Pour situer un peu mieux ce que je veux :

J'ai une liste déroulante qui gére la tâche qui précéde la tâche que je suis en train de modifier.

Ensuite j'ai trois listes déroulantes qui gèrent la date de début de ma tâche (une pour le jour, une pour le mois et une pour l'année).

Et je veux que lorsque je sélectionne une tache dans la première liste, la date de début de la tâche que je suis en train de modifier prend pour valeur la date de fin de la tâche selectionner et donc modifie les trois listes de facon automatique.

@+

Posté : 30 juin 2006, 22:11
par Truc
tu peux soit passer par ajax (mais plus difficile) soit récupérer les infos grâce à la requete php pour contruire un tableau javascript puis sur onchange de la 1er liste effectuer le lien entre 'this.value' et les données correspondantes du tableau JS.

Posté : 03 juil. 2006, 12:02
par leakcim51
J'ai essayé de passer par le tableau JS mais j'ai toujours un problème :
lorsque je choisis une valeur dans la liste déroulante: j'ai en bas de ma fenêtre IE l'icone erreur : et lorsque je clique dessus, j'ai :

Code : Tout sélectionner

Ligne : 12 Car : 4 Erreur : Cet objet ne gère pas cette propriété ou cette méthode Code : 0
Voici le code source de la page:

Code : Tout sélectionner

<html> <head> <script language="JavaScript"> <!-- function PhpArray2Js(tabphp_serialise,fieldname,fieldvalue) { this.php = corrigerChainePHP(tabphp_serialise); var dim = this.extraireDimTab(); this.tabjs = this.transformer(dim); //this.formulaire.fieldname.value=this.tabjs[fieldvalue]; } PhpArray2Js.prototype.retour = function() { // retourne le tableau JS return this.tabjs; } .... <select name="prev_task" onChange="PhpArray2Js('a:3:{i:24;s:1:"5";i:22;s:1:"4";i:25;s:1:"6";}','start_day','this.options[selectedIndex].value')" style="width: 100%"> <option value='-1'></option><option value="22">Tache 1</option> .....
Voici le code php de la page :
$query3 = "SELECT task_id, DATE_FORMAT(end_date,'%e') as start_day FROM $TASK_TABLE WHERE proj_id=".$proj_id;

$tab_task = array();

list ($qh3,$num3) = dbQuery($query3);
if ($num3>0)
{
	while ($data3 = dbResult($qh3))
	{
		$tab_task[$data3["task_id"]] = $data3["start_day"];
	}
}

...

<html>
<head>

<script language="JavaScript">
<!--
function PhpArray2Js(tabphp_serialise,fieldname,fieldvalue) {
   this.php = corrigerChainePHP(tabphp_serialise);
   var dim = this.extraireDimTab();
   this.tabjs = this.transformer(dim);
   //this.formulaire.fieldname.value=this.tabjs[fieldvalue];
}

PhpArray2Js.prototype.retour = function() {
        // retourne le tableau JS
        return this.tabjs;
}

....

// -->
</script>

....

<select name="prev_task" onChange="PhpArray2Js('<?echo  htmlspecialchars(serialize($tab_task), ENT_QUOTES) ;?>','start_day','this.options[selectedIndex].value')" style="width: 100%">

....
Merci pour votre aide

Posté : 04 juil. 2006, 17:20
par leakcim51
Victory!

J'ai enfin réussi à faire ce que je voulais.

L'idée est peut être pas la plus simple mais ça marche... donc tant que ça marche on touche plus :D

Sinon voici la démarche que j'ai utilisé si jamais ça interesse certains:

Au début de mon fichier, je sélectionne toutes les dates de fin que je décompose en jour, mois et année.
$query3 = "SELECT task_id, DATE_FORMAT(end_date,'%e') as start_day, DATE_FORMAT(end_date,'%c') as start_month, ".
	"DATE_FORMAT(end_date,'%Y') as start_year FROM $TASK_TABLE WHERE proj_id=".$proj_id." ORDER BY task_id";
Je stocke le résultats dans un tableau multidimension.
$tab_task = array();

list ($qh3,$num3) = dbQuery($query3);
if ($num3>0)
{
	while ($data3 = dbResult($qh3))
	{
		$tab_task[$data3["task_id"]] = array($data3["start_day"],$data3["start_month"] , $data3["start_year"]);
	}
}
Puis j'ai créer une fonction qui va mettre le tableau dans une chaîne de caractère.
function creer_chaine($tableau)
{
	$chaine = "";
	foreach ($tableau as $cle=>$valeur)
	{
		if(is_array($valeur))
		{
			$chaine = $chaine.$cle."|";
			$chaine = $chaine.creer_chaine($valeur);
		}
		else
		{
			$chaine = $chaine.$valeur."&";
		}
	}
	return $chaine;
}
Ensuite j'appelle cette fonction
$jdate = date('j');
$mdate = date('n');
$ydate = date('Y');

$chaine="0|".$jdate."&".$mdate."&".$ydate."&";
$chaine = $chaine.creer_chaine($tab_task);
Et au momment de ma liste déroulante prev_task j'ajoute l'évènement OnChange suivant :
<td align="right">Preview Task:</td>
<td>
	<? $query = "SELECT task_id, name FROM $TASK_TABLE WHERE proj_id=".$proj_id." ORDER BY task_id";
      
	list($qh, $num) = dbQuery($query);
	if ($num > 0) {
		?>
		<select name="prev_task" onChange="affich_tab('<?echo $chaine;?>',this.options[this.selectedIndex].value, 'start_day', 'start_month', 'start_year');" style="width: 100%">
		<?
		print "<option value='0'></option>";
		while ($return = dbResult($qh)) {
		if ($return["task_id"]!=$task_id){
			print "<option value=\"$return[task_id]\"";
			print ">$return[name]</option>\n";
		}
	}
	print "</select>";
}

else {
	print "<select name=\"dummy\" disabled=\"true\" style=\"width: 100%;\">\n";
	print "  <option>There are no tasks assigned</option>\n";
	print "</select>\n";
}?>
</td>
Et voici le code Javascript du OnChange:

Code : Tout sélectionner

<html> <head> <script language="JavaScript"> <!-- function affich_tab( array_str , ind, day, month, year) { var tab = new Array(); var array_length = array_str.length; var $i = 0; while ($i < array_length ) { index_pipe = array_str.indexOf('|',$i); index_et_day = array_str.indexOf('&',index_pipe ); index_et_month = array_str.indexOf('&', index_et_day + 1 ); index_et_year = array_str.indexOf("&" , index_et_month + 1 ); cle = array_str.substring($i,index_pipe); valeur_day = array_str.substring(index_pipe+1,index_et_day); valeur_month = array_str.substring(index_et_day+1,index_et_month); valeur_year = array_str.substring(index_et_month+1,index_et_year); $i = index_et_year+1; tab [cle] = Array (valeur_day, valeur_month, valeur_year); } document.getElementById(day).value = tab[ind][0]; document.getElementById(month).value = tab[ind][1]; document.getElementById(year).value = tab[ind][2]; } // --> </script>
Merci pour votre aide et j'espère que le temps passé sera bénéfique à quelqu'un.

@+