philos Δημοσ. 22 Δεκεμβρίου 2018 Δημοσ. 22 Δεκεμβρίου 2018 (επεξεργασμένο) Καλησπέρα! Έχω το εξής κάπως σύνθετο πρόβλημα. Αφορά τη μηχανή Xenforo 2 (forum). Έχουμε τον ακόλουθο db πίνακα "xf_node" με κάποια πεδία: node_id (auto increment) parent_node_id title breadcrumb_data (αυτό έχει php serialized όλα τα γονικά node_ids μαζί με τον title, ώστε όταν μπαίνεις σε ένα forum να χτίζει το navigation χωρίς extra queries, πχ (Parent Forum I > Subforum B > Subforum C) = απλά το σημειώνω μήπως χρειαστεί. Το πρόβλημα: Έστω ότι έχουμε την ακόλουθη δομή forums: Parent Forum I -- Subforum A (Level 1) -- Subforum B (Level 1) ---- subforum C (Level 2) -- Subforum D (Level 1) ---- subforum E (Level 2) ---- subforum F (Level 2) Parent Forum II -- Subforum G (Level 1) -- Subforum H (Level 1) ---- subforum I (Level 2) -- Subforum J (Level 1) ---- subforum K (Level 2) ---- subforum L (Level 2) Τι θέλω να πετύχω; - Παράδειγμα 1: Όταν ο χρήστης μπαίνει στο subforum C, στη σελίδα εκείνη (ας πούμε ότι το node_id του subforum C εκχωρείται στη μεταβλητή $node_id), να επιλέξω μέσω MySQL query ή και με κώδικα php / επεξεργασία όλα τα level I forums του Parent Forum I. Δηλαδή όλα εκτός των E και F. - Παράδειγμα 2: Όταν ο χρήστης μπαίνει στο subforum E, να επιλέξω μέσω query / php όλα τα level I forums του Parent Forum I, μαζί με το F, αλλά χωρίς το C. Μερικές extra πληροφορίες: Τα Parent Forum έχουνε parent_node_id = 0 Το Parent Forum II το έβαλα ως παράδειγμα για να δείξω ότι κάθε φορά μας αφορά το structure του τρέχοντος Parent Forum (του I στο παράδειγμα), δηλαδή τα υπόλοιπα δεν μας ενδιαφέρουν. Πως να το χειριστώ; Ίσως θα μπορούσα να λύσω το πρόβλημα με ατομικά mysql queries μέσα σε επανάληψη, αλλά αν μιλάμε για μεγάλο αριθμό forums κάτι τέτοιο θα ήταν δυσλειτουργικό. Επεξ/σία 22 Δεκεμβρίου 2018 από philos
philos Δημοσ. 22 Δεκεμβρίου 2018 Μέλος Δημοσ. 22 Δεκεμβρίου 2018 Το έλυσα μόνος μου με δύο queries. if ($forum->allow_posting) { $forum_parentids = array(); foreach($forum->Node->breadcrumb_data AS $crumb) { $forum_parentids[] = $crumb['node_id']; } if (!empty($forum_parentids)) { $nodes = \XF::finder('XF:Node') ->whereOr([['node_id','=', $forum_parentids],['parent_node_id', '=', $forum_parentids]]) ->fetch(); foreach ($nodes AS $node_id => $node) { if (!empty($node->breadcrumb_data)) { foreach($node->breadcrumb_data AS $crumb) { $forum_parentids[] = $crumb['node_id']; } } } } $forum_parentids = array_unique($forum_parentids); if (!empty($forum_parentids)) { $final_nodes = \XF::finder('XF:Node') ->whereOr([['node_id','=', $forum_parentids],['parent_node_id', '=', $forum_parentids]]) ->fetch(); $processed_nodeids = array(); $extra_subforums_data = array(); foreach ($final_nodes AS $node_id => $node) { if (in_array($node->node_id, $processed_nodeids)) { continue; } if ($node->node_id != $forum->node_id AND $node->parent_node_id != 0) { $extra_subforums_data[] = $node; } $processed_nodeids[] = $node->node_id; } } Ευχαριστώ για τη φιλοξενία της απορίας!
k33theod Δημοσ. 22 Δεκεμβρίου 2018 Δημοσ. 22 Δεκεμβρίου 2018 Φίλε δεν κατάλαβα τι ακριβώς κάνεις. Περίμενα όμως ότι η λύση θα ήταν πολύ πιο απλή. Από την περιγραφή κατάλαβα ότι θες τα siblings του Node (τα αδέρφια δηλαδή) και το parent με τα (siblings) του. Έτσι πρέπει να τα ζητήσεις. Εάν δεν έχεις siblings και έχεις children πας στο parent επιλέγεις όλα τα children πας στο parent του parent(στον παπού δηλαδή) επιλέγεις όλα τα children. Εάν δεν έχεις ούτε siblings ούτε children στα nodes σου ίσως πρέπει να σκεφτείς να τα κάνεις 😃
philos Δημοσ. 22 Δεκεμβρίου 2018 Μέλος Δημοσ. 22 Δεκεμβρίου 2018 (επεξεργασμένο) Ναι αυτό κάνω στην ουσία Το breadcrumb_data έχει serialized όλα τα γονικά nodes (ok το κάνει και αυτόματα unserialized το XF). Σε πρώτη φάση [βήμα 1] παίρνω όλα τα node_ids από το breadcrumb_data του τρέχοντος Node (forum) που έχουν φορτωθεί ούτως η άλλως. Μετά κάνω το πρώτο query με τον Finder του XF2 και τραβάω όλα τα nodes που πήρα από το βήμα 1. Επομένως από αυτό το query παίρνω και τα nodes από το breadcrumb_data αυτών. Το τελικό query ($final_nodes) είναι το απαραίτητο για να πάρω τα δεδομένα με όλα τα απαραίτητα εργαλεία του παρέχει το Entities σύστημα του Xenforo. Το τελικό query το βελτιστοποίησα με κάποιες where ώστε να αποφύγω και τα: if (in_array($node->node_id, $processed_nodeids)) { continue; } if ($node->node_id != $forum->node_id AND $node->parent_node_id != 0) { $extra_subforums_data[] = $node; } ... και είναι έτοιμο. Πραγματικά δεν μπορώ να σκεφτώ πιο αποδοτικό τρόπο. Μιλάμε για τη μηχανή forum Xenforo 2 έτσι, δεν πρόκειται για κάποια δική μου πλατφόρμα. Επεξ/σία 22 Δεκεμβρίου 2018 από philos 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα