n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 13 Ιαν 2015 15:14

Θα ήθελα λίγο ένα χεράκι βοηθειας, μιας και το θέμα δεν είναι και από τα πιο εύκολα να κατανοήσεις στην αρχή τουλάχιστον. Έχω βρει και ένα σχετικό άρθρο www.sitepoint.com/hierarchical-data-database-2/ , ωστόσο θα ήθελα για αρχή να ξεκαθαρίσω κάποια πραγματάκια πριν ξεκινήσω να γράφω κώδικα, σχετικά με τη φιλοσοφία του αλγορίθμου.

Ας πάρουμε για αρχή το παράδειγμα του μενού που έχει παραθέσει ο korgr σε αυτό το topic.
korgr έγραψε: ΤΟ ΠΡΟΒΛΗΜΑ
Η δημιουργία ενός menu πχ προϊόντων, όπου δεν προκαθορίζεται εξ αρχής η δομή και το βάθος των επιπέδων. Παράδειγμα:

Κώδικας: Επιλογή όλων

ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ
      ΨΥΓΕΙΑ
      ΤΗΛΕΟΡΑΣΕΙΣ
      ΗΛ. ΣΚΟΥΠΕΣ
ΗΧΟΣ & ΕΙΚΟΝΑ
      HOME CINEMA
      ΣΤΕΡΕΟΦΩΝΙΚΑ
            ΕΝΙΣΧΥΤΕΣ
            ΗΧΕΙΑ
ΜΙΚΡΟΣΥΣΚΕΥΕΣ
      ΚΑΦΕΤΙΕΡΕΣ
Με βάση το άρθρο λοιπόν τι εννούμε όταν λέμε:

1. tree ? ολόκληρο το μενου μαζί με τα υπομενού του, ή και οποιδήποτε κομμάτι του μενού με τα υπομενού πχ ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ > ΨΥΓΕΙΑ - ΤΗΛΕΟΡΑΣΕΙΣ - ΗΛ. ΣΚΟΥΠΕΣ ?
2. root ? θεωρούνται ξεχωριστά τα κύρια μενού δηλ. ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ - ΗΧΟΣ & ΕΙΚΟΝΑ - ΜΙΚΡΟΣΥΣΚΕΥΕΣ? ή το root περιλαμβάνει τα κύρια μενού μόνο?
3. Node? (αν και αυτό μου είναι κατανοητό πιο πολύ για να τσεκάρω αν το έχω καταλάβει σωστά) αναφέρεται σε οποιδήποτε menu item πχ ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ, HOME CINEMA, ΗΧΕΙΑ,ΜΙΚΡΟΣΥΣΚΕΥΕΣ κλπ κλπ, σωστά?
[/code]

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από korgr » 13 Ιαν 2015 17:56

Lykos22 έγραψε:Θα ήθελα λίγο ένα χεράκι βοηθειας, μιας και το θέμα δεν είναι και από τα πιο εύκολα να κατανοήσεις στην αρχή τουλάχιστον. Έχω βρει και ένα σχετικό άρθρο www.sitepoint.com/hierarchical-data-database-2/ , ωστόσο θα ήθελα για αρχή να ξεκαθαρίσω κάποια πραγματάκια πριν ξεκινήσω να γράφω κώδικα, σχετικά με τη φιλοσοφία του αλγορίθμου.

Ας πάρουμε για αρχή το παράδειγμα του μενού που έχει παραθέσει ο korgr σε αυτό το topic.
korgr έγραψε: ΤΟ ΠΡΟΒΛΗΜΑ
Η δημιουργία ενός menu πχ προϊόντων, όπου δεν προκαθορίζεται εξ αρχής η δομή και το βάθος των επιπέδων. Παράδειγμα:

Κώδικας: Επιλογή όλων

ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ
      ΨΥΓΕΙΑ
      ΤΗΛΕΟΡΑΣΕΙΣ
      ΗΛ. ΣΚΟΥΠΕΣ
ΗΧΟΣ & ΕΙΚΟΝΑ
      HOME CINEMA
      ΣΤΕΡΕΟΦΩΝΙΚΑ
            ΕΝΙΣΧΥΤΕΣ
            ΗΧΕΙΑ
ΜΙΚΡΟΣΥΣΚΕΥΕΣ
      ΚΑΦΕΤΙΕΡΕΣ
Με βάση το άρθρο λοιπόν τι εννούμε όταν λέμε:

1. tree ? ολόκληρο το μενου μαζί με τα υπομενού του, ή και οποιδήποτε κομμάτι του μενού με τα υπομενού πχ ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ > ΨΥΓΕΙΑ - ΤΗΛΕΟΡΑΣΕΙΣ - ΗΛ. ΣΚΟΥΠΕΣ ?
2. root ? θεωρούνται ξεχωριστά τα κύρια μενού δηλ. ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ - ΗΧΟΣ & ΕΙΚΟΝΑ - ΜΙΚΡΟΣΥΣΚΕΥΕΣ? ή το root περιλαμβάνει τα κύρια μενού μόνο?
3. Node? (αν και αυτό μου είναι κατανοητό πιο πολύ για να τσεκάρω αν το έχω καταλάβει σωστά) αναφέρεται σε οποιδήποτε menu item πχ ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ, HOME CINEMA, ΗΧΕΙΑ,ΜΙΚΡΟΣΥΣΚΕΥΕΣ κλπ κλπ, σωστά?
[/code]

1. tree είναι όλη η δενδροειδής δομή του menu
2. root είναι όποια επιλογή του menu δεν έχει γονέα (έχει μόνο children)
3. Ναι

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 14 Ιαν 2015 20:07

Βρίσκομαι στο κομμάτι όπου κάνω εισαγωγή menu items, επομένως το φτιάχνω από την αρχή το μενού.

Η βάση μου είναι ως εξής:

Κώδικας: Επιλογή όλων

id (pk)
menu_item
parent_id
lft
rgt
Έχω δημιουργήσει και τις εξής 2 μεθόδους μέχρι στιγμής για να κάνω INSERT. Την insert_node() όπου τα queries που τρέχουν είναι:

Κώδικας: Επιλογή όλων

public function insert_node()

SELECT MAX(`rgt`) AS lft FROM (`menus`)

UPDATE `menus` SET `lft` = 2 WHERE `lft` > 0
UPDATE `menus` SET `rgt` = 2 WHERE `rgt` > 0  

 INSERT INTO `menus` (`item`, `slug`, `parent_id`, `lft`, `rgt`) VALUES ('Ilektrika Idi', 'ilektrika-idi', 0, 1, 2)  

// Εγγραφές :
1, ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ, 0 , 1 , 2
2, ΗΧΟΣ & ΕΙΚΟΝΑ , 0 , 3 , 4
3, ΜΙΚΡΟΣΥΣΚΕΥΕΣ , 0 , 5 , 6

Με την οποία έχω κάνει εισαγωγή κάθε νέο menu item που δεν έχει parent_id, δηλαδή ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ, ΗΧΟΣ & ΕΙΚΟΝΑ και ΜΙΚΡΟΣΥΣΚΕΥΕΣ. Επίσης έχω και την μέθοδο insert_child() με τα εξής queries:

Κώδικας: Επιλογή όλων

public function insert_child()

SELECT `lft`, `rgt` FROM (`menus`) WHERE `id` =  1

UPDATE `menus` SET `rgt` = rgt+2 WHERE `rgt` > '1'
UPDATE `menus` SET `lft` = lft+2 WHERE `lft` > '1'

INSERT INTO `menus` (`item`, `slug`, `parent_id`, `lft`, `rgt`) VALUES ('Psigia', 'psigia', 1, 2, 3)  
Και εδώ παρουσιάζεται το πρόβλημα μου. Την 1η φορά που κάνω εισαγωγή ενός child λειτουργεί σωστά, δηλαδή έχω:

Κώδικας: Επιλογή όλων

1, ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ        , 0      , 1      , 4
2, ΗΧΟΣ & ΕΙΚΟΝΑ         , 0      , 5      , 6
3, ΜΙΚΡΟΣΥΣΚΕΥΕΣ        , 0       , 7      , 8
4, ΨΥΓΕΙΑ                     , 1       , 2      , 3
Στην επόμενη εισαγωγή (και προφανώς σε κάθε άλλη που έχει το ίδιο parent), οι εγγραφές μου παίρνουν λάθος τιμές:

Κώδικας: Επιλογή όλων

1, ΗΛΕΚΤΡΙΚΑ ΕΙΔΗ        , 0      , 1      , 6
2, ΗΧΟΣ & ΕΙΚΟΝΑ         , 0      , 7      , 8
3, ΜΙΚΡΟΣΥΣΚΕΥΕΣ        , 0      , 9      , 10
4, ΨΥΓΕΙΑ                    , 1       , 4      , 5
5, ΤΗΛΕΟΡΑΣΕΙΣ           , 1       , 4      , 5
ο έλεγχος που κάνω για να καθορίσω τις τιμές των left και right πριν το κάθε INSERT είναι ο εξής

Κώδικας: Επιλογή όλων

if ($this->has_children($node)) {
			
			$data[$this->left_col] = intval($node[$this->right_col]);
			$data[$this->right_col] = $node[$this->right_col] + 1;
		} else {
			
			$data[$this->left_col] = $node[$this->left_col] + 1;
			$data[$this->right_col] = $node[$this->left_col] + 2;
		}

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 19 Ιαν 2015 14:11

Άκυρο το προηγούμενο.

Μέχρι στιγμής έχω υλοποιήσει τα εξής:
- προσθήκη νέων nodes οπουδήποτε μέσα στο tree
- διαγραφή nodes, είτε με διαγραφή ενός node και των child-node αν έχει, είτε με διαγραφή ενός node ενώ τα child-node έρχονται στο επίπεδο που ήταν το (parent) node

Στο σημείο που δυσκολεύομαι είναι το UPDATE ενός node, δηλαδή να μπορώ να μετακινήσω ένα node μαζί με τα child-nodes σε οποιδήποτε σημείο το tree θέλω. Πχ στο παράδειγμά μας να μετακινήσω τις ΤΗΛΕΟΡΑΣΕΙΣ στην κατηγορία ΗΧΟΣ & ΕΙΚΟΝΑ, ή τα ΣΤΕΡΕΟΦΩΝΙΚΑ (μαζί με τα υπομενού) να τα έχω στο κύριο μενού (root), ή να αλλάζω τη διάταξη των κάθε node (κάτι σαν ordering).

Το μόνο που μπορώ να υποθέσω σίγουρα είναι ότι θα πρέπει να γίνεται υπολογισμός στα left και right του node που έχω επιλέξει να μετακινήσω, αλλά και στο tree ώστε να διατηρήται σωστά η ιεραρχία. Θα μπορόυσατε να μου δώσετε μερικές αναλυτικές οδηγίες σχετικά με τον υπολογισμό των left και right του node και του tree? Τι queries θα χρειαστεί να δημιουργήσω? γνωρίζει κανείς κάποια pseudo-queries, όπως αναφέρει και στα σχετικά άρθρα που ανέφερα πιο πριν ?

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από gvre » 20 Ιαν 2015 14:39

Υπάρχει συγκεκριμένος λόγος που προσπαθείς να χρησιμοποιήσεις nested-sets αντί adjacency lists; Στην 1η περίπτωση χρειάζεσαι τα lft, rgt, ενώ στη 2η το parent_id. Πόσες κατηγορίες περίπου θέλεις να διαχειριστείς;

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 20 Ιαν 2015 14:57

gvre έγραψε:Υπάρχει συγκεκριμένος λόγος που προσπαθείς να χρησιμοποιήσεις nested-sets αντί adjacency lists; Στην 1η περίπτωση χρειάζεσαι τα lft, rgt, ενώ στη 2η το parent_id. Πόσες κατηγορίες περίπου θέλεις να διαχειριστείς;
Ναι, θα έχω αρκετά υπόμενού και γι αυτό ένας λόγος παραπάνω να χρησιμοποιήσω nested-sets και όχι adjacency. Το adjacency είναι recursive, που σημαίνει ότι θα έχω περισσότερα queries όσο πιο πολύ κατεβαίνω επίπεδο.

Ο πίνακας στη βάση μου είναι έτοιμος, μπορείς να το τσεκάρεις και πιο πάνω που το έχω αναφέρει.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από korgr » 20 Ιαν 2015 15:09

Θυμάμαι πέρασα ουκ ολίγες φρίκες μέχρι να το κάνω να δουλέψει και με το Modified Preorder Tree Traversal στο OdysseyCMS.
Δεν είναι εύκολο ούτε καν να θυμηθώ πως κατέληξα στον κώδικα (άπειρο ψάξιμο και δοκιμές).
Δυστυχώς είναι μπλεγμένος ο κώδικας και με πράγματα που αφορούν αποκλειστικα το δικό μου περιβάλλον, οπότε απλά δημοσιεύω το κομμάτι του edit categories για μια γενική αίσθηση.

Η θεωρία είναι πως πρώτα διαγράφουμε την κατηγορία, μετά κάνουμε update όλες τις left-right τιμές και τέλος προσθέτουμε τη νέα...

Κώδικας: Επιλογή όλων

				// edit by Modified Preorder Tree Traversal Model -------------------------------------------------------------------------------------------------------------------
				
// $section is the table of categories
// $parent is the parent node ID
				// first we must delete the existing category
				$db->query("LOCK TABLE $section WRITE");
				$db->query("SELECT @myLeft := L, @myRight := R, @myWidth := R - L + 1 FROM $section WHERE id = '$itemID'");
				$db->query("DELETE FROM $section WHERE L BETWEEN @myLeft AND @myRight");
				$db->query("UPDATE $section SET R = R - @myWidth WHERE R > @myRight");
				$db->query("UPDATE $section SET L = L - @myWidth WHERE L > @myRight");
				$db->query("UNLOCK TABLES");				
							   
				// done deleting, proceed to add the category by the	Modified Preorder Tree Traversal Model way
				
				$q = "select R from $section where id='$parent'";
				$limits = $db->getRecord($q);
				$R = $limits->R;
				$leftValue = $R+1;
				$rightValue = $R+2;	
				$db->query("UPDATE $section SET R=R+2 WHERE R>$R");
				$db->query("UPDATE $section SET L=L+2 WHERE L>$R");
				$q = "INSERT INTO ".$section." VALUES('$parent', '$leftValue', '$rightValue')";
				$db->query($q);
				$catID=$db->lastID();

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από gvre » 20 Ιαν 2015 16:26

Lykos22 έγραψε:
gvre έγραψε:Υπάρχει συγκεκριμένος λόγος που προσπαθείς να χρησιμοποιήσεις nested-sets αντί adjacency lists; Στην 1η περίπτωση χρειάζεσαι τα lft, rgt, ενώ στη 2η το parent_id. Πόσες κατηγορίες περίπου θέλεις να διαχειριστείς;
Ναι, θα έχω αρκετά υπόμενού και γι αυτό ένας λόγος παραπάνω να χρησιμοποιήσω nested-sets και όχι adjacency. Το adjacency είναι recursive, που σημαίνει ότι θα έχω περισσότερα queries όσο πιο πολύ κατεβαίνω επίπεδο.

Ο πίνακας στη βάση μου είναι έτοιμος, μπορείς να το τσεκάρεις και πιο πάνω που το έχω αναφέρει.
Το adjacency είναι πολύ γρήγορο όταν θέλεις να τραβήξεις όλες τις βασικές κατηγορίες ή όλες τις υποκατηγορίες του αμέσως επόμενου επιπέδου (αν έχεις τα σωστά indexes στη βάση σου). Επίσης, μπορείς να τραβήξεις με 1 query όλες τις κατηγορίες και στη συνέχεια να φτιάξεις το δέντρο σου με php. Τέλος, αν το δέντρο σου είναι πολύ μεγάλο μπορείς να το αποθηκεύσεις κάπου, για να μην το χτίζεις σε κάθε request.
Τελικά, για πόσες κατηγορίες και τί βάθος μιλάμε;

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 21 Ιαν 2015 11:37

gvre έγραψε: Το adjacency είναι πολύ γρήγορο όταν θέλεις να τραβήξεις όλες τις βασικές κατηγορίες ή όλες τις υποκατηγορίες του αμέσως επόμενου επιπέδου (αν έχεις τα σωστά indexes στη βάση σου). Επίσης, μπορείς να τραβήξεις με 1 query όλες τις κατηγορίες και στη συνέχεια να φτιάξεις το δέντρο σου με php. Τέλος, αν το δέντρο σου είναι πολύ μεγάλο μπορείς να το αποθηκεύσεις κάπου, για να μην το χτίζεις σε κάθε request.
Τελικά, για πόσες κατηγορίες και τί βάθος μιλάμε;
Δεν διαφωνώ όταν λες ότι το adjacency είναι πολύ γρήγορο όταν θέλεις να τραβήξεις όλες τις βασικές κατηγορίες, ίσα ίσα το έχω χρησιμοποιήσει και εγώ πάρα πολλές φορές και το ξέρω. Επειδ'η δεν γνωρίζω ακριβώς πόσα επίπεδα θα χρειαστεί να ε΄χω τελικά γι αυτό καταφεύγω στο mptt. Σε ευχαριστώ πολύ που μπαίνεις στον κόπο να ασχοληθείς με το θέμα μου, αλλά θα επιμείνω σε nested sets για διάφορους λόγους, όσο κι αν είναι πονοκέφαλος.
korgr έγραψε: Η θεωρία είναι πως πρώτα διαγράφουμε την κατηγορία, μετά κάνουμε update όλες τις left-right τιμές και τέλος προσθέτουμε τη νέα...
Διαγράφουμε κατηγορία για να μετακινήσεις ένα node οπουδήποτε μέσα στο tree :question: :question: :question: ... εδώ σε έχασα ...

Κάτι ακόμα. Είναι απαραίτητο να κάνεις LOCK TABLE πρίν εκτελεστούν τα queries?

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από korgr » 21 Ιαν 2015 15:18

Η διαγραφή της υπό μετακίνηση κατηγορίας και η επαναδημιουργία της με insert έχοντας τη νέα θέση, ισούται με επεξεργασία.
Αυτό γίνεται για να υπολογιστούν πρώτα όλα τα νέα LEFT / RIGHTS χωρίς την κατηγορία που αλλάζει θέση και μετά να απλοποιήσουμε την διαδικασία με ένα απλό add το οποίο είδες πως είναι πιο απλό!
Τι ακριβώς δεν καταλαβαίνεις?

Προσωπικά δεν βρήκα άλλο τρόπο (όλες οι αναφορές σε αυτό το μοτίβο αναφέρονται).
Αν κάποιος έχει να προτείνει κάτι άλλο, πολύ ευχαρίστως να το δω και αυτό...

Τα LOCK / UNLOCK είναι προαιρετικά αν έχει μόνο ένας admin πρόσβαση. Στην περίπτωση μου έχουν περισσότεροι και έτσι διασφαλίζω πως αν συμπέσουν στο editing κατηγοριών, δεν θα υπάρξει conflict ταυτόχρονης επέμβασης στο ίδιο table.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από alou » 21 Ιαν 2015 15:43

quick thought σχετικά με τη χρήση του lock / multiple users: compare edit time με last update time και prompt αν έχει γίνει αλλαγή στον πίνακα όσο έκανες edit.

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από Lykos22 » 22 Ιαν 2015 18:24

korgr έγραψε:Η διαγραφή της υπό μετακίνηση κατηγορίας και η επαναδημιουργία της με insert έχοντας τη νέα θέση, ισούται με επεξεργασία.
Αυτό γίνεται για να υπολογιστούν πρώτα όλα τα νέα LEFT / RIGHTS χωρίς την κατηγορία που αλλάζει θέση και μετά να απλοποιήσουμε την διαδικασία με ένα απλό add το οποίο είδες πως είναι πιο απλό!
Τι ακριβώς δεν καταλαβαίνεις?
Με παραξενεύει λίγο το ότι κάνεις διαγραφή.. και πώς τα ανακτείς πάλι τα δεδομένα σου ώστε να τα κάνεις πάλι εγγραφή στη βάση ? Αν υποθέσουμε ότι δεν έχεις μόνο το όνομα του μενού σου, αλλά και description κλπ κλπ ?

Για να μετακινήσεις ένα node δεν θα πρέπει να κάνεις UPDATE τα left και right του, αλλά και του υπόλοιπου tree, ανάλογα που θες να μετακινηθείς ???

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

n-level Menu με Nested Sets (Modified Preorder Tree Traversal) Αλγόριθμο

Δημοσίευση από korgr » 22 Ιαν 2015 20:11

Κάνει update όλα τα left/right όχι μόνο της upadted εγγραφής
Επίσης τίτλους, περιγραφές κλπ πρέπει να τα έχεις σε άλλο πίνακα για την πολυγλωσσικότητα

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες