SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 26.12.2007, 17:33:48
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
Nested Set nur Level weise ausgeben

Hi,

habe meine Kategorieverwaltung mit nested set aufgebaut.
Meine mysql tabelle sieht wie folgt aus :

node_id
root_id
payload
lft
rgt

Mit function gebe ich die Tabelle aus:

Erste function : navigation aufbauen

PHP-Code:
/** navigation aufbauen **/
 
function getNavi() {
     
$sql "SELECT DISTINCT root_id AS roots
            FROM node"
;
    
    
$result mysql_query($sqlconnectDB());
    
$count    mysql_num_rows($result);
    
    while(
$row mysql_fetch_array($result)){
        
$root[] = $row[0];
    } 
// while
 
     
$sql"SELECT n.*,
           floor((n.rgt-n.lft-1)/2) AS childs,
           count(*)+(n.lft>1) AS level,
           ((min(p.rgt)-n.rgt-(n.lft>1))/2) > 0 AS lower,
           (((n.lft-max(p.lft)>1))) AS upper
           FROM node n, node p "
;
        if (
$count 1) {    // fuer mehrere wurzeln
            
$sql.= "WHERE n.lft BETWEEN p.lft AND p.rgt
                    AND (p.root_id = n.root_id)
                    AND (p.node_id != n.node_id OR n.lft = 1)
                    AND (p.root_id IN ("
.implode(",",$root)."))
                    GROUP BY n.root_id,n.node_id
                    ORDER BY n.root_id,n.lft"
;
        } elseif (
$count == 1) {    // ... oder eben nur eine
            
$sql.= "WHERE n.lft BETWEEN p.lft AND p.rgt
                    AND (p.root_id = n.root_id)
                    AND (p.node_id != n.node_id OR n.lft = 1)
                    AND (p.root_id = "
.$root[0].")
                    GROUP BY n.node_id
                    ORDER BY n.lft"
;
        } else {    
// alle wurzeln ... der defaulf-fall eben
            
$sql.= "WHERE n.lft BETWEEN p.lft AND p.rgt
                    AND (p.root_id = n.root_id)
                    AND (p.node_id != n.node_id OR n.lft = 1)
                    GROUP BY n.root_id,n.node_id
                    ORDER BY n.root_id,n.lft"
;
        }


        
$result mysql_query($sqlconnectDB());
        
        return 
$result;
 } 
Die zweite function:

PHP-Code:
/** navigation ausgeben **/
 
function showNavi() {
     
$result getNavi();
    
    
// diese funktion ist dermassen unsauber  *ganzrotwerd*
    // die muss unbedingt noch ueberarbeitet werden!
     
if ($_REQUEST['site'] == "admin"):
        
$tree "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><form action=\"\" method=\"post\">";
        
$tree.= "<tr id=\"top\"><th>Wurzel</th>";
        
$tree.= "<th>Name</th><th>Ebene</th>";
        
$tree.= "<th>Verschieben</th><th>Löschen</th>";
        
$tree.= "<th>Einfügen</th>";
        
$tree.= "<th>Editieren</th></tr>";
        while(
$row mysql_fetch_array($result)) {
            (
$race/== floor($race/2)) ? $class "line1" $class "line2";
            
$tree.= "<tr><td align=\"center\" class=\"".$class."\">".$row[1]."</td>";
            
$tree.= "<td class=\"".$class."\">".$row[2]."</td>";
            
$tree.= "<td align=\"center\" class=\"".$class."\">".$row[6]."</td>";
            
$tree.= "<td align=\"center\" class=\"".$class."\"><a href=\"".$PHP_SELF."?site=admin&action=moveup&id=".$row[0]."\" onfocus=\"blur()\"><img src=\"img/up.png\" border=\"0\"></a> ";
            
$tree.= "<!-- <a href=\"".$PHP_SELF."?site=admin&action=movedown&id=".$row[0]."\" onfocus=\"blur()\"><img src=\"img/down.png\" border=\"0\"></a> --></td>";
            
$tree.= "<td align=\"center\" class=\"".$class."\"><a href=\"".$PHP_SELF."?site=admin&action=del&id=".$row[0]."\" onfocus=\"blur()\"><img src=\"img/del.png\" border=\"0\"></a></td>";
            
$tree.= "<td align=\"center\" class=\"".$class."\"><a href=\"".$PHP_SELF."?site=admin&action=insert&id=".$row[0]."\" onfocus=\"blur()\"><img src=\"img/insert.png\" border=\"0\"></a></td>";
            
$tree.= "<td align=\"center\" class=\"".$class."\"><a href=\"".$PHP_SELF."?site=admin&action=edit&id=".$row[0]."\" onfocus=\"blur()\"><img src=\"img/edit.png\" border=\"0\"></a></td></tr>";
            
$race+=1;
        } 
// while
        
$tree.= "</form></table>";
    else:
        
// bei diesem teil darf ich mich fuer die hilfe von jan bedanken
        
$level 1;
                         
$tree.= "<ul id=\"NewTree\">";
        
        while(
$row mysql_fetch_array($result)) {
            if (
$row['level'] > $level)
                
$tree.= "<ul>";
            else if (
$row['level'] < $level)
                
$tree.= str_repeat("</li></ul>"$level-$row['level']);
            else if (
$level 1)
                
$tree.= "</li>";
                
            
$tree.= "<li value_id=\"".$row['node_id']."\" level=\"".$row['level']."\" input_id=\"".$row['root_id']."\" productgroupname=\"\" input_type=\"\"><span>".$row[2]."</span>";
            
$level $row['level'];
        } 
// while
        
$tree.= str_repeat("</ul>"$level-1);
    endif;
    
    return 
$tree;
 } 
So, nun mein problem:

Diese functionen geben den ganzen Baum, mit Wurzeln usw..., aus.
Ich möchte es aber Levelweise ausgeben, das heißt,
Nur die Wurzeln als Link, wenn ich z.B. auf Wurzel1 klicke,
soll nur der Level 2 der Wurzel1 als Link ausgeben werden,
wenn bei Level 2 klicke, nur der Level 3, usw..

Kann mir da jemand weiterhelfen, sitze schon zwei Tage an den functionen.

Dank im voraus

Chris
Mit Zitat antworten
  #2  
Alt 26.12.2007, 18:51:14
defabricator defabricator ist offline
Senior Member
 
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
AW: Nested Set nur Level weise ausgeben

Steht im Paragraphen "Find the Immediate Subordinates of a Node"

Wenn Du eine allgemeine Codebasis zu einem Problem suchst (hier nested sets), dann schau doch immer mal bei PEAR vorbei. http://pear.php.net/package/DB_NestedSet2
http://pear.php.net/manual/en/installation.php
__________________
Wat der Bauer nich kennt, dit frisster nich.
Mit Zitat antworten
  #3  
Alt 26.12.2007, 19:53:42
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
AW: Nested Set nur Level weise ausgeben

Danke erst mal, hat mir schon sehr geholfen.

Bin jetzt soweit, daß ich den ansatz für eine sql abfrage habe, und zwar:

PHP-Code:
SELECT node.payload, (COUNT(parent.payload) - (sub_tree.depth 1)) AS depth
FROM node 
AS node,
    
node AS parent,
    
node AS sub_parent,
    (
        
SELECT node.payload, (COUNT(parent.payload) - 1) AS depth
        FROM node 
AS node,
        
node AS parent
        WHERE node
.lft BETWEEN parent.lft AND parent.rgt
        
AND node.payload 'Sony'
        
GROUP BY node.payload
        ORDER BY node
.lft
    
)AS sub_tree
WHERE node
.lft BETWEEN parent.lft AND parent.rgt
    
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
    
AND sub_parent.payload sub_tree.payload
GROUP BY node
.payload
HAVING depth 
>= 1
ORDER BY node
.lft
Nun hab ich noch das problem, daß ich ja mehrere Wurzel habe, daß
heißt, ich muß noch irgendwo einfügen, von welcher Wurzel (ID der Wurzel)
er es anzeigen soll?

Oder lieg ich da jetzt total falsch???
Hilfe
Mit Zitat antworten
  #4  
Alt 26.12.2007, 19:57:34
defabricator defabricator ist offline
Senior Member
 
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
AW: Nested Set nur Level weise ausgeben

Das kannst Du doch in der Abfrage bereits angeben.
__________________
Wat der Bauer nich kennt, dit frisster nich.
Mit Zitat antworten
  #5  
Alt 26.12.2007, 20:00:54
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
AW: Nested Set nur Level weise ausgeben

Hab ich gerade probiert, bekomms aber nicht hin:

PHP-Code:
SELECT node.payload, (COUNT(parent.payload) - (sub_tree.depth 1)) AS depth
FROM node 
AS node,
    
node AS parent,
    
node AS sub_parent,
    (
        
SELECT node.payload, (COUNT(parent.payload) - 1) AS depth
        FROM node 
AS node,
        
node AS parent
        WHERE node
.lft BETWEEN parent.lft AND parent.rgt
        
AND node.node_id'4'
        
GROUP BY node.payload
        ORDER BY node
.lft
    
)AS sub_tree
WHERE node
.lft BETWEEN parent.lft AND parent.rgt
    
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
    
AND sub_parent.payload sub_tree.payload
GROUP BY node
.payload
HAVING depth 
1
ORDER BY node
.lft

Er zeigt mir immer alle Wurzel an.

Habs gerade probiert, wenn ich nur eine Wurzel habe, funktioniert es.
Mit mehreren nicht.

Geändert von jasonpetra (26.12.2007 um 20:12:15 Uhr)
Mit Zitat antworten
  #6  
Alt 26.12.2007, 20:32:35
defabricator defabricator ist offline
Senior Member
 
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
AW: Nested Set nur Level weise ausgeben

Dann fasst die verschiedenen (Sub-)Wurzeln halt unter einer echten Wurzel zusammen.
__________________
Wat der Bauer nich kennt, dit frisster nich.
Mit Zitat antworten
  #7  
Alt 26.12.2007, 20:36:40
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
AW: Nested Set nur Level weise ausgeben

Hab ich mir auch gerade gedacht.
Mit Zitat antworten
  #8  
Alt 27.12.2007, 11:56:19
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
AW: Nested Set nur Level weise ausgeben

Letzte Frage,

muß in dieser Abfrage noch die jeweiligen node_id's mit
auslesen, weiß aber nicht wo?

PHP-Code:
SELECT node.payload, (COUNT(parent.payload) - (sub_tree.depth 1)) AS depth 
FROM node 
AS node
    
node AS parent
    
node AS sub_parent
    ( 
        
SELECT node.payload, (COUNT(parent.payload) - 1) AS depth 
        FROM node 
AS node
        
node AS parent 
        WHERE node
.lft BETWEEN parent.lft AND parent.rgt 
        
AND node.node_id'4' 
        
GROUP BY node.payload 
        ORDER BY node
.lft 
    
)AS sub_tree 
WHERE node
.lft BETWEEN parent.lft AND parent.rgt 
    
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    
AND sub_parent.payload sub_tree.payload 
GROUP BY node
.payload 
HAVING depth 

ORDER BY node
.lft
Dann kann ich den link der Abfrage mit der node_id
versehen.

Geändert von jasonpetra (27.12.2007 um 11:56:51 Uhr)
Mit Zitat antworten
  #9  
Alt 27.12.2007, 12:13:39
defabricator defabricator ist offline
Senior Member
 
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
AW: Nested Set nur Level weise ausgeben

Ich tippe mal auf
Code:
SELECT node.node_id, node.payload, (COUNT(parent.payload) - (sub_tree.depth + 1)) AS depth 
FROM node AS node, 
    node AS parent, 
    node AS sub_parent,
...
__________________
Wat der Bauer nich kennt, dit frisster nich.
Mit Zitat antworten
  #10  
Alt 27.12.2007, 13:12:55
jasonpetra jasonpetra ist offline
Anfänger
 
Registriert seit: Jan 2006
Beiträge: 33
AW: Nested Set nur Level weise ausgeben

Hab ich gemacht, funktioniert super, danke.
Mit Zitat antworten
Antwort


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

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nested Sets Klasse Socrates PHP Entwicklung und Softwaredesign 26 12.02.2009 01:33:21
Source Level Debugging - Wie? teo PHP für Fortgeschrittene und Experten 1 19.12.2006 23:06:16
datenbanknamen als liste ausgeben howie MySQLi/PDO/(MySQL) 1 19.06.2006 15:11:55
sortierte ausgabe joker PHP Grundlagen 5 17.12.2004 20:58:27
Sekunden in Stunden:Minuten:Sekunden ausgeben LudwigB PHP Grundlagen 6 23.05.2004 22:59:54


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:21:56 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt