philos Δημοσ. 31 Ιανουαρίου 2015 Δημοσ. 31 Ιανουαρίου 2015 Καλησπέρα!Λοιπόν, έχουμε έναν πίνακα "categories" σε MySQL (μεταφέρω τα δεδομένα του προβλήματος ως ενδεικτικά) με τα εξής columns: categoryid title parentid (default 0) displayorder Σε αυτό τον πίνακα αποθηκεύονται οι κατηγορίες και οι υποκατηγορίες τους. Οπότε το parentid μπορεί να περιέχει την τιμή κάποιου categoryid, ώστε να είναι υποκατηγορία του. Αν το parentid είναι 0, μιλάμε για αρχική κατηγορία. Θα ήθελα με τη βοήθεια της PHP να εξάγω ένα HTML select dropdown menu, με ονομασία τον τίτλο της κατηγορίας και αριστερά της το χαρακτήρα "-" ανάλογα με το βάθος των υποκατηγοριών. πχ: <select name="category"> <option value="1">-Main Category</option> <option value="2">-Main Category2</option> <option value="3">--Subcat with level1</option> <option value="4">---Subcat with level2</option> <option value="5">----Subcat with level3</option> <option value="6">-Main Cat 3</option> <option value="7">--Sub 1 of maincat 3</option> [...] </select> Το value είναι το categoryid, όμως οι κατηγορίες και οι υπο-κατηγορίες εισάγονται μπερδεμένα στη βάση δεδομένων. Καταλαβαίνω ότι πρέπει να γίνει με κάποια function με χρήση μιας μεταβλητής $depth (+ 1) και την str_repeat, αλλά δε ξέρω πως να το πετύχω.
geomagas Δημοσ. 31 Ιανουαρίου 2015 Δημοσ. 31 Ιανουαρίου 2015 Με αναδρομή. Πχ: <?php function get_subcategory($parent) { $cats=array( 1=>array('parent'=>0,'name'=>'Main Category'), 2=>array('parent'=>0,'name'=>'Main Category2'), 3=>array('parent'=>2,'name'=>'Subcat with level1'), 4=>array('parent'=>3,'name'=>'Subcat with level2'), 5=>array('parent'=>4,'name'=>'Subcat with level3'), 6=>array('parent'=>0,'name'=>'Main Cat 3'), 7=>array('parent'=>6,'name'=>'Sub 1 of maincat 3'), ); return array_filter( $cats, function($val)use($parent) { return $val['parent']==$parent; } ); } function render_option($cat,$name,$depth) { ?> <option value="<?php echo $cat; ?>"> <?php echo str_repeat('-',$depth).$name; ?> </option> <?php render_all_children($cat,$depth+1); } function render_all_children($parent=0,$depth=0) { foreach(get_subcategory($parent) as $id=>$data) render_option($id,$data['name'],$depth); } ?> <select name="category"> <?php render_all_children(); ?> </select> Προφανώς θα πρέπει να αντικαταστήσεις την get_subcategory() με τη δική σου, που θα διαβάζει τα δεδομένα από τη βάση σου, αλλά you get the point.
philos Δημοσ. 31 Ιανουαρίου 2015 Μέλος Δημοσ. 31 Ιανουαρίου 2015 Επειδή έφαγα κώλυμμα και δε μου βγαίνει αυτό που θέλω να κάνω (το παραπάνω script ασφαλώς και λειτουργεί σωστά ως php page, αλλά κάνοντας διάφορες δοκιμές δεν κατάφερα να κάνω αυτό που θέλω) : Θα ήθελα να προσδώσω σε μια μεταβλητή, ας την πούμε $selectoptions, τα δεδομένα. Όταν κάνω: $selectoptions = render_all_children(); ... το script μου επιστρέφει στον header της σελίδας τα options, και όχι στη μεταβλητή. Με άλλα λόγια θα ήθελα αν μπορείς να τροποποιήσεις το script ώστε να μην κάνει echo, αλλά return μέσα από μια function, των <option>. Κόλλησα στην τροποποίηση της render_option..
geomagas Δημοσ. 31 Ιανουαρίου 2015 Δημοσ. 31 Ιανουαρίου 2015 ob_start(); Quick'n'dirty, αλλά σωστός! Ή εναλλακτικά: function render_option($cat,$name,$depth) { $dashes=str_repeat('-',$depth); $this_option="<option value='$cat'>$dashes$name</option>"; $children=render_all_children($cat,$depth+1); return "$this_option$children"; } function render_all_children($parent=0,$depth=0) { $r=''; foreach(get_subcategory($parent) as $id=>$data) $r.=render_option($id,$data['name'],$depth); return $r; } ...ή κάπως έτσι... 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα