2

I am using http://www.bootply.com/nZaxpxfiXz for a drop down list. But my data set is like

array(
    (int) 0 => array(
        'Genre' => array(
            'id' => '1',
            'name' => 'Alternative Rock',
            'is_active' => true,
            'updated' => '2015-10-03 19:19:39',
            'parent_id' => '24'
        )
    ),
    (int) 1 => array(
        'Genre' => array(
            'id' => '2',
            'name' => 'College Rock',
            'is_active' => true,
            'updated' => '2015-10-03 19:19:45',
            'parent_id' => '24'
        )
    ),
    (int) 2 => array(
        'Genre' => array(
            'id' => '3',
            'name' => 'Experimental Rock',
            'is_active' => true,
            'updated' => '2015-10-03 19:19:50',
            'parent_id' => '24'
        )
    ),
    (int) 3 => array(
        'Genre' => array(
            'id' => '4',
            'name' => 'Goth Rock',
            'is_active' => true,
            'updated' => '2015-10-03 19:19:57',
            'parent_id' => '24'
        )
    ),
    (int) 4 => array(
        'Genre' => array(
            'id' => '5',
            'name' => 'Grunge',
            'is_active' => true,
            'updated' => '2015-01-29 17:16:15',
            'parent_id' => null
        )
    ),
    (int) 5 => array(
        'Genre' => array(
            'id' => '6',
            'name' => 'Hardcore Punk',
            'is_active' => true,
            'updated' => '2015-01-29 17:16:15',
            'parent_id' => null
        )
    ),
    (int) 6 => array(
        'Genre' => array(
            'id' => '7',
            'name' => 'Hard Rock',
            'is_active' => true,
            'updated' => '2015-01-29 17:16:15',
            'parent_id' => null
        )
    ),
    (int) 7 => array(
        'Genre' => array(
            'id' => '10',
            'name' => 'Pop',
            'is_active' => true,
            'updated' => '2015-10-03 16:38:43',
            'parent_id' => null
        )
    ),
    (int) 8 => array(
        'Genre' => array(
            'id' => '24',
            'name' => 'Rock',
            'is_active' => true,
            'updated' => '2015-10-03 19:19:32',
            'parent_id' => null
        )
    )
)

I want to build a drop down list with category and subcategories. Which have parent_id those will be sub category of a category.

How to fit my php array into this view ?

 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Dropdown Link 1</a></li>
                        <li><a href="#">Dropdown Link 2</a></li>
                        <li><a href="#">Dropdown Link 3</a></li>
                        <li class="divider"></li>
                        <li class="dropdown dropdown-submenu"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown Link 4</a>
                            <ul class="dropdown-menu">
                                <li><a href="#">Dropdown Submenu Link 4.1</a></li>
                                <li><a href="#">Dropdown Submenu Link 4.2</a></li>
                                <li><a href="#">Dropdown Submenu Link 4.3</a></li>
                                <li><a href="#">Dropdown Submenu Link 4.4</a></li>
                            </ul>
                        </li>

                    </ul>
                </li>

1 Answer 1

1

This should do it. But you'll probably need to rethink where you put that getChildren function (I included it inline for simplicity), you might want to make a CakePHP view helper class, or even perform that logic in your controller before getting to your view.

<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
    <ul class="dropdown-menu">
        <?php foreach ($genres as $genre) : ?>
            <?php if ($genre['Genre']['parent_id'] == null) : ?>
                <?php $children = getChildren($genres, $genre['Genre']['id']); ?>
                <li class="<?php echo empty($children) ? '' : 'dropdown dropdown-submenu'; ?>">

                    <?php $a_string = 'class="dropdown-toggle" data-toggle="dropdown"'; ?>
                    <a href="#" <?php echo empty($children) ? '' : $a_string; ?>>
                        <?php echo $genre['Genre']['name']; ?>
                    </a>

                    <?php if (!empty($children)) : ?>
                        <ul class="dropdown-menu">
                            <?php foreach ($children as $child) : ?>
                                <li><a href="#"><?php echo $child['Genre']['name']; ?></a></li>
                            <?php endforeach; ?>
                        </ul>
                    <?php endif; ?>
                </li>
            <?php endif; ?>
        <?php endforeach; ?>
    </ul>
</li>

<?php
    function getChildren($genres, $parent_id) {
        $children = array();
        foreach ($genres as $genre_inner) {
            if ($genre_inner['Genre']['parent_id'] == $parent_id) {
                $children[] = $genre_inner;
            }
        }
        return $children;
    }
?>
Sign up to request clarification or add additional context in comments.

2 Comments

my bad, mistake on this line: <?php $children = getChildren($genres, $genre_inner['Genre']['parent_id']); ?> should be: <?php $children = getChildren($genres, $genre['Genre']['id']); ?>
Thanks for accepting the answer, an upvote would be nice also (big up arrow next to the answer on top left)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.