First Commit
This commit is contained in:
Generated
+8
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="PROJECT_PROFILE" />
|
||||
</settings>
|
||||
</component>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
</project>
|
||||
Generated
+8
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/MenuBuilder.iml" filepath="$PROJECT_DIR$/.idea/MenuBuilder.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
Generated
+10
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="NodePackageJsonFileManager">
|
||||
<packageJsonPaths />
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
|
||||
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name" : "ahwelp/menubuilder",
|
||||
"description" : "Different Menus",
|
||||
"type" : "library",
|
||||
"authors" : [
|
||||
{
|
||||
"name" : "ahwelp",
|
||||
"email" : "ahwelp@ahwelp.com"
|
||||
}
|
||||
],
|
||||
"autoload" : {
|
||||
"psr-4" : {
|
||||
"MenuBuilder\\" : "src/MenuBuilder/"
|
||||
}
|
||||
},
|
||||
"require" : { }
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
class HtmlBuilder {
|
||||
/**
|
||||
* Create an HTML link.
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $title
|
||||
* @param array $attributes
|
||||
* @return string
|
||||
*/
|
||||
public function link($url, $title, $icon = "", $attributes = [])
|
||||
{
|
||||
return '<a href="'.$url.'"'.$this->attributes($attributes).'>'.$icon.$this->entities($title).'</a>';
|
||||
}
|
||||
/**
|
||||
* Convert an HTML string to entities.
|
||||
*
|
||||
* @param string $value
|
||||
* @return string
|
||||
*/
|
||||
public function entities($value)
|
||||
{
|
||||
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
|
||||
}
|
||||
/**
|
||||
* Build an HTML attribute string from an array.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return string
|
||||
*/
|
||||
public function attributes(array $attributes)
|
||||
{
|
||||
$html = [];
|
||||
foreach ($attributes as $key => $value)
|
||||
{
|
||||
if (is_null($value)) continue;
|
||||
if (is_numeric($key)) $key = $value;
|
||||
$html[] = $key.'="'.$this->entities($value).'"';
|
||||
}
|
||||
return empty($html) ? '' : ' '.implode(' ', $html);
|
||||
}
|
||||
}
|
||||
Executable
+138
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace MenuBuilder;
|
||||
|
||||
class Menu {
|
||||
|
||||
/**
|
||||
* HTML builder instance.
|
||||
*
|
||||
* @var \JasonLewis\Menu\HtmlBuilder
|
||||
*/
|
||||
protected $html;
|
||||
|
||||
/**
|
||||
* Array of attribtues.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $attributes = [];
|
||||
|
||||
/**
|
||||
* Array of menu items.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $items = [];
|
||||
|
||||
public function items(){
|
||||
return $this->items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Menu instance.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($attributes = []) {
|
||||
$this->attributes = $attributes;
|
||||
$this->html = new HtmlBuilder;
|
||||
}
|
||||
|
||||
public function addDirect($menu){
|
||||
$this->items[] = $menu;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a menu item.
|
||||
*
|
||||
* @param string $link
|
||||
* @param string $title
|
||||
* @param array $attributes
|
||||
* @return \JasonLewis\Menu\Menu
|
||||
*/
|
||||
public function add($link, $title, $icon = '', $attributes = [], $weight = 0) {
|
||||
$menu = new MenuItem();
|
||||
$this->items[] = $menu->link($link)->title($title)->icon($icon)->attributes($attributes)->weight($weight);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Nest a menu on the previous item.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return \JasonLewis\Menu\Menu
|
||||
*/
|
||||
public function nestMenu($attributes = []) {
|
||||
$key = count($this->items) - 1;
|
||||
|
||||
$this->items[$key]->nest($menu = new Menu($attributes));
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the menu.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render() {
|
||||
$this->sort();
|
||||
$attributes = $this->html->attributes($this->attributes);
|
||||
|
||||
$menu[] = "<ul{$attributes}>";
|
||||
|
||||
foreach ($this->items as $item) {
|
||||
$menu[] = $item->render();
|
||||
}
|
||||
|
||||
$menu[] = '</ul>';
|
||||
|
||||
return implode(PHP_EOL, $menu);
|
||||
}
|
||||
|
||||
public function renderRaw(){
|
||||
$menu[] = "";
|
||||
foreach ($this->items as $item) {
|
||||
$menu[] = $item->renderRaw();
|
||||
}
|
||||
return implode(PHP_EOL, $menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort the menu
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function sort() {
|
||||
usort($this->items, function($a, $b) { // anonymous function
|
||||
return $a->weight - $b->weight;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/*private function merge(){
|
||||
$new_array = Array();
|
||||
foreach($items as $key => $item){
|
||||
foreach($items as $item_){
|
||||
if( $item->title == $item_->title ){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Render the menu.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString() {
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
namespace MenuBuilder;
|
||||
|
||||
class MenuItem {
|
||||
/**
|
||||
* HTML builder instance.
|
||||
*
|
||||
* @var Menu\HtmlBuilder
|
||||
*/
|
||||
protected $html;
|
||||
/**
|
||||
* Menu item title.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
/**
|
||||
* Menu item link.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $link;
|
||||
/**
|
||||
* Nested menu.
|
||||
*
|
||||
* @var Menu\Menu
|
||||
*/
|
||||
protected $nested;
|
||||
/**
|
||||
* Array of attributes.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $attributes = [];
|
||||
/**
|
||||
* Create a new menu item instance.
|
||||
*
|
||||
*/
|
||||
|
||||
public $icon = '';
|
||||
public $weight = 0;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->html = new HtmlBuilder;
|
||||
}
|
||||
/**
|
||||
* Set the menu item link.
|
||||
*
|
||||
* @param string $link
|
||||
* @return Menu\MenuItem
|
||||
*/
|
||||
public function link($link)
|
||||
{
|
||||
$this->link = $link;
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* Set the menu item title.
|
||||
*
|
||||
* @param string $link
|
||||
* @return Menu\MenuItem
|
||||
*/
|
||||
public function title($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function weight($weight = 0){
|
||||
$this->weight = $weight;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function icon($icon = ''){
|
||||
$this->icon = $icon;
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* Set the menu item attributes.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return Menu\MenuItem
|
||||
*/
|
||||
public function attributes(array $attributes)
|
||||
{
|
||||
$this->attributes = $attributes;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Nest another menu.
|
||||
*
|
||||
* @param Menu\Menu $menu
|
||||
* @return Menu\MenuItem
|
||||
*/
|
||||
public function nest(Menu $menu)
|
||||
{
|
||||
$this->nested = $menu;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the menu item.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return '<li>'.$this->html->link($this->link, $this->title, $this->icon, $this->attributes).$this->renderNestedMenu().'</li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the nested menu.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function renderNestedMenu()
|
||||
{
|
||||
if ($this->nested)
|
||||
{
|
||||
return $this->nested->render();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Render the menu item.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
public static function newMenu($link = '', $title = '', $icon = '' ){
|
||||
$menu = new MenuItem();
|
||||
|
||||
$menu->link($link);
|
||||
$menu->title($title);
|
||||
$menu->icon = $icon;
|
||||
|
||||
|
||||
return $menu;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user