begin process at 2012 05 31 14:02:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Classes & Objets

 > 

récursivité


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

récursivité

lundi 21 décembre 2009 à 18:42:50 | récursivité

eltyty

Bonjour,

Je souhaite faire une boucle récursive afin d'afficher mes rubriques et sous rubriques. Mais pour éviter une trop grande longueur de page je souhaiterai faire ça en deux colonnes quand le nombre de rubrique est trop important.
Voici ma table :
id_rubrique id_parent last (j'indique "oui" quand c'est la dernière rubrique)

Pour ma boucle voici le code ci-dessous qui fonctionne en fonction d'un id passé dans l'url :
Code PHP :
CLASS Affichage_recap_rubrique	{
		public $liste;
		public $erreur;
	FUNCTION __construct() {
		
	}



		public function Liste_rubriques($parent,$profondeur) {
			$connexion = SPDO::getInstance();
			
			
				$sql =' SELECT id_rubrique,id_parent,id_groupe,last, titre,archive, statut,descriptif FROM rubriques WHERE id_parent= ? AND id_groupe!="user" AND archive="'.VISUALISER_ARCHIVE.'"';
				$sql .=' OR id_parent= ? AND id_groupe="user"';
			

			try{
				$select=$connexion->prepare($sql);

					$select->bindParam(1,$parent, PDO::PARAM_INT);
					$select->bindParam(2,$parent, PDO::PARAM_INT);
			}
			catch (PDOException $e)        {
					throw new myException('la requête préparée est incorrecte');
					exit();
				}			 
			 
			$select->execute();
			$nb = $select->rowCount();

			IF ($nb===0){
				RETURN FALSE;
			}
			//SI DES ENREGISTREMENTS EXISTE
			IF ($nb>0) {
				WHILE ($fils=$select->fetch(PDO::FETCH_OBJ)) {
					$this->titre=$fils->titre;
					$this->id_rubrique=$fils->id_rubrique;
					$this->id_parent=$fils->id_parent;
					$this->last=$fils->last;

					//MET UNE MARGE À 0 POUR LA RUBRIQUE PRINCIPALE ET APRÈS ÇA VA DE 40 EN 40
					$espace=40*$profondeur;
					//SI 'EST LA DENIÈRE RUBRIQUE
					//ON MET LE LIEN PUR AFFICHER LA LISTE DES INFOS D'OÙ ACTON=LISTER
					IF ($this->last===oui){

						$this->liste.= '<div style="padding-left:'.$espace.'px"class="lien_rubrique"><a href="./index.php?p=articles&rub='.$this->id_rubrique.'&action=lister"title="Liste des infos">'.$this->titre.'</a>';
						$this->liste.= '</div>';
					}
					//SI C'EST PAS LA DERNIERE RUBRIQUE
					ELSE{

						$this->liste.= '<div style="padding-left:'.$espace.'px"class="lien_rubrique"><a href="./index.php?p=articles&rub='.$this->id_rubrique.'&action=recap&nom='.Filtres::enlever_accents($this->titre).'"title="Récapitulatif des rubriques">'.$this->titre.'</a>';
						$this->liste.= '</div>';
					}
					$this->Liste_rubriques($this->id_rubrique,$profondeur + 1);
				}
			}
		}
		/*******************************************************************
			OBTIENT LE NOM DE LA RUBRIQUE DANS LE GET ET
			SON ID_APRENT QUE L'ON ENVOIE À LA FONCTION LISTE_RUBRIQUES
		******************************************************************/
		PUBLIC function set_rubrique($g_id_rub=NULL){

			IF (!EMPTY($g_id_rub)){
				$connexion = SPDO::getInstance();
				$sql =' SELECT id_parent,titre FROM rubriques WHERE id_rubrique= ? AND id_groupe!="user" ';
				$sql .=' OR id_rubrique= ? AND id_groupe="user"';					
				
				try{
					$select=$connexion->prepare($sql);
						$select->bindParam(1,$g_id_rub, PDO::PARAM_INT);
						$select->bindParam(2,$g_id_rub, PDO::PARAM_INT);
				}
				catch (PDOException $e)        {
					throw new myException('la requête préparée est incorrecte');
					exit();
				}
					$select->execute();
					$nb_tt =  $select->rowCount();
	
					IF ($nb_tt>0){
						$fils=$select->fetch(PDO::FETCH_OBJ);
						$g_titre=$fils->titre;
						$id_parent=$fils->id_parent;
					
						$this->titre_rubrique= 'Sommaire de '.$g_titre;
							//SI ON EST À LA RACINE ON NE MET PAS LE LIEN CAR ON PEUT PAS REMONTER PLUS HAUT
							IF ($id_parent>0){
								
								$this->lien='&nbsp;<font size="3"><a href="./index.php?p=articles&rub='.$id_parent.'&action=recap"title="Revenir en arrière"><b> ../</b></a></font><br /><br />';
							}
							$this->Liste_rubriques($g_id_rub,0);
					}
					//SI LA RUBRIQUE NE RETOURNE AUCUN ENREGISTREMENT
					ELSE{
						$this->titre_rubrique= "<center><h1>Aucun élément ne peut être affiché</h1></center>";
					}
			}
			ELSE {
				ECHO 'Valeur incorrecte';
			}
		}
	}



Cette classe marche mais bien sûr tout est en ligne. Et comme la fonction est récursive je ne vois pas comment je peux faire en sorte que ça s'affiche en deux colonnes par exemple. Voici ce que ça donne :
Code :
 BAT  
   Liens
   témoignages
 JAVA 
   exemples
      Bout de codes
   témoignages
   
 SQL  
   exercices
      tests
   exemples


Donc si quelqu'un à partir de ce code peut me montrer, merci beaucoup d'avance.
lundi 21 décembre 2009 à 21:27:48 | Re : récursivité

JulSoft

Membre Club
Peut être qu'on peut faire ça avec un paramètre statique de ta classe comme compteur, et faire des colonnes dans un tableau à partir de ça...
mardi 22 décembre 2009 à 08:31:03 | Re : récursivité

eltyty

euh...mais encore ? j'ai mis déjà tellement de temps à faire cette classe...là je vois pas trop comment faire dans ce cas ?
mardi 22 décembre 2009 à 23:34:43 | Re : récursivité

phpAnonyme

Salut,

J'ai pas regarder ton code comme il le faut mais, tu dois partir du principe que lorsque $nb atteindra une valeur limite pour qu'une autre colonne soit crée tu clos le div et, tu crée un autre dans le même principe.
Ne pas oublier, l'attribut float dans ton div pour afficher à droite, à gauche bref comme tu veux!
______________________________________________________________________
mercredi 23 décembre 2009 à 19:22:46 | Re : récursivité

eltyty

Ok ça je vois bien mais c'est l'incrémentation de $nb qui me semble dur du fait que ca soit une boucle récursive...
Donc si ta moyen de regarder le code dans ce cas ;-)
Merci d'avance.
jeudi 24 décembre 2009 à 14:15:55 | Re : récursivité

phpAnonyme

Ben, comme je te l'ai dit je n'ai fait que survoler le code mais en faite je vois que $nb ne fait que renvoyer le nombre total d'enregistrement.
Tu pourrais faire par exemple, faire entrer un nouvel objet par exemple :
Code PHP :
<?php private $coupet = 0; ?>


et dans if($nb>0) :

Code PHP :
 
<?php
if($this->coupet==($nb/2))
{
   echo '</div><div...>';
}
else
{
...Ton code normal

$this->coupet++;
}
?>

______________________________________________________________________
jeudi 24 décembre 2009 à 14:22:11 | Re : récursivité

phpAnonyme

Moi a écrit


Tu pourrais faire par exemple, faire entrer un nouvel objet par exemple :

Lol, je reprend :
Tu pourrais faire entrer un nouel objet, par exemple :


J'ai faire un aperçu, j'ai beau me relire, je fais toujours des fautes quelques
______________________________________________________________________
jeudi 24 décembre 2009 à 20:36:54 | Re : récursivité

kohntark

Membre Club

"un nouel objet" => contraction de nouvel et Noël ?
"des fautes quelques " => une fois pour ce que n'est moi pas
"J'ai faire un aperçu"

t'as déjà commencé les hostilités vinicoles du réveillon phpAnonyme ?

Bonne soirée,

Kohntark -
(c'est un petit clin d'oeil amical tu l'auras compris)

vendredi 25 décembre 2009 à 01:34:26 | Re : récursivité

phpAnonyme

Mais nonnn c'était exprès...humm !

Au passage, bonne fête à toi

Bon, moi je retourne...
______________________________________________________________________
samedi 26 décembre 2009 à 06:53:43 | Re : récursivité

hornet_bzz




Hornet bzz 

Salut

Et si tu mémorisais au fur et à mesure ce que tu affiches, et que tu passes cette info lors de l'appel récursif, ça te permettrait d'ajouter un test sur l'affichage .. ?

En voilà une bonne idée !
(Autosatisfaction de Noël)

1 2 3

Cette discussion est classée dans : select, titre, id, parent, rubrique


Répondre à ce message

Sujets en rapport avec ce message

Menu récursif en php et MySQL [ par paguira ] Je cherche un algorithme pour créer un menu  récursif du type :    Titre 1    Titre 2                    Titre 3            Titr Problème avec une requête contenant LEFT JOIN. [ par MonPied ] Bonjour, j'explique mon problème, après un sujet ou je demandais de l'aide pour éviter de faire plein de fois une requête un Zéro me proposa d'uti Réflexion et amélioration du code [ par eltyty ] Bonjour,je met en place un fils d'Ariane, mon code marche mais comme je débute je pense qu'il y a possibilité d'améliorer largement le code.Donc si qu bug sous IE 7 & 8 - parfait sous FF [ par laubro ] bonjourvoilà j'ai un script ajax pour mettre a jour des select en fonction de la selection du select précédant, dans le cadre d'une inscription et don Verification de l'existance d'un ID dans une base mysql [ par Fildomen ] Bonjour, j'ai beau chercher sur le net mais je trouve que des codes pour les select qui retourne plusieurs enregistrements, comme mon ID est unique, m Instruction require_once() et erreur "supplied argument is not a valid MySQL" [ par karpediem ] Bonjour @ toutezéatous,J'ai une question toute bête, j'ai presque honte de la poser, mais je vais prendre sur moi ;o))J'ai une page php qui est appell recuperer l'id d'un enregistrement grace a un clik!!!! [ par snakers07 ] bonjour tout le monde, je vous presente le probleme je suis sous php mysql, j'ai creer mes base, afficher les resultats grace au requete, mais la je b recuperer id d'une ligne tableau sur un clique [ par snakers07 ] bonjour tout le monde, voila mon probleme, je n'arrive pas à récuperer l'id d'une ligne d'un tableau. je precise le tableau est le resultat d'une requ Synthaxe des requetes avec valeur $_POST [ par vinz29 ] Bonjour, Je débute en PHP, et je bloque sur l'affichage d'une requête depuis 2 jours... Voilà, j'effectue une requête vers une base MySQL à partir d' on select execute une function [ par alamandra ] salut à tous , alors voilà j'ai un souci avec un select, arrrffff un champ reputation dans une table users, une page account-details sur laq


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales