PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Forentiefe > 1 - wie?



dead_orc
06.01.2005, 18:52
Ich weiß, der Titel ist sch****, aber das kann man nicht innerhalb einer Zeile erklären. Ich möchte in meinem Forum mehr als eine Ebene Unterforen auf der starseite anzeigen. Mein aktueller Code ist so aufgebaut (grob):

<?php
$foren = mysql_query("SELECT * FROM `foren` WHERE `parentid` = 0 ORDER BY `sort`");
while($forum = mysql_fetch_array($foren))
{
echo $forum['name'];
$unterforen = mysql_query("SELECT * FROM `foren` WHERE `parentid` = ".$forum['id']." ORDER BY `sort`");
while($unterforum = mysql_fetch_array($unterforen))
{
echo $unterforum['name'];
}
}
?>
Das ist stark vereinfacht, aber sonst wird es zu viel Code! Wie bekomme ich es jetzt (am besten mit einer for oder while Schleife) hin, dass mehrere Ebenen dargestellt werden (wie hier, im RPG-Ring, z.B. 2 Unterforen) ohne dass ich jetzt den Codeteil nochmal kopieren muss?

-CC-
07.01.2005, 06:31
$subforum_tiefe = 3; // Hier eben die Tiefe angeben

$foren = mysql_query("SELECT * FROM `foren` WHERE `parentid` = 0 ORDER BY `sort`");
while($forum = mysql_fetch_array($foren))
{
$parent = $forum['id'];
$i = 1;
while ($i <= $subforum_tiefe)
{
$unterforen = mysql_query("SELECT * FROM `foren` WHERE `parentid` = ".$parent." ORDER BY `sort`");
while($unterforum = mysql_fetch_array($unterforen))
{
echo $unterforum['name'];
}
$parent = $unterforen['id'];
$i++;
}
}


untested (tm)

(by the way: ich hasse es, dass innerhalb des PHP-Tags Tabs / Spaces ignoriert werden bzw. so gesetzt, wie das vB gerade gelaunt ist ;))

dead_orc
07.01.2005, 06:55
Das funktioniert nur bedingt. Wenn meine Foren-Struktur z.B. so aussieht:


Hauptforum
+- Unterforum 1
|+- Unterforum von Unterforum 1
+- Unterforum 2
|+- Unterforum von Unterforum 2

Dann wird nur Hauptforum, Unterforum 1, Unterforum 2 und Unterforum von Unterforum 2 angezeigt :(

[EDIT] Und wenn ich am Ende der while-Schleife "while($unterforum = @mysql_fetch_array($unterforen))" ein "break" einsetze, dann wird zwar das Unterforum von Unterforum 1 angezeigt, aber Unterforum 2 und Unterforum von Unterforum 2 nicht mehr :( :( :(

Kermit.d
07.01.2005, 07:51
Wenn ich Zeit finde, dann schreib ich heute abend nen Tutrial dazu, da das schon ein wenig komplexerer Script ist. Ich editiers dann hier in den Post rein.

-CC-
07.01.2005, 10:05
So, nun hab ich selbst mal was gebastelt. Hier das Ergebnis:
http://www.cgerharz.de/subforums.php
Darstellungstiefe lässt sich selbst auswählen (1, 2, 3), Standard ist 2

Zu Grunde liegt folgende Tabelle in der DB:

CREATE TABLE `subforums` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`parent_id` INT DEFAULT '0' NOT NULL ,
PRIMARY KEY ( `id` )
);

INSERT INTO `subforums` (`id`, `name` , `parent_id` )
VALUES ('1', 'Mainforum 1', '0'), ('2', 'Mainforum 2', '0'),
('3', 'Subforum 1', '1'), ('4', 'Sub-subforum 1', '3'),
('5', 'Sub-sub-subforum 1', '4'), ('6', 'Subforum 2', '2'),
('7', 'Sub-subforum 2', '6'), ('8', 'Mainforum 3', '0'),
('9', 'Subforum 3', '8');


Achja, und der Quellcode: http://www.cgerharz.de/subforums.php?source=true


Hoffe mal, dass du damit was anfangen kannst ;)

Kermit.d
07.01.2005, 10:14
Bei deiner Version ist die Tiefe aber weiterhin begrenzt. Ich schreib da heute abend mal den richtigen weg, wie man das unbegrenzt realisieren kann. ;)

-CC-
07.01.2005, 10:23
Bei deiner Version ist die Tiefe aber weiterhin begrenzt. Ich schreib da heute abend mal den richtigen weg, wie man das unbegrenzt realisieren kann. ;)
Das hier geht unbegrenzt... ich hab nur nicht mehr Foren angelegt

Hab jetzt noch 2 dazugepackt, ohne was am Script (außer den Links oben) zu ändern. ;)



INSERT INTO `subforums` ( `id` , `name` , `parent_id` )
VALUES ('10', 'Sub-sub-sub-subforum 1', '5'), ('11', 'Sub-sub-sub-sub-subforum 1', '10');

Oder bin ich blöd und hab das Problem nicht verstanden? http://www.multimediaxis.de/images/smilies/old/1/gruebel.gif

Kermit.d
07.01.2005, 10:41
Ok, aber der Script erkennt nicht selbständig die Forentiefe, so dass man beim Einfügen weiterer Foren immer die Tiefe manuell ändern muss, oder?

-CC-
07.01.2005, 10:50
Ok, aber der Script erkennt nicht selbständig die Forentiefe, so dass man beim Einfügen weiterer Foren immer die Tiefe manuell ändern muss, oder? Da hast du allerdings recht, man muss immer per URL die Anzahl der Subforen übergeben, die angezeigt werden sollen. Aber ich glaube, dass er genau das will. :confused:

Wenn nicht, einfach nochmal melden, dann pass' ich's entsprechend an.

dead_orc
07.01.2005, 10:53
Der Quellcode lässt mich vermuten, dass du das gleiche Problem wie ich hast: Leg mal ein zweites Unterforum des ersten Oberforums an und darunter noch eines. Ich glaube, das darunter wird nicht angezeigt!

[EDIT] Ja, das wollte ich auch haben! Zur Not kann man 100 einstellen :D

-CC-
07.01.2005, 10:56
Der Quellcode lässt mich vermuten, dass du das gleiche Problem wie ich hast: Leg mal ein zweites Unterforum des ersten Oberforums an und darunter noch eines. Ich glaube, das darunter wird nicht angezeigt!
Hast recht, man sieht jetzt nur noch die beiden Unterforen. Werde das mal schnell fixen ;)

dead_orc
07.01.2005, 10:59
Ich glaube kaum, dass das mal eben so geht! Ich habe das Problem ja schon gehabt und schon ein wenig rumprobiert. Dürfte schwer werden, das einfach so zu fixen.
@alle, die meinen, man könnte den Code vom phpBB so toll lesen: guckt doch bitte mal nach, wie die das machen (if possible).

Geiu
07.01.2005, 11:14
@alle, die meinen, man könnte den Code vom phpBB so toll lesen: guckt doch bitte mal nach, wie die das machen (if possible). phpBB unterstützt aber auch nur eine Ebene...

Manni
07.01.2005, 11:20
Ich präsentiere hier mal meine Lösung:

Das PHP Script "sub.php":

<?php
$host = "localhost";
$user = "root";
$password = "deinpasswort";
$db = "sub";
global $maxstufe;
$maxstufe = 10;
$connection = mysql_connect($host, $user, $password);
mysql_select_db($db);
sub_loop("", 0, "");

function sub_loop($id, $stufe, $zeiger) {
global $maxstufe;
$temp = get_subs($id);
for($j = 0; $j < count($temp); $j++) {
echo $zeiger.">".$temp[$j]['name'] ."<br>\n";
if($stufe < $maxstufe) {
sub_loop($temp[$j]['id'], ($stufe+1), $zeiger."&nbsp;&nbsp;");
}
}
}

function get_subs($id) {
$query = "SELECT * FROM `sub` WHERE `parent` = '".$id."';";
$response = mysql_query($query);
while($temprow = mysql_fetch_array($response)) {
$returnarray[] = $temprow;
}
return $returnarray;
}
mysql_close($connection);
?>

Die MySQL Befehle:

#
# Tabellenstruktur für Tabelle `sub`
#

CREATE TABLE `sub` (
`id` int(10) NOT NULL auto_increment,
`parent` int(10) NOT NULL default '0',
`name` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=11 ;

#
# Daten für Tabelle `sub`
#

INSERT INTO `sub` VALUES (1, 0, '1');
INSERT INTO `sub` VALUES (2, 0, '2');
INSERT INTO `sub` VALUES (3, 1, '1.1');
INSERT INTO `sub` VALUES (4, 1, '1.2');
INSERT INTO `sub` VALUES (5, 2, '2.1');
INSERT INTO `sub` VALUES (6, 2, '2.2');
INSERT INTO `sub` VALUES (7, 3, '1.1.1');
INSERT INTO `sub` VALUES (8, 3, '1.1.2');
INSERT INTO `sub` VALUES (9, 4, '1.2.1');
INSERT INTO `sub` VALUES (10, 4, '1.2.2');

Und das Ergebnis:
http://mannithedark.ma.funpic.de/Tests/sub.php

Manni ;)

dead_orc
07.01.2005, 11:28
Jo, vielen Dank. Hoffentlich kann ich das jetzt an mein Forensystem anpassen ;)

@kermit: Dein Tut würd mich trotzdem mal interessieren! :D

[EDIT] Hat geklappt, ist prima integriert! Vielen Dank nochmal!

Manni
07.01.2005, 11:52
BTW, noch ein paar Anmerkungen:

Beim ersten Aufruf der Funktion "sub_loop()" kann man mit dem ersten Parameter (der ID) auch nur die Unterobjekte einer bestimmten Parent-ID anzeigen lassen. Dadurch und durch den mehrmaligen Aufruf der Funktion kann man sic genau anzeigen lassen, was man will.

Die Bedingung "if($stufe < $maxstufe)" ist nicht unbedingt notwendig und kann weggelassen werden, allerdings zeigt die Funktion dann immer alle Unterobjekte an. In einem Forum kann man aber zum Beispiel mit dieser Beschränkung dem User die Möglichkeit geben, selbst festzulegen, bis zu welcher Tiefe er die Foren anzeigen lassen will...
Dann wird der Parameter $maxstufe überflüssige.

Ich werde dieses Script evtl. auch in dem Forum verwenden, was ich atm. programmiere... (wenn's euch interessieren sollte ;))

Ansonstern viel Spaß mit dem Script :D

Manni

-CC-
07.01.2005, 11:57
Ich hätte meins jetzt auch so weit, würde aber trotzdem Mannis nehmen, denn das ist kürzer, übersichtlicher und einfacher ;)

Und jetzt ärgere ich mich, dass ich nicht die Idee mit der sich selbst aufrufenden Funktion hatte, weil ich bei einer ähnlichen Problemstellung schonmal sowas hatte >_<

dead_orc
07.01.2005, 12:02
@Manni: oO wer macht denn hier noch alles ein Forum??? Ich dachte immer, dadie und ich wären die einzigen! Dann kam noch Tomarus dazu, und nun auch noch du. Ich fühle mich so überflüssig :(

@CC: nicht aufregen :D Ich hatte die Idee, hab aber dummerweise nicht mal versucht, sie umzusetzen sondern hab gedacht, dass man das auch mit Schleifen hinbekommen müsste. Naja, danke euch allen!

Kermit.d
07.01.2005, 13:44
@kermit: Dein Tut würd mich trotzdem mal interessieren!Das hat sich jetzt gelube ich erldigt, da ich es wie manni mit einer rekursiven Funktion gemacht hätte.