Ergebnis 1 bis 19 von 19

Thema: [PHP] Forentiefe > 1 - wie?

  1. #1

    [PHP] Forentiefe > 1 - wie?

    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-Code:
    <?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?

  2. #2
    PHP-Code:
    $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 )

  3. #3
    Das funktioniert nur bedingt. Wenn meine Foren-Struktur z.B. so aussieht:
    Code:
    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

    Geändert von dead_orc (07.01.2005 um 07:06 Uhr)

  4. #4
    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.

  5. #5
    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:
    Code:
    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

  6. #6
    Bei deiner Version ist die Tiefe aber weiterhin begrenzt. Ich schreib da heute abend mal den richtigen weg, wie man das unbegrenzt realisieren kann.

  7. #7
    Zitat Zitat von Kermit.d
    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.

    Code:
     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?

  8. #8
    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?

  9. #9
    Zitat Zitat von Kermit.d
    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.

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

  10. #10
    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

  11. #11
    Zitat Zitat von getöteter_ork
    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

  12. #12
    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).

  13. #13
    Zitat Zitat von getöteter_ork
    @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...

  14. #14
    Ich präsentiere hier mal meine Lösung:

    Das PHP Script "sub.php":
    PHP-Code:
    <?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:
    PHP-Code:
    #
    # Tabellenstruktur für Tabelle `sub`
    #

    CREATE TABLE `sub` (
      `
    idint(10NOT NULL auto_increment,
      `
    parentint(10NOT NULL default '0',
      `
    namevarchar(200NOT NULL default '',
      
    PRIMARY KEY  (`id`)
    TYPE=MyISAM AUTO_INCREMENT=11 ;

    #
    # Daten für Tabelle `sub`
    #

    INSERT INTO `subVALUES (10'1');
    INSERT INTO `subVALUES (20'2');
    INSERT INTO `subVALUES (31'1.1');
    INSERT INTO `subVALUES (41'1.2');
    INSERT INTO `subVALUES (52'2.1');
    INSERT INTO `subVALUES (62'2.2');
    INSERT INTO `subVALUES (73'1.1.1');
    INSERT INTO `subVALUES (83'1.1.2');
    INSERT INTO `subVALUES (94'1.2.1');
    INSERT INTO `subVALUES (104'1.2.2'); 
    Und das Ergebnis:
    http://mannithedark.ma.funpic.de/Tests/sub.php

    Manni

  15. #15
    Jo, vielen Dank. Hoffentlich kann ich das jetzt an mein Forensystem anpassen

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

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

    Geändert von dead_orc (07.01.2005 um 11:52 Uhr)

  16. #16
    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

    Manni

  17. #17
    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 >_<

  18. #18
    @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 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!

  19. #19
    Zitat Zitat
    @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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •