kostenloser Webspace werbefrei: lima-city


Nested Sets - Verarbeitung des Strings vom jQuery Plugin

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    gatheringxp

    gatheringxp hat kostenlosen Webspace.

    Hey community,

    ich versuche derzeit eine Navigation mithilfe des Nested Sets Modells aufzusetzen. Das heißt jedes Element hat zwei Werte, einen linken und einen rechten, welche die Position in der Navigation bestimmen. Für Interessierte gibt es hier mehr Infos zu dem Modell http://www.php-resource.de/tutorials/tutorial,21,Das-Nested-Sets-Modell---Baeume-mit-SQL,1.htm.

    Diese Werte verarbeite ich im Format LFT_RGT, also beispielsweise 2_6.

    Ich bin nun so weit, dass ich den Ausgabestring des Nestable-jQuery-Plugins von [{"id":1,"children":[{"id":2},{"id":4}]},{"id":5}] auf [1[sub2,4[5 gekürzt habe und kriege diesen String auch weiter verarbeitet zu Arrays. Woran es hapert ist derzeit folgendes:

    http://gatheringxp.lima-city.de/lima-board/nested_sets.png // Link zu meinem Webspace - Screenshot.
    http://gatheringxp.lima-city.de/lima-board/nested_sets/ // Link zu meinem Webspace - Zum Ausprobieren, anschaulicher und so :)

    Das LFT_RGT-Wertepaar des Parent-Elements umfasst - entsprechend dem Modell - alle LFT- und RGT-Werte der Children-Elemente. Heißt also bei mir müsste das fertige Array eigentlich folgendermaßen aussehen:

    1: 1 - 1_6
    2.0: 2 - 2_3
    2.1: 4 - 4_5
    3: 5 - 7_8

    Format ist hierbei:
    Aktuelle ID: Element-ID - LFT_RGT

    Wie es wirklich aussieht, seht ihr ja im Screenshot ..

    Mein - vermutlich - sehr unsauberer Code (man möge mir vergeben :) )
    <?php
    
    error_reporting(E_ALL);
    
    echo $_POST["nestable-output"];
    
    $input = $_POST["nestable-output"];
    $input = str_replace("{","",$input);
    $input = str_replace("}","",$input);
    $input = str_replace('"id":',"",$input);
    $input = str_replace(',"','"',$input);
    $input = str_replace('"children":[',"[sub",$input);
    $input = str_replace('],','[',$input);
    $input = str_replace(']','',$input);
    
    $input = explode("[",$input);
    
    $input = str_replace("[","",$input);
    
    echo "<br /><br />";
    
    $lft = 1;
    $rgt = 2;
    
    foreach ($input as $id => $value) {
        if (empty($value)) { continue; }
        if (strpos($value, 'sub') !== false) { 
            $value = str_replace('sub','',$value);
            $value = explode(",",$value); 
            
            $noi = count($value); // number of items
            
            foreach ($value as $ident => $val) {
                echo $id.".".$ident.": ".$val." - ".$lft."_".$rgt."<br />";
                $rgt++;
                $lft = $rgt++;
            }
        } else {
            echo $id.": ".$value." - ".$lft."_".$rgt."<br />";
            $rgt++;
            $lft = $rgt++;
        }
    }
    
    echo "<br />";
    
    echo $_POST["nestable2-output"];
    
    ?>


    Ich weiß, dass das bereits ein Fehler in der Theorie ist und mein Script so nicht laufen kann, aber ich hab auch irgendwie eine Denkblockade wie es richtig ginge .. Vielleicht noch jedes Element in eine Variable verpacken und diese mehrfach nachträglich bearbeiten? Aber dann sind das wieder so viele Iterationen ._. Ich steh grad echt mit so nem Brett vorm Kopf da.

    Vielen Dank für eure Hilfe im Voraus!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. gatheringxp schrieb:
    ... http://gatheringxp.lima-city.de/lima-board/nested_sets/ // Link zu meinem Webspace - Zum Ausprobieren, anschaulicher und so :) ...
    finde ich nicht :o( das ergebnis ist (html-source):
    <!DOCTYPE html>
    <!--[if lt IE 7]> <html lang="en" class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
    <!--[if IE 7]>    <html lang="en" class="lt-ie9 lt-ie8"> <![endif]-->
    <!--[if IE 8]>    <html lang="en" class="lt-ie9"> <![endif]-->
    <!--[if IE 9]>    <html lang="en" class="ie9"> <![endif]-->
    <!--[if gt IE 9]><!--> <html lang="en"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
        <META HTTP-EQUIV='content-type' CONTENT='text/html; charset=utf-8'>
        <link rel="stylesheet" type="text/css" href="nestable.css">
    </head>
    <body>
    
    <menu id="nestable-menu">
        <button type="button" data-action="expand-all">Alle ausklappen</button>
        <button type="button" data-action="collapse-all">Alle einklappen</button>
    </menu>
    
    <div class="cf nestable-lists">
        <div class="dd" id="nestable">
    und das ist ein bisschen doch zu wenig, dass das gute ding auch funktioniert und etwas von sich gibt, was man auch auswerten könnte.

    um dein problem zu lösen ist allerdings das hir von bedeutung ;)

    Beitrag zuletzt geändert: 17.4.2013 1:21:46 von czibere
  4. Autor dieses Themas

    gatheringxp

    gatheringxp hat kostenlosen Webspace.

    Oh, sorry .. Hab ich wohl irgendeine Datei beim Upload vergessen .. Unter dem Link sollte eig. das jQuery Nestable Plugin von David Bushell in Aktion zu sehen sein. https://github.com/dbushell/Nestable

    Dein Hinweis auf Listen war auch relativ hilfreich für die Überlegung, ich habe das Problem jetzt aber ein wenig schmutziger gelöst :D Nachfolgend mein Quick'n'dirty Script .. Verbesserungsvorschläge immer gern gesehen. Hier, per PN, E-Mail, etc. :)
    $lft = 1;
    $rgt = 2;
    
    foreach ($input as $id => $value) {
        if (empty($value)) { continue; }
        if (isset($input[$id+1])) {
            if (strpos($input[$id+1], 'sub') !== false) {
                $noi_f = count(explode(",",$input[$id+1]));
            }
        }
        
        if (strpos($value, 'sub') !== false) { 
            $value = str_replace('sub','',$value);
            $value = explode(",",$value); 
            
            $is_sub = true;
            
            foreach ($value as $ident => $val) {
                echo $id.".".$ident.": ".$val." - ".$lft."_".$rgt."<br />";
                $lft = $rgt+1;
                $rgt = $lft+1;
            }
        } else {
            if(isset($is_sub)) {
                $lft++;
                $rgt++;
            }
            if(isset($noi_f)) {
                $old_rgt = $rgt;
                $rgt = $rgt + ($noi_f * 2);
            }
            
            echo $id.": ".$value." - ".$lft."_".$rgt."<br />";
            
            if(!isset($noi_f)) {
                $lft = $rgt+1;
                $rgt = $lft+1;
            } else {
                $rgt = $old_rgt;
                $lft = $lft+1;
                $rgt = $lft+1;
            }
            
            unset($noi_f);
            unset($is_sub);
        }
    }


    Ich lese das nachfolgende Element ein, schaue ob "Sub" im String steht. Ist es der Fall wende ich explode auf dieses folgende Array-Element an, zähle die explode-Elemente und multipliziere sie mit 2 .. Anschließend rechne ich auf diese multiplizierte Zahl +1 und schreibe den Wert als RGT-Wert ins aktuelle Element. Nun nur noch schnell RGT zurück auf den Wert vor der Multiplikation setzen, LFT+1 rechnen und den Schleifendurchlauf beenden.

    Beim Verlassen der Sub-Arrays hatte ich anfangs ein kleines Problem. Das ist jedoch durch
    if(isset($is_sub)) {
        $lft++;
        $rgt++;
    }

    leicht gelöst. Ohne diese Zeilen wäre der Parent RGT Wert als neuer LFT Wert verwendet worden. So läuft es dann aber. :)
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!