Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

Λοιπόν, έχουμε έναν πίνακα "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, αλλά δε ξέρω πως να το πετύχω.

Δημοσ.

Με αναδρομή. Πχ:

<?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.

 

Δημοσ.

Επειδή έφαγα κώλυμμα και δε μου βγαίνει αυτό που θέλω να κάνω (το παραπάνω script ασφαλώς και λειτουργεί σωστά ως php page, αλλά κάνοντας διάφορες δοκιμές δεν κατάφερα να κάνω αυτό που θέλω) :

Θα ήθελα να προσδώσω σε μια μεταβλητή, ας την πούμε $selectoptions, τα δεδομένα.

Όταν κάνω:

$selectoptions = render_all_children();

... το script μου επιστρέφει στον header της σελίδας τα options, και όχι στη μεταβλητή.

 

Με άλλα λόγια θα ήθελα αν μπορείς να τροποποιήσεις το script ώστε να μην κάνει echo, αλλά return μέσα από μια function, των <option>. :ph34r: :-)

 

Κόλλησα στην τροποποίηση της render_option..

Δημοσ.

 

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;
    }

...ή κάπως έτσι...

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...