1: | <?php |
2: | |
3: | class BootstrapMenu extends \Sphp\tools\MenuGen{ |
4: | private $brandicon = ""; |
5: | private $navbarClasses = "navbar navbar-expand-md bg-dark navbar-dark"; |
6: | private $fixedPos = ""; |
7: | private $rootMenu = "root"; |
8: | private $blnAjaxLink = false; |
9: | |
10: | public function onrun() { |
11: | $this->init(); |
12: | $this->genMenus(); |
13: | } |
14: | public function setPosition($val="sticky-top") { |
15: | |
16: | $this->fixedPos = $val; |
17: | } |
18: | public function setRootMenu($val) { |
19: | $this->rootMenu = $val; |
20: | } |
21: | public function setNavBarCss($val) { |
22: | $this->navbarClasses = $val; |
23: | } |
24: | public function setBrandIcon($val) { |
25: | $this->brandicon = $val; |
26: | } |
27: | |
28: | public function genMenus() { |
29: | $strmbar = $this->genMenuBar(); |
30: | $mnuroot = $this->sphp_api->getMenuList($this->rootMenu); |
31: | |
32: | $str1 = ""; |
33: | foreach ($mnuroot as $mnuName => $lstMenu) { |
34: | $str1 .= $this->genMenu($lstMenu); |
35: | } |
36: | $this->htmlout = $strmbar[0] . $str1 . $strmbar[1]; |
37: | } |
38: | private function genMenu($lstMenu,$submenu=0){ |
39: | $mnuroot = $this->sphp_api->getMenuList($lstMenu[0]); |
40: | $stra = array(); |
41: | $str = ""; |
42: | $str1 = ""; |
43: | if($mnuroot != null){ |
44: | foreach ($mnuroot as $mnuName => $lstMenu2) { |
45: | $str .= $this->genMenu($lstMenu2,1); |
46: | } |
47: | $str1 = $this->genMenuLinks($this->sphp_api->getMenuLinkList($lstMenu[0])); |
48: | if($str1 != ""){ |
49: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[3],$submenu); |
50: | }else{ |
51: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[3],$submenu); |
52: | } |
53: | return $stra[0] . $str . $str1 . $stra[1]; |
54: | |
55: | }else{ |
56: | $str = $this->genMenuLinks($this->sphp_api->getMenuLinkList($lstMenu[0])); |
57: | if($str != ""){ |
58: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[3],$submenu); |
59: | }else{ |
60: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[3],2); |
61: | } |
62: | return $stra[0] . $str . $stra[1]; |
63: | } |
64: | |
65: | } |
66: | private function genMenuLinks($mnuroot){ |
67: | $str = ""; |
68: | if($mnuroot != null){ |
69: | foreach ($mnuroot as $mnuLinkName => $lstMenuLink) { |
70: | $str .= $this->getB4MenuLink($lstMenuLink); |
71: | } |
72: | } |
73: | return $str; |
74: | } |
75: | private function setAjax(){ |
76: | $this->blnAjaxLink = true; |
77: | SphpBase::JSServer()->getAJAX(); |
78: | addHeaderJSFunction('menu_ajax', "function menu_ajax(url){ |
79: | ", " getURL(url); }"); |
80: | } |
81: | private function getB4Menu($mnutext,$mnuhref="",$blnAjaxLink2=false,$mnuSub=0){ |
82: | $mnutitle = $mnutext; |
83: | if($mnuhref==''){ |
84: | $mnuhref = "#"; |
85: | }else if($blnAjaxLink2){ |
86: | if(!$this->blnAjaxLink){ |
87: | $this->setAjax(); |
88: | } |
89: | $mnuhref = "javascript: menu_ajax('$mnuhref');"; |
90: | } |
91: | $stro = array(); |
92: | if($mnuSub==0){ |
93: | $stro[0] = '<li class="nav-item dropdown nav-dli"><a class="nav-link dropdown-toggle nav-dlink" data-toggle="dropdown" href="'.$mnuhref.'" >'.$mnutitle.'</a><ul class="dropdown-menu">'; |
94: | $stro[1] = '</ul></li>'; |
95: | }else if($mnuSub==1){ |
96: | $stro[0] = '<li class="dropdown-submenu nav-dli"><a class="dropdown-item dropdown-toggle nav-dlink2" data-toggle="dropdown" href="'.$mnuhref.'" >'.$mnutitle.'</a><ul class="dropdown-menu">'; |
97: | $stro[1] = '</ul></li>'; |
98: | }else{ |
99: | $stro[0] = '<li class="nav-item"><a class="nav-link" href="'.$mnuhref.'" >'.$mnutitle.'</a>'; |
100: | $stro[1] = '</li>'; |
101: | } |
102: | return $stro; |
103: | } |
104: | private function getB4MenuLink($lstMenuLink){ |
105: | $mnuitemtext = $lstMenuLink[0]; |
106: | $mnuitemhref = $lstMenuLink[1]; |
107: | $blnAjaxLink2 = $lstMenuLink[3]; |
108: | $mkey = ""; |
109: | $mkeychar = ""; |
110: | if($lstMenuLink[5] !== ""){ |
111: | $mkeya = $this->setKey($mnuitemtext,$lstMenuLink[5]); |
112: | $mkey = $mkeya[1]; |
113: | $mkeychar = $mkeya[0]; |
114: | } |
115: | $mnuitemtext = $mnuitemtext . $mkeychar; |
116: | $tfun = "menu_ajax"; |
117: | if($mnuitemhref==''){ |
118: | $mnuitemhref = "#"; |
119: | }else if($blnAjaxLink2){ |
120: | if(!$this->blnAjaxLink){ |
121: | $this->setAjax(); |
122: | } |
123: | if(strpos($mnuitemhref,"avascript:")<1){ |
124: | $mnuitemhref = "javascript: $tfun('$mnuitemhref');"; |
125: | } |
126: | } |
127: | return '<li><a class="dropdown-item" data-mkey="'. $mkey .'" href="'.$mnuitemhref.'">'.$mnuitemtext.'</a></li>'; |
128: | } |
129: | public function genMenuBar() { |
130: | if($this->brandicon != ""){ |
131: | $this->brandicon = ' <!-- Brand --> |
132: | <a class="navbar-brand" href="#"><img src="'. $this->brandicon .'" alt="Logo" style="width:40px;"></a> |
133: | '; |
134: | } |
135: | $bootstrapMenu = '<nav class="'. $this->navbarClasses . ' ' . $this->fixedPos .'"> '. $this->brandicon .' |
136: | <!-- Toggler/collapsibe Button --> |
137: | <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#nav1"> |
138: | <span class="navbar-toggler-icon"></span> |
139: | </button> |
140: | <div class="collapse navbar-collapse" id="nav1"> |
141: | <ul class="navbar-nav"> |
142: | '; |
143: | return array($bootstrapMenu,'</div></nav>'); |
144: | } |
145: | private function setKey($mnuname,$strkeyll) { |
146: | $controlkeys=""; |
147: | $keya = explode(",",$strkeyll); |
148: | $key = $keya[0]; |
149: | if(count($keya)>1) $controlkeys = $keya[1]; |
150: | $fkeya = array(); |
151: | $fkeya["F1"] = 112; |
152: | $fkeya["F2"] = 113; |
153: | $fkeya["F3"] = 114; |
154: | $fkeya["F4"] = 115; |
155: | $fkeya["F5"] = 116; |
156: | $fkeya["F6"] = 117; |
157: | $fkeya["F7"] = 118; |
158: | $fkeya["F8"] = 119; |
159: | $fkeya["F9"] = 120; |
160: | $fkeya["F10"] = 121; |
161: | $fkeya["F11"] = 122; |
162: | $fkeya["F12"] = 123; |
163: | $mkeychar = ""; |
164: | $controlkeysp = ""; |
165: | if(!is_numeric($key)){ |
166: | $mkeychar = strtoupper($key); |
167: | if(strlen($key)>1){ |
168: | $key = $fkeya[$mkeychar]; |
169: | }else{ |
170: | $key = ord($mkeychar); |
171: | } |
172: | }else{ |
173: | $mkeychar = strtoupper(chr($key)); |
174: | } |
175: | if($controlkeys != ""){ |
176: | $controlkeysp = "+"; |
177: | } |
178: | $mkeychar = " ". strtoupper($controlkeys). $controlkeysp . $mkeychar; |
179: | $mkey = $key; |
180: | $controlkeysa = explode('+',$controlkeys); |
181: | $strkey = ""; |
182: | foreach ($controlkeysa as $key => $value) { |
183: | if($value == "alt"){ |
184: | if($strkey != "") $strkey .= " && "; |
185: | $strkey .= "eventer.event.altKey"; |
186: | }else if($value == "ctrl"){ |
187: | if($strkey != "") $strkey .= " && "; |
188: | $strkey .= "eventer.event.ctrlKey"; |
189: | }else if($value == "shift"){ |
190: | if($strkey != "") $strkey .= " && "; |
191: | $strkey .= "eventer.event.shiftKey"; |
192: | } |
193: | } |
194: | if($strkey != "") $strkey .= " && "; |
195: | |
196: | addHeaderJSFunction("jq_menukeyevent", "function jq_menukeyevent(eventer){", " return true;}",true); |
197: | addHeaderJSFunctionCode("jq_keyevent", "menukeyevent1", 'ret = (jq_menukeyevent(eventer2) ? ret : false);',true); |
198: | addHeaderJSFunctionCode("jq_menukeyevent", $mnuname, ' if('. $strkey .'eventer.keycode=='. $mkey .'){ |
199: | if(eventer.evt==\'keyup\'){ |
200: | $(".dropdown-item[data-mkey='.$mkey.']")[0].click(); |
201: | } |
202: | return false; |
203: | } |
204: | ',true); |
205: | return array($mkeychar,$mkey); |
206: | |
207: | |
208: | |
209: | |
210: | } |
211: | |
212: | private function init() { |
213: | addHeaderJSFunctionCode("ready", "navbar", ' |
214: | var links = jql(\'.navbar ul li a\'); |
215: | jql.each(links, function (key, va) { |
216: | if (va.href == document.URL) { |
217: | jql(this).addClass(\'active\'); |
218: | var pa = jql(this).parents(\'li.nav-dli\'); |
219: | jql.each(pa, function (key2, va2) { |
220: | jql(va2).children("a.nav-dlink:first").addClass(\'active\'); |
221: | }); |
222: | } |
223: | }); |
224: | jql(\'.dropdown-menu a.dropdown-toggle\').on(\'click\', function(e) { |
225: | if (!jql(this).next().hasClass(\'show\')) { |
226: | jql(this).parents(\'.dropdown-menu\').first().find(\'.show\').removeClass("show"); |
227: | } |
228: | var $subMenu = jql(this).next(".dropdown-menu"); |
229: | $subMenu.toggleClass(\'show\'); |
230: | jql(this).parents(\'li.nav-item.dropdown.show\').on(\'hidden.bs.dropdown\', function(e) { |
231: | jql(\'.dropdown-submenu .show\').removeClass("show"); |
232: | }); |
233: | return false; |
234: | }); |
235: | //jql(\'.nav-dlink\').click(); |
236: | jql.each(jql(\'.nav-dlink\'), function (key, va) { |
237: | //va.click(); |
238: | }); |
239: | ',true); |
240: | addHeaderCSS("navbar", ' .dropdown-submenu { |
241: | position: relative; |
242: | } |
243: | |
244: | .dropdown-submenu a::after { |
245: | transform: rotate(-90deg); |
246: | position: absolute; |
247: | right: 6px; |
248: | top: .8em; |
249: | } |
250: | |
251: | .dropdown-submenu .dropdown-menu { |
252: | top: 0; |
253: | left: 100%; |
254: | margin-left: .1rem; |
255: | margin-right: .1rem; |
256: | } ', true); |
257: | |
258: | } |
259: | |
260: | } |
261: | |