Page 1 sur 1

Prob menu niveau infinis [2]

Posté : 24 août 2006, 16:38
par Merlin82
Salut tout le monde, j'ai posté une question sur le forum lundi.

Un ami m'a proposé de m'écrire le code qu'il me fallait en Delphi.
Prob -> Je n'arrive pas à le traduire, j'y comprend rien.
Quelqu'un connaîtrait le Delphi... et le PHP ?

Salut à tous de Suisse.

Code : Tout sélectionner

procedure TForm1.FormCreate(Sender: TObject); begin With database do Begin close; DatabaseName:='test'; DatabaseFileName:='c:\prov\test.adb'; End; With Table do Begin close; DatabaseName:='test'; TableName:='table'; open; indexname:='in_tab'; End; With Table2 do Begin close; DatabaseName:='test'; TableName:='table'; open; indexname:='in_tab'; End; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Table.close; Table2.close; database.close; end; procedure TForm1.Button1Click(Sender: TObject); begin Table.First; While (not table.Eof) and (table.FieldByName('parent_id').asinteger=0) do Begin showmessage(table.FieldByName('node_name').asstring); recherche_niveau(table.FieldByName('id').asinteger); table.Next; End; end; procedure TForm1.recherche_niveau(param:integer); Var Bmk : TBookMark; begin if table2.FindKey([param]) then Begin While (not table2.Eof) and (table2.fieldbyname('Parent_id').asinteger=param) Do Begin showmessage(table2.FieldByName('node_name').asstring); Bmk:= table2.GetBookmark; recherche_niveau(table2.FieldByName('id').asinteger); table2.Gotobookmark(Bmk); table2.freebookmark(Bmk); table2.next; End; End; end;

Posté : 24 août 2006, 16:46
par iclo
Salut,

Désolé mais je me permets d'émettre de gros doutes sur les chances de succès de traduire du code d'un langage de 4ème génération tel que Delphi, en un code php. Ce sont deux technologie très très différentes.

Il y a surement moyen de parvenir au résultat que tu attends au final, mais partir d'un code Delphi, ça revient à passer par le Pole Nord, en voulant se rendre de Paris à Marseilles (Le TGV est tellement mieux en +)
Sérieusement, il vaut mieux que tu partes de rien, et que tu programmes ce que tu as besoin directement en php.

Expliques nous plutot ce que tu souhaites faire...

Posté : 24 août 2006, 16:51
par Merlin82
Salut, merci de ta réponse rapide.

J'ai déjà passé 3 jours complets sur cette fonction qui me semblait en fait toute simple, mais je suis bloqué...

Il m'a dit que de son côté en delphi ca marchait terrible... ce qui veut dire qu'en PHP ca doit quand même être faisable...

J'ai trouvé une multitude de site ou il en parlait... mais personne n'a trouvé de solution....

Tout ce que j'arrive à faire, lol c'est planté mon navi parce que mes boucles tourne à l'infini lol

T'as pas une idée?

Posté : 24 août 2006, 16:55
par iclo
On veut bien t'aider, mais si tu ne nous dis pas ce que tu veux faire, on ne peut pas t'aider...

Posté : 24 août 2006, 17:03
par Merlin82
Excuses... j'en oubliais le principale.
Quelques personnes du forum ont déjà planché sur le problème lundi.

Ma table contient les champs suivants :

Code : Tout sélectionner

`id` int(4) NOT NULL auto_increment, `parent_id` int(4) NOT NULL default '0', `node_name` varchar(255)', `node_url` varchar(255)',
Admettons que j'y insère les données suivantes :

Code : Tout sélectionner

ID Parent_id Nom 1 0 Accueil 2 0 Magasin 3 0 Contact 4 2 Suisse 5 2 France 6 4 Lausanne 7 4 Genève 8 4 Zurich 9 5 Paris 10 5 Marseille
Le but et d'y sortir un tableau (plus tard un menu) qui permet d'afficher la structure du menu.

les enregistrements ayant 0 sous parent_id sont des catégories principales.

Les autres enregistrements sont des sous-rubriques de l'enregistrement indiqué sous parent_id . Par exemple, d'après le tableau, on voit que Marseille est un sous-menu de France et que Zurich est un sous-menu de Suisse. Par contre Accueil, magasin et Contact sont des rubriques principales.

Le but est que l'utilisateur puisse gérer son menu avec des niveaux infinis.
afficher le premier niveau se fait sans problème, en sélectionnant les enregistrements ayant 0 sous parent_id, le 1er sous menu aussi, mais après je suis quotte ! :oops:

Je vois vraiment pas comment on peut faire ce test en continue (sans passer par le pôle nord et sans TGV lol ) :D

Posté : 24 août 2006, 17:26
par graphistnet
Une solution serait de définier dans le champs parent_id le niveau du menu/sous-menu, je m'explique :

Admettons que tu aies deux partie dans le menu :

Code : Tout sélectionner

1ere partie : id=1 parent_id=0 2eme partie : id=2 parent_id=0
Un sous-menu dans la 1ere partie et deux sous_menu dans la partie 2 :

Code : Tout sélectionner

sous_menu1 : id=3 parent_id=1 sous_menu2 : id=4 parent_id=2 sous_menu3 : id=5 parent_id=2
Jusque là nous utilisons donc ton principe, rajoutons maintenant un sous-sous-menu dans le sous_menu2 par exemple et nous aurons

Code : Tout sélectionner

sous_sous_menu1 : id=6 parent_id=2|4
Et ainsi de suite en rajoutant un séparateur par niveau.

Posté : 24 août 2006, 20:49
par aelurus
Sinon une piste
http://www.comscripts.com/scripts/php.a ... u.679.html

je pense que cela peux te faire une bonne base de depart et ou inspiration

Ca y'est !!!

Posté : 25 août 2006, 16:20
par Merlin82
Salut,
Merci à tous pour le coup de main ! Ca fait toujours plaisir de voir qu'on peut se faire aider quand on est coince !
Je sais que beaucoup de monde chercher une solution à ce problème...
je vous donne la fonction pour afficher les infos.
A+
function recherche_niveau($param,$niv){
	$espace = "      ";
	$result = mysql_query("SELECT * FROM menu WHERE parent_id = $param ORDER BY id ASC");
	while ($row  =  mysql_fetch_array($result,MYSQL_NUM)) {
		$i = 1;
		while($i < $niv){
			echo $espace;
			$i++;
		}
		echo $row[2].".".$niv."<br>";
		$niv=$niv+1;

		recherche_niveau($row[0],$niv);	
		$niv--;
	}
}

l'appel de la fonction:

$param  = 0;
$niv = 1;
recherche_niveau($param,$niv);