1: | <?php |
2: | |
3: | class BootstrapSideMenu extends \Sphp\tools\MenuGen{ |
4: | public $brandicon = ""; |
5: | public $navbarClasses = "nav flex-column flex-nowrap overflow-hidden nav-pills"; |
6: | private $mkey = ""; |
7: | private $mkeychar = ""; |
8: | private $fixedPos = ""; |
9: | private $rootMenu = "sidebar"; |
10: | private $counter1 = 1; |
11: | |
12: | public function onrun() { |
13: | $this->init(); |
14: | $this->genMenus(); |
15: | } |
16: | public function setPosition($val="sticky-top") { |
17: | |
18: | $this->fixedPos = $val; |
19: | } |
20: | public function setRootMenu($val) { |
21: | $this->rootMenu = $val; |
22: | } |
23: | public function setNavBarCss($val) { |
24: | $this->navbarClasses = $val; |
25: | } |
26: | public function setBrandIcon($val) { |
27: | $this->brandicon = $val; |
28: | } |
29: | public function genMenus() { |
30: | $strmbar = $this->genMenuBar(); |
31: | $mnuroot = $this->sphp_api->getMenuList("root"); |
32: | |
33: | $str1 = ""; |
34: | foreach ($mnuroot as $mnuName => $lstMenu) { |
35: | $str1 .= $this->genMenu($lstMenu); |
36: | } |
37: | $this->htmlout = $strmbar[0] . $str1 . $strmbar[1]; |
38: | } |
39: | private function genMenu($lstMenu,$submenu=0){ |
40: | $mnuroot = $this->sphp_api->getMenuList($lstMenu[0]); |
41: | $stra = array(); |
42: | $str = ""; |
43: | $str1 = ""; |
44: | if($mnuroot != null){ |
45: | foreach ($mnuroot as $mnuName => $lstMenu2) { |
46: | $str .= $this->genMenu($lstMenu2,1); |
47: | } |
48: | $str1 = $this->genMenuLinks($this->sphp_api->getMenuLinkList($lstMenu[0])); |
49: | if($str1 != ""){ |
50: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[2],$lstMenu[3],$submenu); |
51: | }else{ |
52: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[2],$lstMenu[3],$submenu); |
53: | } |
54: | return $stra[0] . $str . $str1 . $stra[1]; |
55: | |
56: | }else{ |
57: | $str = $this->genMenuLinks($this->sphp_api->getMenuLinkList($lstMenu[0])); |
58: | if($str != ""){ |
59: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[2],$lstMenu[3],$submenu); |
60: | }else{ |
61: | $stra = $this->getB4Menu($lstMenu[0],$lstMenu[1],$lstMenu[2],$lstMenu[3],2); |
62: | } |
63: | return $stra[0] . $str . $stra[1]; |
64: | } |
65: | |
66: | } |
67: | private function genMenuLinks($mnuroot){ |
68: | $str = ""; |
69: | if($mnuroot != null){ |
70: | foreach ($mnuroot as $mnuLinkName => $lstMenuLink) { |
71: | $str .= $this->getB4MenuLink($lstMenuLink[0],$lstMenuLink[1],$lstMenuLink[2],$lstMenuLink[3]); |
72: | } |
73: | } |
74: | return $str; |
75: | } |
76: | private function setAjax(){ |
77: | $this->blnAjaxLink = true; |
78: | SphpBase::JSServer()->getAJAX(); |
79: | addHeaderJSFunction('menu_ajax', "function menu_ajax(url){ |
80: | ", " getURL(url); }"); |
81: | } |
82: | private function getB4Menu($mnutext,$mnuhref="",$mnuicon,$blnAjaxLink2=false,$mnuSub=0){ |
83: | $mnutitle = $mnutext; |
84: | if($mnuhref==''){ |
85: | $mnuhref = "#"; |
86: | }else if($blnAjaxLink2){ |
87: | if(!$this->blnAjaxLink){ |
88: | $this->setAjax(); |
89: | } |
90: | $mnuhref = "javascript: menu_ajax('$mnuhref');"; |
91: | } |
92: | $mnuhref2 = 'd'. $this->counter1; |
93: | $this->counter1 += 1; |
94: | $stro = array(); |
95: | |
96: | if($mnuSub==0){ |
97: | $stro[0] = '<li class="nav-item nav-dli"><a class="nav-link nav-dlink text-truncate" data-toggle="collapse" data-target="#'. $mnuhref2 .'" href="#'.$mnuhref2.'" >' . |
98: | '<i class="'. $mnuicon .'"></i> <span class="d-none d-sm-inline">' . $mnutitle.'</span></a>' |
99: | . '<div id="'. $mnuhref2 .'" aria-expanded="true"><ul class="flex-column pl-2 nav">'; |
100: | $stro[1] = '</ul></div></li>'; |
101: | }else if($mnuSub==1){ |
102: | $stro[0] = '<li class="nav-item nav-dli"><a class="nav-link nav-dlink collapsed text-truncate" data-toggle="collapse" data-target="#'. $mnuhref2 .'" href="#'.$mnuhref2.'" >' . |
103: | '<i class="'. $mnuicon .'"></i> <span class="d-none d-sm-inline">' . $mnutitle.'</span></a>' |
104: | . '<div class="collapse" id="'. $mnuhref2 .'" aria-expanded="false"><ul class="flex-column pl-2 nav">'; |
105: | $stro[1] = '</ul></div></li>'; |
106: | }else{ |
107: | $stro[0] = '<li class="nav-item"><a class="nav-link text-truncate" data-mkey="'. $this->mkey .'" href="'.$mnuhref.'"><i class="'. $mnuicon .'"></i> <span class="d-none d-sm-inline">'.$mnutitle.'</span></a>'; |
108: | $stro[1] = '</li>'; |
109: | } |
110: | return $stro; |
111: | } |
112: | private function getB4MenuLink($mnuitemtext,$mnuitemhref="",$mnuicon,$blnAjaxLink2=false){ |
113: | $mnuitemtitle = $mnuitemtext; |
114: | $mnuitemtext = $mnuitemtext . $this->mkeychar; |
115: | $tfun = "menu_ajax"; |
116: | if($mnuitemhref==''){ |
117: | $mnuitemhref = "#"; |
118: | }else if($blnAjaxLink2){ |
119: | $mnuitemhref = "javascript: $tfun('$mnuitemhref');"; |
120: | } |
121: | return '<li class="nav-item"><a class="nav-link nav-dli text-truncate" data-mkey="'. $this->mkey .'" href="'.$mnuitemhref.'"><i class="'. $mnuicon .'"></i> <span class="d-none d-sm-inline">'.$mnuitemtext.'</span></a></li>'; |
122: | } |
123: | public function genMenuBar() { |
124: | if($this->brandicon != ""){ |
125: | $this->brandicon = ' <!-- Brand --> |
126: | <div><a class="" href="#"><img class="img img-fluid img-circle" src="'. $this->brandicon .'" alt="Logo"></a></div>'; |
127: | } |
128: | $bootstrapMenu = $this->brandicon . '<div class="snavbar"><ul class="'. $this->navbarClasses .'">'; |
129: | return array($bootstrapMenu,'</ul></div>'); |
130: | } |
131: | private function setKey($key,$controlkeys="") { |
132: | $fkeya = array(); |
133: | $fkeya["F1"] = 112; |
134: | $fkeya["F2"] = 113; |
135: | $fkeya["F3"] = 114; |
136: | $fkeya["F4"] = 115; |
137: | $fkeya["F5"] = 116; |
138: | $fkeya["F6"] = 117; |
139: | $fkeya["F7"] = 118; |
140: | $fkeya["F8"] = 119; |
141: | $fkeya["F9"] = 120; |
142: | $fkeya["F10"] = 121; |
143: | $fkeya["F11"] = 122; |
144: | $fkeya["F12"] = 123; |
145: | $mkeychar = ""; |
146: | $controlkeysp = ""; |
147: | if(!is_numeric($key)){ |
148: | $mkeychar = strtoupper($key); |
149: | if(strlen($key)>1){ |
150: | $key = $fkeya[$mkeychar]; |
151: | }else{ |
152: | $key = ord($mkeychar); |
153: | } |
154: | }else{ |
155: | $mkeychar = strtoupper(chr($key)); |
156: | } |
157: | if($controlkeys != ""){ |
158: | $controlkeysp = "+"; |
159: | } |
160: | $this->mkeychar = " ". strtoupper($controlkeys). $controlkeysp . $mkeychar; |
161: | $this->mkey = $key; |
162: | $controlkeysa = explode('+',$controlkeys); |
163: | $strkey = ""; |
164: | foreach ($controlkeysa as $key => $value) { |
165: | if($value == "alt"){ |
166: | if($strkey != "") $strkey .= " && "; |
167: | $strkey .= "eventer.event.altKey"; |
168: | }else if($value == "ctrl"){ |
169: | if($strkey != "") $strkey .= " && "; |
170: | $strkey .= "eventer.event.ctrlKey"; |
171: | }else if($value == "shift"){ |
172: | if($strkey != "") $strkey .= " && "; |
173: | $strkey .= "eventer.event.shiftKey"; |
174: | } |
175: | } |
176: | if($strkey != "") $strkey .= " && "; |
177: | |
178: | addHeaderJSFunction("jq_menukeyevent", "function jq_menukeyevent(eventer){", "}",true); |
179: | addHeaderJSFunctionCode("jq_keyevent", "menukeyevent1", 'ret = jq_menukeyevent(eventer2);',true); |
180: | addHeaderJSFunctionCode("jq_menukeyevent", $this->name, ' if('. $strkey .'eventer.keycode=='. $this->mkey .'){ |
181: | if(eventer.evt==\'keyup\'){ |
182: | $(".dropdown-item[data-mkey='.$this->mkey.']")[0].click(); |
183: | return false; |
184: | } |
185: | } |
186: | ',true); |
187: | |
188: | |
189: | |
190: | |
191: | } |
192: | |
193: | private function init() { |
194: | addHeaderJSFunctionCode("ready", "snavbar1", ' |
195: | var links = jql(\'.snavbar a\'); |
196: | jql.each(links, function (key, va) { |
197: | if (va.href == document.URL) { |
198: | jql(this).addClass(\'active\'); |
199: | var pa = jql(this).parents(\'li.nav-dli\'); |
200: | jql.each(pa, function (key2, va2) { |
201: | jql(va2).children("a.nav-dlink:first").addClass(\'active\'); |
202: | }); |
203: | } |
204: | }); |
205: | ',true); |
206: | addHeaderCSS("snavbar2", ' .nav-link[data-toggle].collapsed:before { |
207: | content: " ▾"; |
208: | } |
209: | .nav-link[data-toggle]:not(.collapsed):before { |
210: | content: " ▴"; |
211: | } |
212: | |
213: | ', true); |
214: | |
215: | } |
216: | |
217: | } |
218: | |