ahwelp hace 7 años
commit
9e0d343f36

+ 8 - 0
.idea/MenuBuilder.iml

@@ -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
.idea/inspectionProfiles/profiles_settings.xml

@@ -0,0 +1,5 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="PROJECT_PROFILE" />
+  </settings>
+</component>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -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>

+ 10 - 0
.idea/workspace.xml

@@ -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>

+ 17 - 0
composer.json

@@ -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" : { }
+}

+ 43 - 0
src/MenuBuilder/HtmlBuilder.php

@@ -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);
+	}
+}

+ 138 - 0
src/MenuBuilder/Menu.php

@@ -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();
+    }
+
+}

+ 146 - 0
src/MenuBuilder/MenuItem.php

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