Ankündigung

Einklappen
Keine Ankündigung bisher.

Komme nicht sorecht weiter / Kategorie Baum erstellen.

Einklappen

Neue Werbung 2019

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

  • Komme nicht sorecht weiter / Kategorie Baum erstellen.

    Hallo Leute,
    ich bin grade daran einen KategorienBaum aufzubauen.
    Er soll mal später in einem Select Feld erscheinen so aussehen:
    Hauptkategorie:Unterkategorie.

    Ich habe eine Tabelle cat wo ich folgende Sachen habe:
    id -> auto increament id
    parentid ->vater der categorie
    name -> name der categorie
    level -> level der categorie

    nun zeigt der mir immer nur das an was in der letzen schleife geniert wird. ist es eigentlich möglich eine funktion mit dem gleichen namen wieder in einer funktion aufzurufen oder muss man das anders machen.

    also das script ist noch total der humbug. also kaum zu gebrauchen und am besten nicht soviel dran halten

    also der soll nachjeder aufgerufenen kategorie nachgucken ob unterkategorien da sind und die anzeigen bzw dann darstellen. von der unterkategorie soll dann wieder geguckt werden ob noch unterkategorien enthalten sind. das soll aber alles so dynamisch entstehen.

    naja könnt ihr mir mal ne paar denk anstoesse oder sowas geben. weil damit komme ich im moment nicht ueber den berg ;(

    cat 1 und cat 2 sind kategorien des 1 grades und werden vorher ausgewählt.

    dann sollen auf der neuen seite wieder neue erstellt werden.

    ich stelle mir das so vor wie bei ebay. erst 1 hauptkategorie wählen dann die unterkategorie.

    also bei ebay dann verkaufen klicken und dann nach der kategorien eingabe möchte ich das genau so gestalten. das wäre dann der 3 schritt.

    leute, die dazu nix produktives sagen koennen , können ihren kommentar bitte lassen.

    vielleicht ne bisschen kurios ausgedrückt, nachfragen koennt ihr aber trotzdem gerne.

    mfg

    emu
    PHP-Code:
    <?php
    $cat1 
    $_REQUEST['cat1'];
    $cat2 $_REQUEST['cat2'];

    function 
    catselect($parentid,$level)
    {
        
    $connect mysql_pconnect("xxx","xxx""xxx"); 
        
    $database  mysql_select_db("xxx",$connect); # das sollte klar sein wir rufen unsere db an. 

        
    $sql_cat "SELECT * FROM ` cat` WHERE parentid = '$parentid' AND level = '$level'";
        
    $query_catmysql_query($sql_cat,$connect) OR die(mysql_error());
        
    $row mysql_fetch_row($query_cat);
        print(
    "
    \n"
    );
        print(
    $row['2']);
        
    $parentid ++;
        if(
    mysql_num_rows($query_cat) > 0)
        {
        
    catselect($parentid,$level);
        }
        else
        {
        
    $level +1;
        }
    }

    // Verbindung aufbauen
    $connect mysql_pconnect("xxx","xxx""xxx"); 
    $database  mysql_select_db("xxx",$connect); # das sollte klar sein wir rufen unsere db an. 

    // Unterkategorien auslesen
    $sql_select "SELECT * FROM `cat` WHERE parentid = '$cat1' OR parentid = '$cat2'";
    $sql_select_query mysql_query($sql_select,$connect);
    print(
    mysql_error());


    while(
    $row mysql_fetch_row($sql_select_query))
    {
        print(
    $row['2']);
        
    $parentid $row['0'];
        
    $level $row['3'] + 1;
        
    catselect($parentid,$level);
    }
    ?>
    [/php]

  • #2
    kleiner Denkanstoß *g*

    hallo hallo...
    wenn ich dich richtig verstehe willst du x-beliebig viele unterkategorien erstellen... dein gedankenansatz, dass sich eine funktion selbser aufruft ist an dieser stelle absolut richtig...

    du bräuchtest eine funktion die folgenden ablauf realisiert:
    - Hole alle Unterelemente aus der DB für $element_id
    - Wenn was gefunden wird, das Ergebnis in einer Schleife durchlaufen und die Funktion selbst für das Unterelement wieder aufrufen.
    - Wenn nichts gefunden wird false zurückliefern

    Code:
    <?php
    function getElements($element_id)
    {
    $result = "";
    $res=mysql_query("SELECT * FROM table WHERE parent_id='$element_id'");
    if (mysql_num_rows($res)==0) return false;
    else
    {
    while ($row=mysql_fetch_assoc($res))
    {
    $result.="<option value=\"".$res["id"]."\">".$res["name"]."</option>\n";
    $subresult=getElements($res["id"]);
    if ($subresult!=false) $result .= $subresult;
    }
    return $result;
    }
    }
    ?>
    <h2>Unterelemente vom Element Nr. <?php $element_id ?></h2>
    <select>
    <?php echo getElements($element_id); ?>
    </select>
    So müsste das ungefähr funktionieren. Nach und nach baut sich so ein String zusammen mit in diesem Fall generierten <option>-Feldern - kannst es auch in nem array abspeichern.

    Hoffe ich konnte dir nen Denkanstoß geben, ist auf jeden Fall ein interessantes Problem

    greetz
    andy

    Kommentar


    • #3
      Hallo.
      Habe die Suchfunktion benutzt, deswegen die Antwort ein wenig spät

      Also, ich bin auch gerade das Concept für einen Onlineshop am aufbauen. Dort brauche ich auch beliebig viele Kategorien/Unterkategorien.

      Habe den gedanken mit der rekursiven funktion verstanden und die funktion nachvollzogen. alles ok.

      eine frage jedoch :
      tut ihr alles ein eine tabelle?

      ich hatte erst vor, für jede Ebene eine Tabelle erstellen zu lassen.
      also eine für "hauptkategorie(autos,motorräder,boote)". "1.unterkategorieebene(pkw,lkw/...)", "2.unterkategorieebene(audi,bmw../MAN..)"

      Kommentar


      • #4
        für jede Ebene eine Tabelle erstellen zu lassen.
        haha. sehr witzig.

        es kommt natürlich auf deine daten an, aber generell: ja.
        [URL=http://www.mozilla.org/products/firefox/][img]http://www.nophia.de/misc/spreadtheword/feuerfuchs.gif[/img][/URL]

        Kommentar


        • #5
          hallo...
          besser eine späte antwort als nie

          also prinzipiell würde ich alle kategorien in eine tabelle schreiben und mit einem feld "cat_owner" auf die entsprechend übergeordnete Kategorie verweisen. deine artikel verweisen dann mit einem foreign-key auf die zugehörige kategorie.

          jedoch ist mein oben geposteter algorithmus bei wirklich großen kategorie-beständen nicht der perfomanteste. grund dafür ist, dass für jeden datensatz ein select an die datenbank geschickt wird (um zu prüfen ob er unterelemente hat).

          am elegantesten wäre es nur ein select query auf die datenbank zu schicken und alles in einem array abzulegen. aus diesem array kann man dann mit einem rekursiven algorithmus ebenfalls einen baum ermitteln und spart sich damit einiges an datenbankquerys.

          nur mal so als gedanke zu der problematik

          sei gegrüßt
          andy

          Kommentar


          • #6
            die performante lösung, um bäume mit mysql abzubilden, heißt nested sets. rekursion ist zwar schön, aber quatsch weil nur bei kleinen datenmengen performant genug. nested sets haben einen relativ geringen aufwand und kommen mit wenig queries zurecht.
            dazu gibt's bereits vorgefertigte packages, wie z.b.
            http://pear.php.net/package/DB_NestedSet

            die theorie dahinter habe ich selbst auch nur zu 80% geschnallt - das ganze ist einfach zu genial ... um das ganze aber zu benutzen, solltest du dich trotzdem wenigstens grob in die theorie einlesen, dabei hilft dir google mit den suchbegriffen php + nested + sets.

            bleibt halt nur noch die frage: warum _noch ein_ weiterer php-webshop?

            Kommentar


            • #7
              hey axo...
              danke für den link... werd ich mal nachlesen - aber beim ersten drüberschauen sieht es aus, als passiert genau das was ich in meinem letzten posting angesprochen hab - blos abstrahiert auf mehrere datenbanken und ausgabemöglichkeiten. aber korrigier mich bitte, wenn ich mich irre...

              desweiteren denke ich muss die klasse auf einem rekursivem algorithmus basieren, um einen baum zusammenzubauen - wie sollte das sonst von statten gehen ?

              gruß andy

              Kommentar


              • #8
                Warum noch ein webshop?
                nun ja, weil ich immer ALLES selbst code. will kein geld für arbeit die ich mir garnicht gemacht habe... weiß nicht ob das einer versteht?!

                außerdem ist dann nur das drin was der kunde möchte ?

                Kommentar


                • #9
                  Zitat von Runsky
                  nun ja, weil ich immer ALLES selbst code. will kein geld für arbeit die ich mir garnicht gemacht habe... weiß nicht ob das einer versteht?!
                  hast meine volle zustimmung - jedoch lohnt es sich ggf. mal über den eigenen tellerrand hinauszuschauen...

                  gruß
                  andy

                  Kommentar


                  • #10
                    ich hoffe es interessiert noch jemanden.
                    habe das ganze mal bisschen abgeändert ( die ausgabefunktion muss ich noch machen)

                    PHP-Code:
                    <?php
                    $sql 
                    "SELECT
                                                      id,
                                                      parent_id,
                                                      cat_name
                                             FROM
                                                      cat"
                    ;
                        
                    $result mysql_query($sql) OR die(mysql_error());
                        
                        
                    $daten = array();
                        
                        while ( 
                    $row mysql_fetch_assoc$result ) )
                        {
                            
                            
                    $daten[$row['id']]['cat_name'] = $row['cat_name'];
                            
                    $daten[$row['id']]['parent_id'] = $row['parent_id'];
                            
                        }
                        

                        function 
                    get_parent_ids($data$id)
                        {
                          if (
                    $id == NULL//no parents, because 0 is root level
                        
                    {    //return empty array
                            
                    return array();
                        }    
                        
                    //return the parents id and the parent ids of the parent, merged to one array
                        
                    return array_merge(
                                array(
                    $data[$id]['parent_id']),
                                
                    get_parent_ids($data$data[$id]['parent_id'])
                                );
                      }
                        
                        function 
                    cat_tree($daten,$parent_id NULL)
                        {
                            
                    $links = array();
                            foreach(
                    $daten as $id => $value )
                            {
                                if (
                    $value['parent_id'] == $parent_id)
                                {      
                                    
                    $links[$id]['cat_name'] = $value['cat_name'];
                                    
                    $links $linkscat_tree($daten,$id);
                                }
                            }
                            return 
                    $links;
                        } 
                    ?>
                    werde jez noch eine funktion basteln, die aufgrund der parent - ids, das menü ausklappen kann,

                    Kommentar


                    • #11
                      Zitat von Runsky
                      werde jez noch eine funktion basteln, die aufgrund der parent - ids, das menü ausklappen kann,
                      sehr nice... interessant wäre es, mit einem algemeinen algorithmus verschiedene menüs bauen zu können. ich generier in einem meiner projekte z.B. auf diese weise nen js-baum - du bei dir warscheinlich eine andere menüstruktur...

                      da liegt doch der gedanke nahe beides zusammenzupacken und als allgemeine lösung zur generierung eines x-ebenen menüs zu betrachten.

                      gruß
                      andy

                      Kommentar


                      • #12
                        ähm, der kann X ebenen
                        nur zur zeit hab ich nur ein komplett ausgeklapptes menü.
                        wie ichs ausklappen lassen soll weiß ich noch net sorecht.
                        hab folgenden anfang :
                        PHP-Code:
                        <?php
                            
                        function show_tree($daten,$parent_id NULL,$indent=0,$parents_set 0)
                            {
                                
                        $empty true;
                                
                        $indentstring str_repeat('  '$indent);
                                
                        $goto_id = (isset($_GET['goto']))?$_GET['goto']:NULL;
                                
                        $parents = array();
                                    if(isset(
                        $_GET['goto']) && ($parents_set==0))
                                    {
                                        foreach(
                        $daten as $key => $value)
                                        {
                                            if(
                        in_array($key,$parents get_parent_ids($daten,$_GET['goto'])))
                                            {
                                                print 
                        '<ul>[*][url="'.$_SERVER['PHP_SELF'].'?goto='.$key.'"]'.$value['cat_name'].'[/url]';
                                                
                        $count_ul $key;
                                             } 
                                        }
                                        for(
                        $i 0$i $count_ul$i++)
                                        {
                                            print 
                        '[/list]';
                                        }
                                    }
                                    foreach(
                        $daten as $key => $value)
                                    {
                                    
                                        if(
                        $value['parent_id'] == $parent_id)
                                        {
                                            
                                            if(
                        $empty == true)
                                            {
                                                
                                                
                        $empty false;
                                                
                                                echo 
                        $indentstring .'<ul>' "\n";
                                            
                                            }
                                            
                                            echo 
                        $indentstring.'[*]'."\n";
                                            echo 
                        $indentstring.'    [url="'.$_SERVER['PHP_SELF'].'?goto='.$key.'"]'.$value['cat_name'].'[/url]'."\n";
                                            echo 
                        $indentstring.'  '."\n";
                                                                
                                            
                        show_tree($daten,$key,$indent+2,$parents_set 1);
                                        }
                                        
                                    }
                                    if(
                        $empty == false)
                                    {
                                          
                                        echo 
                        $indentstring .'[/list]' "\n";
                                            
                                    }
                            }
                        ?>
                        geht halt noch fast nix

                        Kommentar

                        Lädt...
                        X