$_GET $_POST et $_SESSION

Petit nouveau ! | 4 Messages

15 juin 2011, 11:28

Bonjour,

Je suis en stage de développement web, mais ayant appris par mes propres moyens (et gràce aux multiples forums et tutoriaux disponibles), il me manque des bases.

Je travaille actuellement sur la mise en page d'une liste de résultats (suite à une recherche ou à une exploration de dossiers). Ma page propose trois fonctions :
  • Une fonction de tri (par date, par titre, etc.) en cliquant sur la colonne
  • Une fonction de filtre (pour choisir les colonnes que l'on souhaite voir s'afficher)
  • Une petite fonction qui me permet d'afficher ou de masquer le bloc de recherche (avec le formulaire et le texte explicatif)
J'utilise $_GET (pour la 1 et la 3) et $_POST (pour la 2 puisque c'est un formulaire).

Le problème : je ne peux pas cumuler ces trois fonctions. Si j'ai filtré une colonne et que je trie mes résultats, le filtrage sera annulé et ainsi de suite. Je le comprends facilement pour les $_GET, puisque les variables sont effacés de l'url pour laisser place aux nouvelle.

Auriez-vous une idée de comment réussir à combiner ces trois fonctions?

Merci d'avance
function mode_tri()
//pour indiquer quelle fonction de tri sera appelée par usort
//le mode de tri sera sauvé dans $_SESSION['tri']
{
	$liste_tri=array('cod', 'titre', 'date', 'taille', 'etat');
	
	if (!empty($_GET['tri']) && in_array($_GET['tri'], $liste_tri))
	{
		if($_SESSION['tri']==$_GET['tri'].'_c')
		{
			$_SESSION['tri']=$_GET['tri'].'_d';
		}
		else
		{
			$_SESSION['tri'] = $_GET['tri'].'_c';
		}
	}
	elseif (empty($_GET['tri']) || $_GET['tri']!='encore')
	{
		$_SESSION['tri']='tri_liste';
	}
} 
<table>

<?php 
	echo '<FORM name="modcol" method="POST" action="'.$_SERVER['PHP_SELF'].'" />';
?>

<!--option d'affichage du nom -->
<tr id="colonne_titre">	
	<td class="option_filtre">
		Afficher le nom des fichiers : 
	</td>
	<td>
		<?php
			echo 'Oui : <INPUT type="radio" name="aff_nom" value="oui" checked="checked" />';
		?>
	</td>
	<td>
		<?php
			echo 'Non : <INPUT type="radio" name="aff_nom" value="non"';
			if (isset($_POST['aff_nom']))
			{
				if($_POST['aff_nom']=="non")
				{
					echo 'checked="checked" />';
				}
				else
				{
					echo ' />';
				}
			}
			else
			{
				echo ' />';
			}
		?>
	</td>
</tr>

<!--option d'affichage de la colonne Date -->
<tr id="colonne_etat">	
	<td class="option_filtre">
		Afficher la colonne "Date" : 
	</td>
	<td>
		<?php
			echo 'Oui : <INPUT type="radio" name="aff_date" value="oui" checked="checked" />';
		?>
	</td>
	<td>
		<?php
			echo 'Non : <INPUT type="radio" name="aff_date" value="non"';
			if (isset($_POST['aff_date']))
			{
				if($_POST['aff_date']=="non")
				{
					echo 'checked="checked" />';
				}
				else
				{
					echo ' />';
				}
			}
			else
			{
				echo ' />';
			}
		?>
	</td>
</tr>

<!--option d'affichage de la colonne Etat -->
<tr id="colonne_etat">	
	<td class="option_filtre">
		Afficher la colonne "Etat" : 
	</td>
	<td>
		<?php
			echo 'Oui : <INPUT type="radio" name="aff_etat" value="oui" checked="checked" />';
		?>
	</td>
	<td>
		<?php
			echo 'Non : <INPUT type="radio" name="aff_etat" value="non"';
			if (isset($_POST['aff_etat']))
			{
				if($_POST['aff_etat']=="non")
				{
					echo 'checked="checked" />';
				}
				else
				{
					echo ' />';
				}
			}
			else
			{
				echo ' />';
			}
		?>
	</td>
</tr>
	
<tr>
	<td></td>
	<td>
		<INPUT type="submit" value="Mettre &agrave; jour" />
	</td>
</tr>

</table>
function bouton_aff_recherche()
//$_GET['affichage']=='non' si le menu de recherche est fermé
//($_GET['affichage']=='oui') si le menu est ouvert
//la fonction doit ouvrir le menu s'il est fermé, ou le fermé s'il est ouvert
{
	if (!isset($_GET['affichage']))
	{
		$_GET['affichage']='non';
		$texte_option="Ouvrir le menu de recherche";
		$_SESSION['class_bloc_rech']="invisible";
	}
	else
	{
		if($_GET['affichage']=='non')
		{
			$texte_option="Ouvrir le menu de recherche";
			$_SESSION['class_bloc_rech']="invisible";
		}
		elseif($_GET['affichage']=='oui')
		{
			$texte_option="Fermer le menu de recherche";
			$_SESSION['class_bloc_rech']="";
		}
		else
		{
			$texte_option="Ouvrir le menu de recherche";
			$_SESSION['class_bloc_rech']="invisible";		
		}
	}
	echo	'<a	href="'.$_SERVER['PHP_SELF'].'?affichage=';
	echo	(($_GET['affichage']=='non') ? "oui": "non");
	echo	'">';
	echo		'<SPAN class="">
					'.$texte_option.'
				</SPAN>
			</a>';
}
Modifié en dernier par Baroco le 15 juin 2011, 11:37, modifié 1 fois.

Eléphanteau du PHP | 20 Messages

15 juin 2011, 11:37

Salut baroco,
en fait la fonction $SESSION que tu utilises te permet de garder des informations d'une page à l'autre. Si cela est vraiment ton problème il te suffit de mettre ce bout de code au début de la page ou tu utilise $SESSION:

session_start();

Tu mets ce bout de code avant tt ce qu'il existe sur ta page, même avant le html.
En espérant t'avoir aidé ;)
Hail to the king!

Petit nouveau ! | 4 Messages

15 juin 2011, 11:41

J'ai essayé (j'utilise déjà pas mal $_SESSION, donc les session_start(); sont déjà en place).

Mais imaginons que je filtre ma page pour ne garder qu'une seule colonne. Si je sauvegarde ce filtre dans $_SESSION, dès que l'utilisateur reviendra sur cette page, il obtiendra directement une liste filtré (ce qui n'est pas le but).
A la première ouverture de la page (print.php), on doit toujours se retrouver avec les mêmes "options" (aucun filtre, tri par nom et bloc de recherche masqué), et ensuite seulement, suivant les opérations effectués par l'utilisateur, l'affichage devrait se personnaliser.

Eléphanteau du PHP | 20 Messages

15 juin 2011, 11:45

Bon si tu maîtrise déja alors mon post était inutile :P
Et bien si tu veux que la page ou l'on accède en premier ne subisse aucun chngement d'option pourquoi ne pas créer une deuxième page identique mais sans session. Lorsque l'utilisateur rentreras ne serait-ce qu'une option de filtre tu fais un lien vers ta page avec des sessions, ouis si il annule les filtres tu remet a zéro ta session et tu retournes sur ta page sans session. Cette solution est elle envisageable ?
Hail to the king!

Petit nouveau ! | 4 Messages

15 juin 2011, 12:02

A c'est pas bête du tout ça comme idée !

Et du coup, je sauvegarde les paramètres de tri, filtre et d'affichage dans $SESSION ...

Je vais faire ça et je te redis si ça fonctionne.

Eléphanteau du PHP | 20 Messages

15 juin 2011, 12:11

Oui tiens moi au courant :D
Ca fait toujours plaisir d'aider quelqu'un ;)
Hail to the king!

Petit nouveau ! | 4 Messages

15 juin 2011, 14:42

Bon, j'y suis parvenu, mais ca a été assez compliqué.
En fait, j'utilisais déjà les variables de session dans ma page print.php (c'était dedans qu'étaient stockés les éléments de la liste que j'affiche sur print.php, mais qui sont issus de pages précédentes). Je suis obligé de laisser session_start(); .

Du coup, j'initialise le contenu de mes $_SESSION['trucs'] au chargement de print.php, et dès que l'utilisateur personnalise l'affichage (en lançant une des trois fonctions), ça charge print_tri.php. La page commence par récupérer les éventuels $_POST, et les sauve dans $_SESSION, et ensuite l'affichage se fait en fonction de $_SESSION :
  • soit l'utilisateur ne les a pas modifiés, et elles ont les valeurs par défaut enregistrées dans print.php
  • soit l'utilisateur les a modifiéS (au moins 1 fois), et dans ce cas la dernière valeur a été enregistrée dans print_tri.php
Le code n'est pas encore parfait (par exemple, si j'ai deux pages print_tri.php ouvertes en même temps, et que je modifie leur affichage en même temps, ca va me faire du caca), mais c'est déjà beaucoup mieux.

Merci pour ton aide!

Eléphanteau du PHP | 20 Messages

15 juin 2011, 14:52

Oui c'est à ca que je pensais :D
évidemment il va y avoir quelques retouches à ajouter. En tout cas ravis de t'avoir aidé
Hail to the king!