Quand la liste déroulante refuse de se mettre à jour...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Quand la liste déroulante refuse de se mettre à jour...

par GiorgioLino » 13 mars 2009, 18:03

aff_ajout_tache est l'id de la <div> qui contient tout le code de la page où j'ai mes trois listes. Cette div contient donc notamment le code des trois listes en question.

La fonction update() provient de la librairie javascript prototype.js .
ça ne m'a pas franchement avancé de le voir car je n'y ai rien compris. :shock:

Voici son code à tout hasard :
    update: function(object) {
      return new Hash(object).inject(this, function(result, pair) {
        result.set(pair.key, pair.value);
        return result;
      });
    }

Par ailleurs transport.responseTxt contient tout le code html de la page en cours après un choix dans la liste déroulante. La fonction update doit (devrait plutôt) mettre à jour ce code en provisionnant les bons éléments dans la deuxième liste. Ce qu'elle ne fait visiblement pas.

A l'intérieur de la div 'aff_ajout_tache' et avant le code des listes, il y a ce bout de code php :
<?php
	ob_start();
	require_once($_SERVER['DOCUMENT_ROOT'] . "Classes/Activite.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "Classes/ActiviteMgr.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "Classes/Utilisateur.class.php");
	
	header('Content-Type: text/html; charset=iso-8859-1');
	if(isset($_GET['reload_box'])){
		session_start();
	}
	$perimetreMgr = PerimetreMgr::getInstance();
?>

Est-ce que cela pourrait être du à une mauvaise gestion du cache ?

par Ryle » 13 mars 2009, 13:09

As-tu vérifié la valeur retournée par ajax avec un alert(transport.responseText) par exemple ?

Par ailleurs, une fois ta réponse récupéré tu fais appel à la fonction update() de l'élément $(bloc) qui correspond je suppose à l'élément dont l'id est 'aff_ajout_tache' ... mais je ne vois pas cet élément dans ton code, et encore moins à quoi peut correspondre la fonction update()

Tu peux donc commencer par vérifier le retour ajax et le traitement de cette fonction :)

Quand la liste déroulante refuse de se mettre à jour...

par GiorgioLino » 13 mars 2009, 12:54

Bonjour,

je teste actuellement le fonctionnement d'une application développée sous php.

Dans une des pages de l'appli, j'ai trois liste déroulante côte-à-côte. sachant que :
1. la première est remplie automatiquement au chargement de la page avec des données en base (MySQL).
2. Chaque liste suivante est provisionnée en fonction de l'élément choisi dans la précédente.
3. Les provisionnements sont traités par des fonctions javascript/ajax (cf. code plus bas).


Le problème ?
Après un choix dans la première liste, il ne se passe rien, la deuxième liste déroulante reste vide. La variable correspondante (id de l'élément) est pourtant bien transmise à la fonction JS, je l'ai vérifié en faisant un alert(this.value). Après avoir cherché un peu, je me dis que ça doit provenir des fonctions Javascript/Ajax mais je n'arrive pas à voir où.

Quelqu'un a-t-il une idée du pourquoi ça ne marche pas ?

Merci.



P.S.

Le code des trois listes déroulantes
<select id="perimetre" onchange="majDivAjoutTache(this.value, 'sp');">
		<option value="0">Choisissez...</option>
		<?php
			foreach($perimetreMgr->getPerimetres() as $p){
				echo "<option value=\"" . $p->getId() . "\"";
				if(isset($_GET['perimetre']) && $_GET['perimetre'] == $p->getId()) echo "selected";
				echo ">" . $p->getNomPerimetre() . "</option>";
			}
		?>
	</select>
<select id="ssPerimetre" onchange="majDivAjoutTache(this.value, 'a');">
	<option value="0">Choisissez...</option>
	
		<?php
			if(isset($_GET['perimetre'])){
				$perimetreMgr = PerimetreMgr::getInstance();
				// Ajout des sous perimetres
				//$ssPerimetres = $perimetreMgr->getSousPerimetres($perimetreMgr->getPerimetreById($_GET['perimetre']));
				$ssPerimetres = $perimetreMgr->getSousPerimetres($_GET['perimetre']);
				foreach($ssPerimetres as $sp){
					echo "<option value=\"" . $sp->getId() . "\"";

					if($_GET['ssPerimetre'] == $sp->getId())
						echo " selected ";

					echo ">" . $sp->getDescription() . "</option>";
				}
			}
		?>
	</select>
	<?php
  
  ?>

	< select ="d_activite" onchange="$('ajouterTache').disabled=false; $('bookmarkerActivite').disabled=false">
		<option value="0">Choisissez...</option>
		<?php
			$activiteMgr = ActiviteMgr::getInstance();
			if(isset($_GET['ssPerimetre'])){
				// Ajout des activités
				$activites = $activiteMgr->getActivitesBySsPerimetre($_GET['ssPerimetre']);
				foreach($activites as $a){
					if(!$a->estClose())
						echo "<option value=\"" . $a->getId() . "\">" . $a->getDescription() . "</option>";
				}
			}
		?>
	</select>
<button id="ajouterTache" disabled onclick="ajouterTache()">Ajouter</button>&nbsp;
	<button id="bookmarkerActivite" disabled= onclick="bookmarquerActivite(<?php echo $_SESSION['gu_user']->getId(); ?>)">Bookmark</button>

	<?php
		$_activites = array();
		$_activites = $activiteMgr->getActivitesBookmarks($_SESSION['gu_user']->getId());
	?>
	<br /><br />
	Mes bookmarks : <select id="d_activite_b" onchange="$('ajouterTacheBookmark').disabled=false;$('supprimerBookmark').disabled=false;">
		<option value="0">Choisissez...</option>
		<?php

				for($i = 0; $i < count($_activites); $i++){
					if($_activites[$i] != null){
						echo "<option value=\"" . $_activites[$i]->getId() . "\">";
						echo "<b>" . $_activites[$i]->getSousPerimetre()->getPerimetre()->getNomPerimetre() . "</b> - ";
						echo " " . $_activites[$i]->getSousPerimetre()->getDescription(). " - ";
						echo $_activites[$i]->getDescription();
						echo "</option>";
					}
				}
		?>
	</select>

Codes des fonctions Javascript/Ajax

La première...
// Mets à jour le bloc de selection de l'activite dans l'ajout de taches
majDivAjoutTache = function(perimetre, t){
	if(t == 'sp')
		url = "modules/m_timesheet/m_ajout_tache.php?reload_box=1&perimetre=" + perimetre;
		
	if(t == 'a')
		url = "modules/m_timesheet/m_ajout_tache.php?reload_box=1&ssPerimetre=" + perimetre + "&perimetre=" + $('perimetre').value;
		
	rechargerBlocSansMessage(url, 'aff_ajout_tache');
}

La deuxième...
// Recharge un bloc @param bloc en y insérant le contenu de la page @param url
rechargerBlocSansMessage = function(url, bloc){
	$('chargement').show();
	new Ajax.Request(url, {
		onSuccess: function(transport) {
			$(bloc).update(transport.responseText);
			$('chargement').hide();
		}
	});
}