1: <?php
2: //permissions system is not implemented, only menu ban works
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: // fixed-bottom fixed-top sticky-top
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: // generate bootstrap 4 menu
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: // code depend on key listner javascript code of framework
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: //console.log(eventer.keycode);
207: //console.log(eventer.event.shiftKey);
208: //console.log(eventer.event.ctrlKey);
209: //console.log(eventer.event.altKey);
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: