Kategorien verschachteln??

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kategorien verschachteln??

    Hallo!

    Ich habe mir mit PHP ein 3 Ebenen-Menü erstellt.
    wie kann cih das nun so machen, dass da eine unbestimmte Anzahl an Ebenen gehen? Wenn "cat" = "0" ist, wird dies als 1. Ebene gezählt. Die 2. Ebene hat in der Spalte "cat" die "ID" von der 1. Ebene, usw...

    PHP-Code:
    <select name="menu">
    <?php // 1. Ebene oeffnen, auslesen und darstellen
    $hauptsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='0' ORDER BY ID ASC");
    while (
    $haupt mysql_fetch_object($hauptsql)) {

        
    ?>
    <option value="<?php echo $haupt->ID;
        
    ?><?php if ($$select_menu == $haupt->ID) {
            echo 
    "selected";
        } 
        
    ?>><?php echo $haupt->NAME;
        
    ?>
    <?php 
    // 2. Ebene oeffnen, auslesen und darstellen
        
    $untersql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $haupt->ID "' ORDER BY NAME ASC");
        while (
    $unter mysql_fetch_object($untersql)) {

            
    ?>
    <option value="<?php echo $unter->ID;
            
    ?><?php if ($$select_menu == $unter->ID) {
                echo 
    "selected";
            } 
            
    ?>> &nbsp; &nbsp; &nbsp; &nbsp;<?php echo $unter->NAME;
            
    ?>
    <?php 
    // 3. Ebene oeffnen, auslesen und darstellen
            
    $subsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $unter->ID "' ORDER BY NAME ASC");
            while (
    $sub mysql_fetch_object($subsql)) {

                
    ?>
    <option value="<?php echo $sub->ID;
                
    ?><?php if ($$select_menu == $sub->ID) { echo "selected"; } ?>> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<?php echo $sub->NAME;
                
    ?>
    <?php
            

        } 

    ?>
    </select>
    *edit*: Bitte nach mySQL verschieben, ausversehen falches Forum erwischt!
    Zuletzt geändert von Deathrow; 05.04.2004, 01:06.
    Mit freundlichem Gruß,
    Deathrow

  • #2
    da blickt man doch gar nicht durch !

    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
    sondern mit den Augen das Manual zu lesen.

    Kommentar


    • #3
      Ah, Deathrow schowieder !

      In meinen augen ist _einigermaßen_ schöner code wennman statt sowas:
      PHP-Code:
      <?
      while ($unter = mysql_fetch_object($untersql)) {



              ?>

      <option value="<?php echo $unter->ID;

              
      ?><?php if ($$select_menu == $unter->ID) {

                  echo 
      "selected";

              } 

              
      ?>> &nbsp; &nbsp; &nbsp; &nbsp;<?php echo $unter->NAME;

              
      ?>

      <?php // 3. Ebene oeffnen, auslesen und darstellen

              
      $subsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $unter->ID "' ORDER BY NAME ASC");

              while (
      $sub mysql_fetch_object($subsql)) {



                  
      ?>

      <option value="<?php echo $sub->ID;

                  
      ?><?php if ($$select_menu == $sub->ID) { echo "selected"; } ?>> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<?php echo $sub->NAME;

                  
      ?>

      <?php

              


          }
      soetwas schreibt:
      PHP-Code:
      <?php

      while ($unter mysql_fetch_object($untersql)) {
          echo 
      '<option value=' $unter->ID '"';
          if ($
      $select_menu == $unter->ID) {
              echo 
      'selected';
          } 
          echo 
      "> <pre>\t</pre>" $unter->NAME
          
          
      // 3. Ebene oeffnen, auslesen und darstellen
          
      $subsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $unter->ID "' ORDER BY NAME ASC");
          while (
      $sub mysql_fetch_object($subsql)) {
              echo 
      '<option value="' $sub->ID '"'
              
      if ($$select_menu == $sub->ID) {
                  echo 
      'selected';
              } 
              echo 
      "><pre>\t\t</pre>" $sub->NAME;
          } 


      ?>
      (ich hab jetzt keine Acht auf den Sinn gegeben)

      Wenn du so in der Art schreibst... dann ist das übersichlich und man wird dir auch gerne helfen.


      Und, BTW variable Variablen sind in meinen Augen böse!
      Die Musikreview Seite

      hi, i'm a signature virus. copy me into your signature to help me spread.

      Kommentar


      • #4
        oder wenn du sehr an deinem Stil hängst könntest du das Problem auch Theortisch schildern
        Die Musikreview Seite

        hi, i'm a signature virus. copy me into your signature to help me spread.

        Kommentar


        • #5
          Du solltest Dir auch unbedingt angewöhne keine SQL Querys in schleife zu senden, dass ist unperformant.
          Stattdessen Du solltest lieber JOINS benutzen oder wenn es nicht anders geht, die Daten in einem Array ablegen.
          [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

          Kommentar


          • #6
            vielleicht bemühst du auch mal die forumsuche:
            - nested set
            - baummenü
            - treemenü
            ... sind deine freunde
            Kissolino.com

            Kommentar


            • #7
              Warum denn nicht in Schleife?
              Und bei der Suche: Ich habe kein Menü gefunden, was meiner mySQL-Struktur ähnlich sieht!

              Habe aber den Code gebesserrt:
              PHP-Code:
              <select name="cat">
              <?php
              /// 1. Ebene auslesen (haupt)
              $hauptsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='0' ORDER BY ID ASC");
              while (
              $haupt mysql_fetch_object($hauptsql)) {
                  
              ?>

              <option value="<?php echo $haupt->ID?><?php if ($$select_menu == $haupt->ID) { echo "selected"; } ?>><?php echo $haupt->NAME?>

                  <?php 
                  
              /// 2. Ebene auslesen (unter)
                  
              $untersql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $haupt->ID "' ORDER BY NAME ASC");
                  while (
              $unter mysql_fetch_object($untersql)) {
                      
              ?>

                   <option value="<?php echo $unter->ID?><?php if ($$select_menu == $unter->ID) { echo "selected"; } ?>>&nbsp; &nbsp; &nbsp; &nbsp;<?php echo $unter->NAME?>

                      <?php
                      
              /// 3. Ebene auslesen (sub)
                      
              $subsql mysql_query("SELECT * FROM `cv_categories` WHERE CAT='" $unter->ID "' ORDER BY NAME ASC");
                      while (
              $sub mysql_fetch_object($subsql)) {
                          
              ?>

                          <option value="<?php echo $sub->ID?><?php if ($$select_menu == $sub->ID) { echo "selected"; } ?>>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<?php echo $sub->NAME?>

                      <?php 
                      
              /// 3. Ebene schliessen   
                      


                  
              /// 2. Ebene schliessen
                  


              /// 1. Ebene schliessen

              ?>
              Aber wie nun mit der unbestimmten Anzahl an Ebenen? *heul* -> *bin doch auch nur nen anfänger!*
              Mit freundlichem Gruß,
              Deathrow

              Kommentar


              • #8
                Aber wie nun mit der unbestimmten Anzahl an Ebenen?
                vielleicht bemühst du auch mal die forumsuche:
                - nested set
                - baummenü
                - treemenü
                Die Zeit hat ihre Kinder längst gefressen

                Kommentar


                • #9
                  Original geschrieben von Deathrow
                  Und bei der Suche: Ich habe kein Menü gefunden, was meiner mySQL-Struktur ähnlich sieht!
                  [ ] du kommst mit deiner struktur problemlos zurecht
                  [x] die menüs hier funktionieren [color=silver](fast alle)[/color]

                  schlussfolgerung?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    @deathrow, schau dir das hier mal an:
                    http://ffm.junetz.de/members/reeg/DS...00000000000000

                    Kommentar


                    • #11
                      Versuch das mal mit Arrays und rekursiven Funktionsaufrufen zu lösen.

                      Ich habe da mal was vorbereitet:

                      mySQL Tabelle:
                      Code:
                      CREATE TABLE `categorys` (
                        `catid` int(10) unsigned NOT NULL auto_increment,
                        `parentid` int(10) unsigned NOT NULL default '0',
                        `catname` varchar(100) NOT NULL default '',
                        `sort` int(10) unsigned NOT NULL default '0',
                        PRIMARY KEY  (`catid`)
                      ) TYPE=MyISAM AUTO_INCREMENT=4 ;
                      
                      INSERT INTO `categorys` VALUES (1, 0, 'First', 1);
                      INSERT INTO `categorys` VALUES (2, 1, 'Second', 1);
                      INSERT INTO `categorys` VALUES (3, 2, 'Third', 2);
                      Meine Ausgabe:
                      Code:
                      <pre>
                      //Das ist die Array die ich mit den Daten aus der SQL-Tabelle generiert habe.
                      Array
                      (
                          //Parent ID
                          [0] => Array
                              (
                                  //Sort
                                  [1] => Array
                                      (
                                          //Category ID
                                          [1] => Array
                                              (
                                                  [0] => 1
                                                  [catid] => 1
                                                  [1] => 0
                                                  [parentid] => 0
                                                  [2] => First
                                                  [catname] => First
                                                  [3] => 1
                                                  [sort] => 1
                                              )
                      
                                      )
                      
                              )
                      
                          //Parent ID
                          [1] => Array
                              (
                                  //Sort
                                  [1] => Array
                                      (
                                          //Category ID
                                          [2] => Array
                                              (
                                                  [0] => 2
                                                  [catid] => 2
                                                  [1] => 1
                                                  [parentid] => 1
                                                  [2] => Second
                                                  [catname] => Second
                                                  [3] => 1
                                                  [sort] => 1
                                              )
                      
                                      )
                      
                              )
                      
                          //Parent ID
                          [2] => Array
                              (
                                  //Sort
                                  [2] => Array
                                      (
                                          //Category ID
                                          [3] => Array
                                              (
                                                  [0] => 3
                                                  [catid] => 3
                                                  [1] => 2
                                                  [parentid] => 2
                                                  [2] => Third
                                                  [catname] => Third
                                                  [3] => 2
                                                  [sort] => 2
                                              )
                      
                                      )
                      
                              )
                      
                      )
                      </pre>
                      
                      //Und so sieht das dann nach dem rekursiven Funktionsaufruf aus.
                      <form name="myform" action="test.php" method="get">
                       <select name="s_categoryid">
                        <option value="1" selected="selected">First</option>
                        <option value="2">-- Second</option>
                        <option value="3">---- Third</option>
                       </select>
                      
                       <input type="submit" value="Submit" />
                      </form>
                      Hier noch ein kleiner Code-Schnipsel:
                      PHP-Code:
                      <?php
                      function makecategorys($categoryid,$count=1) {
                          global 
                      $categorycache$s_categoryid;

                          
                      //Noch nicht freigegeben...
                      }


                      if(isSet(
                      $_GET['s_categoryid'])) $s_categoryid $_GET['s_categoryid'];
                      else 
                      $s_categoryid 0;

                      $categorycache = array();
                      //SELECT * FROM categorys ORDER by parentid ASC, sort ASC
                      //mySQL Daten auslesen und Array '$categorycache' generieren.

                      echo "<pre>\n";
                      print_r($categorycache)."\n";
                      echo 
                      "</pre>\n";

                      ?>
                      <form name="myform" action="test.php" method="get">
                       <select name="s_categoryid">
                      <?php
                      print(makecategorys(0));
                      ?>
                       </select>

                       <input type="submit" value="Submit" />
                      </form>
                      Verwendete PHP-Funktionen:
                      Code:
                      [URL=http://de2.php.net/manual/de/function.isset.php]isset()[/URL]
                      [URL=http://de2.php.net/manual/de/control-structures.foreach.php]foreach()[/URL]
                      [URL=http://de2.php.net/manual/de/function.str-repeat.php]str_repeat()[/URL]
                      [URL=http://de2.php.net/manual/de/function.unset.php]unset()[/URL]
                      Die Funktion selber Poste ich vorerst nicht, Du sollst ja was lernen.
                      Die Anderen sind hier natürlich auch mit angesprochen, mitzuhelfen.

                      MfG,
                      eRoZion
                      Zuletzt geändert von eRoZion; 09.04.2004, 09:50.
                      [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                      Kommentar


                      • #12
                        Kommt keiner drauf?
                        [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                        Kommentar


                        • #13
                          Ne, ich komm da nciht drauf. Tut mir leid.... Vielleich t mir ner for-schleife?

                          for($i=0;$i<count($array);$i++){
                          echo $array[0][0][$i];
                          }

                          ??
                          Mit freundlichem Gruß,
                          Deathrow

                          Kommentar


                          • #14
                            Original geschrieben von eRoZion
                            Hier noch ein kleiner Code-Schnipsel:
                            PHP-Code:
                            <?php
                            function makecategorys($categoryid,$count=1) {
                                global 
                            $categorycache$s_categoryid;

                                
                            //Noch nicht freigegeben...
                            }


                            if(isSet(
                            $_GET['s_categoryid'])) $s_categoryid $_GET['s_categoryid'];
                            else 
                            $s_categoryid 0;

                            $categorycache = array();
                            //SELECT * FROM categorys ORDER by parentid ASC, sort ASC
                            //mySQL Daten auslesen und Array '$categorycache' generieren.

                            echo "<pre>\n";
                            print_r($categorycache)."\n";
                            echo 
                            "</pre>\n";

                            ?>
                            <form name="myform" action="test.php" method="get">
                             <select name="s_categoryid">
                            <?php
                            print(makecategorys(0));
                            ?>
                             </select>

                             <input type="submit" value="Submit" />
                            </form>


                            Die Funktion selber Poste ich vorerst nicht, Du sollst ja was lernen.
                            Die Anderen sind hier natürlich auch mit angesprochen, mitzuhelfen.

                            MfG,
                            eRoZion
                            Sieht ganz nach Wbboard aus

                            @ topic

                            Lad dir mal das wbb 1 runter und schau dir an wie es da mit den Kategorien gelöst ist´.

                            MfG
                            Jan

                            Kommentar


                            • #15
                              Bei den Code von denen steig ich nciht durch!
                              Mit freundlichem Gruß,
                              Deathrow

                              Kommentar

                              Lädt...
                              X