Skip to content

Instantly share code, notes, and snippets.

@DykiSA
Last active April 13, 2020 05:42
Show Gist options
  • Select an option

  • Save DykiSA/5533606daf5e7478209cad6e01da1bb7 to your computer and use it in GitHub Desktop.

Select an option

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', base_url('create'), 'fa fa-plus')
			->add('List', base_url('list'), 'fa fa-list')
		, 'treeview')
		->add('Jenis Kecerdasan', base_url('jenis-kecerdasan'), 'fa fa-lightbulb-o')
		->add('Kuisioner', base_url('kuisionair'), 'fa fa-edit')
		->add('Siswa', base_url('siswa'), 'fa fa-users')
		->add('Tes Kecerdasan', null, null, null, 'header')
		->add('Tes Baru', base_url('new-test'), 'fa fa-plus')
		->add('Report', base_url('report'), 'fa fa-file');

		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="http://localhost/acing/tes-kecerdasan/create"><i class="fa fa-plus"></i>Create</a></li>
			<li><a href="http://localhost/acing/tes-kecerdasan/list"><i class="fa fa-list"></i>List</a></li>
		</ul>
	</li>
	<li><a href="http://localhost/acing/tes-kecerdasan/jenis-kecerdasan"><i class="fa fa-lightbulb-o"></i>Jenis Kecerdasan</a></li>
	<li><a href="http://localhost/acing/tes-kecerdasan/kuisionair"><i class="fa fa-edit"></i>Kuisioner</a></li><li><a href="http://localhost/acing/tes-kecerdasan/siswa"><i class="fa fa-users"></i>Siswa</a></li><li class="header">Tes Kecerdasan</li>
	<li><a href="http://localhost/acing/tes-kecerdasan/new-test"><i class="fa fa-plus"></i>Tes Baru</a></li><li><a href="http://localhost/acing/tes-kecerdasan/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