SetaPDF
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 05.03.2008, 14:18   #1
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg

Nested Sets: Teilbäume verschieben


Hallo,

nachdem ich dank der Hilfe hier im Forum die Datenbank eines Projektes auf das Nested Set-Prinzip umgestellt habe und soweit auch alles funktioniert, habe ich jetzt doch wieder ein Problem:

Und zwar sollte ich Teilbäume innerhalb des selben Levels praktisch nach rechts oder links verschieben. Wie das aussehen soll, seht ihr auf der beigefügten Grafik.

Jetzt habe ich schon auf mehreren Seite im Inet ganz gute Anleitungen gefunden (z.B. hier), aber es gelingt mir nicht, daraus die richtigen MySQL-Befehle abzuleiten.

Meine Tabelle sieht wie folgt aus:
Code:
CREATE TABLE IF NOT EXISTS `kategorien` (
  `catid` int(12) unsigned NOT NULL auto_increment,
  `root_id` int(11) NOT NULL,
  `catname` varchar(50) NOT NULL,
  `level` int(11) NOT NULL,
  `lft` int(12) unsigned NOT NULL,
  `rgt` int(12) unsigned NOT NULL,
  PRIMARY KEY  (`catid`),
  KEY `lft` (`lft`),
  KEY `rgt` (`rgt`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=241 ;
In der Tabelle können auch beliebig viele Wurzelknoten sein, das verschieben soll aber nur unterhalb einer Wurzel stattfinden (gleiche root_id).

Ich wäre froh, wenn mir jemand dabei helfen könnte!
Miniaturansicht angehängter Grafiken
nested-sets-teilb-ume-verschieben-teilbaum_verschieben.gif  
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten


Alt 05.03.2008, 16:12   #2
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Weyhe
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
Hi,

ich habe diese Klasse hier:
http://geoseo.org/PHP-Nested-Sets,Kl...oad,4,_19.html

um das Verschieben eines Astes inklusive seiner Kinder an eine beliebige Stelle im Baum erweitert. Die Ziel-Knoten-ID darf dabei nicht ein Kind des zu kopierenden Astes sein, aber das versteht sich ja von selbst.
Vielleicht hilft Dir das ja oder dient als Anhaltspunkt für eine Vorgehensweise.

PHP-Code:
    /**
     * @access public
     * @param int (tree_id)
     * @param int (new_parent_id)
     * @param string (database table)
     * @return Boolean
     *
     * Ast inklusive Kinder verschieben
     * Move a complete tree
     */
    
public function move_tree($tree_id$new_parent_id$sql_table)
    {
        if(
$this->check_table($sql_table) === TRUE)
        {
            
$ok=true;
            if(!isset(
$sql) || !is_object($sql)) $sql    = new MYSQL_DRIVER();

            
$tree=$this->get_menge($tree_id$sql_table);

            
// create rootnode of brunch to get the new id
            
$new_id=$this->insert_link($tree[0]['name'],$new_parent_id,'nav');
            
$tree[0]['new_id']=$new_id;
            
$tree[0]['new_parent_id']=$new_parent_id;

            
// expend array to save new_ids
            
for ($i=1;$i<sizeof($tree);$i++)
            {
                if (
$tree[$i]['parent_id']==$tree[0]['id']) $tree[$i]['new_parent_id']=$new_id;
                
// check if new parent id is a child of the brunch that should be moved -> thats not possible
                
if ($tree[$i]['id']==$new_parent_id$ok=false;
            }

            if (
$ok===true)
            {
                
$itemcount=sizeof($tree);
                for (
$i=1;$i<$itemcount;$i++)
                {
                    
$new_id=$this->insert_link($tree[$i]['name'],$tree[$i]['new_parent_id'],'nav');
                    if (
$new_id===false)
                    {
                        
$ok=false;
                        break;
                    }
                    
$tree[$i]['new_id']=$new_id;

                    
// correct parent-IDs of childnodes
                    
for ($x=1;$x<$itemcount;$x++)
                    {
                        if (
$tree[$x]['parent_id']===$tree[$i]['id'])
                        {
                            
$tree[$x]['new_parent_id']=$tree[$i]['new_id'];
                        }
                    }
                }
            }

            
// delete old tree
            
if ($ok===true)
            {
                
$this->del_knoten($tree_id$sql_table); // everything went fine -> delete the old brunch that now is moved
            
}
            else 
$this->del_knoten($tree[0]['new_id'],$sql_table); // an error occured -> delete the copied brunch and undo changes
        
}
        else 
$ok=false;
        return 
$ok;
    } 
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 05.03.2008, 16:41   #3
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg
Danke, werde mir das mal anschauen.

Aber gibt es vielleicht die Möglichkeit, das ganze nur per MySQL zu lösen?
Und zwar, in dem man vielleicht noch nach Richtung, in meinem Beispiel links oder rechts, unterscheidet?
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten
Alt 05.03.2008, 16:46   #4
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Weyhe
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
Meines Wissens nach nicht. Die RGT und LFT-Werte müssen ja neu berechnet werden und zwar inklusive der bereits vorhandenen Kinder eines Astes.
Da kann ich mir keine reine MySQL-Lösung vorstellen. Du siehst ja anhand des Codes, dass die Aufgabe nicht mit 2 Queries erledigt ist.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 08.06.2008, 13:20   #5
TP-Senior
 
Benutzerbild von Schneemann
 
Registriert seit: Jan 2006
Schneemann macht alles soweit korrekt
Schau dir mal dieses Tutorial an, da wird genau beschrieben wie man Teilbäume in Nested Sets verschieben kann.
__________________
Gruß,
Peter
Schneemann ist offline   Mit Zitat antworten
Alt 09.06.2008, 09:35   #6
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg
Danke, das könnte passen. Muss ich mich jetzt mal durch wursteln. :-)
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
Nested Sets: Teilbäume verschieben Nested Sets: Teilbäume verschieben
« Formular-Skriptfehler php? | PHP - Umlaute und Tags »

Stichworte
datenbank, mysql, php

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:14 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67