Skip to content

Instantly share code, notes, and snippets.

@DykiSA
Last active April 13, 2020 05:42
Show Gist options
  • Save DykiSA/5533606daf5e7478209cad6e01da1bb7 to your computer and use it in GitHub Desktop.
Save DykiSA/5533606daf5e7478209cad6e01da1bb7 to your computer and use it in GitHub Desktop.
Generate HTML Menu element using PHP script

This class will help you to build a navigation menu and then generate it to html element

USAGE

<div class="menu-wrapper">
    <?php
        require_once './Menu.php';
        // generate AdminLTE menu
        $menu = Menu::create(array(
            'class' => 'sidebar-menu',
            'data-widget' => 'tree'
        ))
        // ->add(label, url, icon, submenu, li_class)
        ->add('Master Data', null, null, null, 'header')
        ->add('Dashboard', '#', 'fa fa-dashboard',
            // submenu
            Menu::create(array(
                'class' => 'treeview-menu'
            ))
            ->add('Create', '/create', 'fa fa-plus')
            ->add('List', '/list', 'fa fa-list')
        , 'treeview')
        ->add('Jenis Kecerdasan', '/jenis-kecerdasan', 'fa fa-lightbulb-o')
        ->add('Kuisioner', '/kuisionair', 'fa fa-edit')
        ->add('Siswa', '/siswa', 'fa fa-users')
        ->add('Tes Kecerdasan', null, null, null, 'header')
        ->add('Tes Baru', '/new-test', 'fa fa-plus')
        ->add('Report', '/report', 'fa fa-file')
        ->render();

        echo $menu;
    ?>
</div>

The result for script above:

<ul class="sidebar-menu" data-widget="tree">
    <li class="header">Master Data</li>
    <li class="treeview">
        <a href="#"><i class="fa fa-dashboard"></i>Dashboard<i class="fa fa-angle-left pull-right"></i></a>
        <ul class="treeview-menu">
            <li><a href="/create"><i class="fa fa-plus"></i>Create</a></li>
            <li><a href="/list"><i class="fa fa-list"></i>List</a></li>
        </ul>
    </li>
    <li><a href="/jenis-kecerdasan"><i class="fa fa-lightbulb-o"></i>Jenis Kecerdasan</a></li>
    <li><a href="/kuisionair"><i class="fa fa-edit"></i>Kuisioner</a></li>
    <li><a href="/siswa"><i class="fa fa-users"></i>Siswa</a></li>
    <li class="header">Tes Kecerdasan</li>
    <li><a href="/new-test"><i class="fa fa-plus"></i>Tes Baru</a></li>
    <li><a href="/report"><i class="fa fa-file"></i>Report</a></li>
</ul>
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Menu class helper
*
* Generate structured html menu from php
*
* @author Dyki Surahman Abi
* @link https://github.com/dykisa
*/
class Menu
{
var $links = array();
var $ul_attributes = array();
function __construct($config = array())
{
$this->initialize($config);
}
public static function create($config = array())
{
return new static($config);
}
public function initialize($config = array())
{
$this->_clear();
$this->ul_attributes = $config;
return $this;
}
private function _clear()
{
$this->ul_attributes = array();
$this->links = array();
}
public function add($label, $url = null, $icon = null, Menu $submenu = null, $li_class = null)
{
$link = array();
$link['label'] = $label;
if (!is_null($url))
$link['url'] = $url;
if (!is_null($icon))
$link['icon'] = $icon;
if (!is_null($submenu))
$link['submenu'] = $submenu;
if (!is_null($li_class)) {
$link['li_class'] = $li_class;
}
array_push($this->links, $link);
return $this;
}
public function render()
{
// render ul
$output = $this->_generate_tag_open('ul', $this->ul_attributes);
foreach ($this->links as $link) {
// '<li>'
$li_attributes = array();
if (isset($link['li_class'])) {
$li_attributes['class'] = $link['li_class'];
}
$output .= $this->_generate_tag_open('li', $li_attributes);
// '<a>'
if (isset($link['url']) && !empty($link['url'])) {
$a_attributes['href'] = $link['url'];
$output .= $this->_generate_tag_open('a', $a_attributes);
// '<i>'
if (isset($link['icon'])) {
$i_attributes['class'] = $link['icon'];
$output .= $this->_generate_tag_open('i', $i_attributes) . '</i>';
}
}
$output .= $link['label'];
// <i class="fa fa-angle-left pull-right"></i>
if (isset($link['submenu']) && !is_null($link['submenu'])) {
$output .= $this->_generate_tag_open('i', array(
'class' => 'fa fa-angle-left pull-right'
)) . '</i>';
}
// '</a>'
if (isset($link['url']))
$output .= '</a>';
if (isset($link['submenu']) && !is_null($link['submenu']))
$output .= $link['submenu']->render();
$output .= '</li>';
}
$output .= '</ul>';
return $output;
}
private function _generate_tag_open($tag, $attributes)
{
$tag_open = "<$tag";
foreach ($attributes as $attr => $value) {
$tag_open .= " $attr=\"$value\"";
}
$tag_open .= '>';
return $tag_open;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment