Mercurial
comparison .cms/mod/menu.mod.php @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 <?php | |
2 | |
3 $cms["modules"]["menu.mod.php"] = array( | |
4 "name" => "menu_module_name", | |
5 "description" => "menu_module_description", | |
6 "files" => array( | |
7 ".cms/mod/menu.mod.php", | |
8 ".cms/css/menu.css", | |
9 ".cms/js/menu.js", | |
10 ".cms/lang/ru_RU.UTF-8/menu.mod.php", | |
11 ".cms/lang/en_US.UTF-8/menu.mod.php", | |
12 ".cms/lang/uk_UA.UTF-8/menu.mod.php", | |
13 ".cms/man/ru_RU.UTF-8/menu.mod.php.html", | |
14 ), | |
15 ); | |
16 | |
17 // Return if module disabled | |
18 if ( ! empty( $cms["config"]["menu.mod.php"]["disabled"] ) ) { | |
19 | |
20 return; | |
21 | |
22 } else { | |
23 | |
24 if ( is_admin() ) { | |
25 hook_add_fn( "create_tables", "cms_menu_create_table" ); | |
26 hook_add_fn( "admin", "cms_menu_admin", 20 ); | |
27 hook_add_fn( "admin_header", "cms_menu_admin_header" ); | |
28 hook_add_fn( "api", "cms_menu_api", 20 ); | |
29 } | |
30 | |
31 } | |
32 | |
33 function cms_menu_admin_header() { | |
34 global $cms; | |
35 $conf = $cms["config"]["menu.mod.php"]["menu"]["menu"]; | |
36 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
37 echo "<link rel=stylesheet href='{$cms['base_path']}css/menu.css'>"; | |
38 echo "<script src='{$cms['base_path']}js/menu.js'></script>"; | |
39 } | |
40 } | |
41 | |
42 | |
43 function cms_menu_api() { | |
44 global $cms; | |
45 | |
46 if ( ! empty( $_POST["fn"] ) ) { | |
47 | |
48 switch ( $_POST["fn"] ) { | |
49 | |
50 case "create_menu_item": | |
51 | |
52 if ( empty( $cms["base"] ) ) { | |
53 echo( json_encode( array( | |
54 "info_text" => __( "no_connect_db" ), | |
55 "info_class" => "info-error", | |
56 "info_time" => 5000, | |
57 ) ) ); | |
58 return; | |
59 } | |
60 | |
61 $sort = 10; | |
62 // Пересортировываем имеющиеся | |
63 $pid = (int) $_POST["pid"]; | |
64 $q = "SELECT mid FROM menu WHERE pid={$pid} ORDER BY `sort`"; | |
65 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
66 while ( $i = mysqli_fetch_assoc( $r ) ) { | |
67 $q = "UPDATE menu SET `sort`={$sort} WHERE mid={$i['mid']}"; | |
68 mysqli_query( $cms["base"], $q ); | |
69 $sort += 10; | |
70 } | |
71 } | |
72 | |
73 $q = "INSERT INTO menu SET pid={$pid}, url='', sort={$sort}"; | |
74 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
75 $mid = mysqli_insert_id( $cms["base"] ); | |
76 echo( json_encode( array( | |
77 "info_text" => __( "created" ), | |
78 "info_class" => "info-success", | |
79 "info_time" => 5000, | |
80 "list" => cms_menu_get_items_list(), | |
81 "parents" => cms_menu_get_parents_list(), | |
82 "mid" => $mid, | |
83 ) ) ); | |
84 return; | |
85 } else { | |
86 echo( json_encode( array( | |
87 "info_text" => __( "sql_error" ) . mysqli_error( $cms["base"] ), | |
88 "info_class" => "info-error", | |
89 "info_time" => 5000, | |
90 ) ) ); | |
91 return; | |
92 } | |
93 break; | |
94 | |
95 case "get_menu_items": | |
96 | |
97 if ( empty( $cms["base"] ) ) { | |
98 echo( json_encode( array( | |
99 "info_text" => __( "no_connect_db" ), | |
100 "info_class" => "info-error", | |
101 "info_time" => 5000, | |
102 ) ) ); | |
103 return; | |
104 } | |
105 | |
106 echo( json_encode( array( | |
107 "list" => cms_menu_get_items_list(), | |
108 "parents" => cms_menu_get_parents_list(), | |
109 ) ) ); | |
110 return; | |
111 | |
112 break; | |
113 | |
114 case "del_menu_item": | |
115 | |
116 if ( $mid = (int) $_POST["mid"] ) { | |
117 cms_menu_del( $mid ); | |
118 | |
119 cms_clear_cache(); | |
120 | |
121 echo( json_encode( array( | |
122 "info_text" => __( "deleted" ), | |
123 "info_class" => "info-success", | |
124 "info_time" => 5000, | |
125 "list" => cms_menu_get_items_list(), | |
126 "parents" => cms_menu_get_parents_list(), | |
127 ) ) ); | |
128 return; | |
129 } | |
130 break; | |
131 | |
132 case "save_menu_item": | |
133 | |
134 $mid = (int) $_POST["mid"]; | |
135 $pid = (int) $_POST["pid"]; | |
136 $old_pid = (int) $_POST["old_pid"]; | |
137 $id = (int) $_POST["id"]; | |
138 $sort = (int) $_POST["sort"]; | |
139 $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] ); | |
140 $tag_title = mysqli_real_escape_string( $cms["base"], $_POST["tag_title"] ); | |
141 $classes = mysqli_real_escape_string( $cms["base"], $_POST["classes"] ); | |
142 $url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); | |
143 $area = mysqli_real_escape_string( $cms["base"], $_POST["area"] ); | |
144 if ( $_POST["target"] === "true" ) { | |
145 $target_blank = 1; | |
146 } else { | |
147 $target_blank = 0; | |
148 } | |
149 | |
150 $q = "UPDATE menu SET | |
151 pid={$pid}, | |
152 id={$id}, | |
153 sort={$sort}, | |
154 title='{$title}', | |
155 tag_title='{$tag_title}', | |
156 class='{$classes}', | |
157 url='{$url}', | |
158 area='{$area}', | |
159 target_blank={$target_blank} | |
160 WHERE mid={$mid}"; | |
161 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
162 | |
163 cms_clear_cache(); | |
164 | |
165 $r = array( | |
166 "ok" => "true", | |
167 "info_text" => __( "updated" ), // FIXME: never fire | |
168 "info_class" => "info-success", | |
169 "info_time" => 5000, | |
170 //"list" => cms_menu_get_items_list(), | |
171 "parents" => cms_menu_get_parents_list(), | |
172 ); | |
173 if ( $pid != $old_pid ) { | |
174 $r["list"] = cms_menu_get_items_list(); | |
175 } | |
176 echo ( json_encode( $r ) ); | |
177 return; | |
178 } else { | |
179 echo( json_encode( array( | |
180 "ok" => "false", | |
181 "info_text" => __( "update_properties_error" ), | |
182 "info_class" => "info-error", | |
183 "info_time" => 5000, | |
184 ) ) ); | |
185 return; | |
186 } | |
187 | |
188 break; | |
189 | |
190 case "get_search_pages_list": | |
191 | |
192 if ( empty( $cms["base"] ) ) { | |
193 echo( json_encode( array( | |
194 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", | |
195 ) ) ); | |
196 return; | |
197 } | |
198 | |
199 //$s = mysqli_real_escape_string( $cms["base"], $_POST["search"] ); | |
200 //$s = str_replace( " ", "%", $s ); | |
201 $s = preg_replace( "/\s/u", "", $_POST["search"] ); | |
202 $s = preg_split( '//u', $s, -1, PREG_SPLIT_NO_EMPTY ); | |
203 foreach( $s as $n => $ch ) { | |
204 $s[$n] = mysqli_real_escape_string( $cms["base"], $ch ); | |
205 } | |
206 $s = implode( "%", $s ); | |
207 $html[] = array( | |
208 "sort" => 2000000000, | |
209 "html" => "<li data-id=0 data-url>" . __( "no_page" ) . "</li>" | |
210 ); | |
211 // pages without blocks | |
212 $q = "SELECT id, title, url, pin FROM pages WHERE title LIKE '%{$s}%' OR url LIKE '%{$s}%' ORDER BY ( id + pin * 1000000000 ) DESC LIMIT 10"; | |
213 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
214 while ( $page = mysqli_fetch_assoc( $res ) ) { | |
215 $title = htmlspecialchars( $page["title"] ); | |
216 $html[] = array( | |
217 "sort" => $page["id"] + $page["pin"] * 1000000000, | |
218 "html" => "<li data-id={$page['id']} data-url='{$page['url']}'>{$title}</li>" | |
219 ); | |
220 } | |
221 } | |
222 // pages with blocks | |
223 $q = "SELECT id, title, url, pin FROM blocks_pages WHERE title LIKE '%{$s}%' OR url LIKE '%{$s}%' ORDER BY ( id + pin * 1000000000 ) DESC LIMIT 10"; | |
224 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
225 while ( $page = mysqli_fetch_assoc( $res ) ) { | |
226 $title = htmlspecialchars( $page["title"] ); | |
227 $html[] = array( | |
228 "sort" => $page["id"] + $page["pin"] * 1000000000, | |
229 "html" => "<li data-id={$page['id']} data-url='{$page['url']}'>{$title}</li>" | |
230 ); | |
231 } | |
232 } | |
233 cms_asort( $html ); | |
234 $html = array_reverse( $html ); | |
235 $list = ""; | |
236 foreach( $html as $item ) { | |
237 $list .= $item["html"]; | |
238 } | |
239 echo( json_encode( array( | |
240 "html" => $list, | |
241 ) ) ); | |
242 return; | |
243 break; | |
244 | |
245 } | |
246 } | |
247 } | |
248 | |
249 function cms_menu_del( $mid ) { | |
250 global $cms; | |
251 | |
252 // Recursively delete children items | |
253 $q = "SELECT mid FROM menu WHERE pid={$mid}"; | |
254 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
255 while ( $r = mysqli_fetch_assoc( $res ) ) { | |
256 cms_menu_del( $r["mid"] ); | |
257 } | |
258 } | |
259 | |
260 mysqli_query( $cms["base"], "DELETE FROM menu WHERE mid=$mid" ); | |
261 | |
262 } | |
263 | |
264 function cms_menu_get_items_list( $pid = 0 ) { | |
265 global $cms; | |
266 | |
267 if ( empty( $cms["base"] ) ) { | |
268 echo( json_encode( array( | |
269 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", | |
270 ) ) ); | |
271 return; | |
272 } | |
273 | |
274 $list = ""; | |
275 | |
276 $q = "SELECT * FROM menu WHERE pid={$pid} ORDER BY sort, title"; | |
277 if ( ! $res = mysqli_query( $cms["base"], $q ) ) { | |
278 | |
279 return "<span class=no-tables>" . __( "no_tables_db" ) . "</span>"; | |
280 | |
281 } else { | |
282 | |
283 // Read template settings | |
284 cms_template_load_settings(); | |
285 | |
286 // Menu Areas | |
287 $area_options = ""; | |
288 $tpl = $cms["config"]["template.mod.php"]["template"]; | |
289 if ( isset( $cms["menu_areas"] ) ) { | |
290 foreach ( $cms["menu_areas"] as $area => $a ) { | |
291 //- удалить после перехода на $cms["menu_areas"]["header_en"] = "Header En"; | |
292 if ( is_array( $a ) && isset( $a["title"] ) ) { | |
293 $title = $a["title"]; | |
294 } elseif ( is_string( $a ) ) { | |
295 $title = $a; | |
296 } | |
297 $area_options .= "<div class=option value='{$area}'>{$title}</div>"; | |
298 } | |
299 } | |
300 | |
301 // Translations | |
302 $tr_title = __( "title" ); | |
303 $tr_area = __( "area" ); | |
304 $tr_no_area = __( "no_area" ); | |
305 $tr_classes = __( "classes" ); | |
306 $tr_sort = __( "sort" ); | |
307 $tr_save = __( "save" ); | |
308 $tr_delete = __( "delete" ); | |
309 $tr_append = __( "append_item" ); | |
310 $tr_prop = __( "properties" ); | |
311 $tr_parent = __( "parent" ); | |
312 $tr_no_parent = __( "no_parent" ); | |
313 $tr_placeholder = __( "placeholder_hint" ); | |
314 $tr_no_page = __( "no_page" ); | |
315 $tr_search = __( "search" ); | |
316 $tr_tag_title = __( "hint" ); | |
317 $tr_new_window = __( "target_blank" ); | |
318 $tr_page = __( "page" ); | |
319 $tr_page_deleted = __( "deleted_page" ); | |
320 $tr_menu_item = __( "no_page" ); | |
321 | |
322 while ( $item = mysqli_fetch_assoc( $res ) ) { | |
323 | |
324 // Children Items | |
325 $sublist = cms_menu_get_items_list( $item["mid"] ); | |
326 if ( $sublist ) { | |
327 $sublist = "<div class=items-grid>{$sublist}</div>"; | |
328 } | |
329 | |
330 if ( $item["pid"] == 0 ) { | |
331 | |
332 // area title | |
333 //- подправить после перехода на $cms["menu_areas"]["header_en"] = "Header En"; | |
334 if ( empty( $item["area"] ) ) { | |
335 $area_title = $tr_no_area; | |
336 } elseif ( isset( $cms["menu_areas"][ $item['area'] ] ) && is_string( $cms["menu_areas"][ $item['area'] ] ) ) { | |
337 $area_title = $cms["menu_areas"][ $item['area'] ]; | |
338 } elseif ( isset( $cms["menu_areas"][ $item['area'] ] ) && is_array( $cms["menu_areas"][ $item['area'] ] ) ) { | |
339 $area_title = $cms["menu_areas"][ $item['area'] ]['title']; | |
340 } else { | |
341 $area_title = $item['area']; | |
342 } | |
343 | |
344 $list .= " | |
345 <div> | |
346 | |
347 <div class=menu data-item={$item['mid']}> | |
348 | |
349 <input name=title type=text value='{$item['title']}'> | |
350 <input name=sort type=text value='{$item['sort']}' data-sort='{$item['sort']}'> | |
351 | |
352 <div class=menu-buttons> | |
353 <div class=prop>{$tr_prop}</div> | |
354 <div class=append>{$tr_append}</div> | |
355 <div class=save><span>{$tr_save}</span></div> | |
356 <div class=del>{$tr_delete}</div> | |
357 </div> | |
358 | |
359 <div class=menu-prop> | |
360 <div class='area title'>{$tr_area}:</div> | |
361 | |
362 <div class=area-select-grid> | |
363 <div class=field-select-menu data-menu-area='{$item['area']}'> | |
364 <div class=value>{$area_title}</div> | |
365 <div class=icon></div> | |
366 </div> | |
367 <div class=field-options> | |
368 <div class=option value=''>{$tr_no_area}</div> | |
369 {$area_options} | |
370 </div> | |
371 </div> | |
372 | |
373 <div class='classes title'>{$tr_classes}:</div> | |
374 <input name=classes type=text value='{$item['class']}'> | |
375 </div> | |
376 | |
377 </div> | |
378 | |
379 {$sublist} | |
380 | |
381 </div>"; | |
382 | |
383 } else { | |
384 | |
385 $disabled_url = "disabled"; | |
386 | |
387 if ( $item["id"] === "0" ) { | |
388 $item["select_title"] = $tr_no_page; | |
389 $disabled_url = ""; | |
390 // free item | |
391 if ( ! empty( $item["title"] ) ) { | |
392 $item["link_title"] = $item["title"]; | |
393 } else { | |
394 $item["link_title"] = $tr_menu_item; | |
395 } | |
396 } else { | |
397 // Дернуть модуль страниц и модуль страниц с блоками | |
398 // чтобы предоставили информацию | |
399 $cms["menu.mod.php"]["item"] = &$item; | |
400 do_hook( "mod_menu_item" ); | |
401 | |
402 } | |
403 | |
404 // Wrap title in URL | |
405 if ( $item["id"] === "0" && empty( $item['url'] ) ) { | |
406 $link = "<a target=_blank>{$item["link_title"]}</a>"; | |
407 } elseif ( $item["id"] === "0" && ! empty( $item['url'] ) ) { | |
408 $link = "<a href='{$item['url']}' target=_blank>{$item["link_title"]}</a>"; | |
409 } else { | |
410 $link = "<a href='{$cms['base_path']}{$item['url']}' target=_blank>{$item["link_title"]}</a>"; | |
411 } | |
412 | |
413 // Checkbox "Open in new Tab" | |
414 if ( $item["target_blank"] ) { | |
415 $checked = "checked"; | |
416 } else { | |
417 $checked = ""; | |
418 } | |
419 | |
420 $e_tag_title = htmlspecialchars( $item["tag_title"] ); | |
421 | |
422 $list .= " | |
423 <div> | |
424 | |
425 <div class=item data-item={$item['mid']}> | |
426 | |
427 {$link} | |
428 | |
429 <div class=menu-buttons> | |
430 <div class=prop>{$tr_prop}</div> | |
431 <div class=append>{$tr_append}</div> | |
432 <div class=save><span>{$tr_save}</span></div> | |
433 <div class=del>{$tr_delete}</div> | |
434 </div> | |
435 | |
436 <div class=menu-prop> | |
437 <div class='title name'>{$tr_title}:</div> | |
438 <input name=title type=text value='{$item['title']}' placeholder='{$tr_placeholder}'> | |
439 <div class='sort title'>{$tr_sort}:</div> | |
440 <input name=sort type=text value='{$item['sort']}'> | |
441 <div class='parent title'>{$tr_parent}:</div> | |
442 | |
443 <div class=parent-select-grid> | |
444 <div class=field-select data-parent='{$item['pid']}' data-old-parent='{$item['pid']}'> | |
445 <div class=value></div> | |
446 <div class=icon></div> | |
447 </div> | |
448 <div class=field-options> | |
449 <div class=option value=0>{$tr_no_parent}</div> | |
450 </div> | |
451 </div> | |
452 | |
453 <div class='classes title'>{$tr_classes}:</div> | |
454 <input name=classes type=text value='{$item['class']}'> | |
455 <div class='page title'>{$tr_page}:</div> | |
456 <div class=select-grid> | |
457 <div class=field-select name=id data-id={$item['id']} data-old-id={$item['id']}> | |
458 <div class=value>{$item['select_title']}</div> | |
459 <div class=icon></div> | |
460 </div> | |
461 <div class=field-options> | |
462 <div class=select-dropdown> | |
463 <div class=field-search> | |
464 <input class=search-field type=text placeholder='{$tr_search}'> | |
465 </div> | |
466 <ul class=list-search> | |
467 <li data-id=0 data-url>{$tr_no_page}</li> | |
468 </ul> | |
469 </div> | |
470 </div> | |
471 </div> | |
472 <div class='tag title'>{$tr_tag_title}:</div> | |
473 <input name=tag_title type=text value=\"{$e_tag_title}\"> | |
474 <div class='url title'>URL:</div> | |
475 <div class=target-blank> | |
476 <input name=url type=text value='{$item['url']}' {$disabled_url}> | |
477 <input name=targetblank type=checkbox {$checked} title='{$tr_new_window}'> | |
478 </div> | |
479 </div> | |
480 </div> | |
481 | |
482 {$sublist} | |
483 | |
484 </div>"; | |
485 } | |
486 | |
487 } | |
488 } | |
489 return $list; | |
490 } | |
491 | |
492 function cms_menu_get_parents_list( $pid = 0, $lvl = 0 ) { | |
493 global $cms; | |
494 $parents = ""; | |
495 if ( empty( $cms["base"] ) ) { | |
496 return ""; | |
497 } | |
498 $q = "SELECT mid, pid, title, id FROM menu WHERE pid={$pid} ORDER BY sort"; | |
499 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
500 while ( $item = mysqli_fetch_assoc( $res ) ) { | |
501 if ( empty( $item["title"] ) and $item["id"] !== "0" ) { | |
502 $q = "SELECT title FROM pages WHERE id={$item['id']}"; | |
503 if ( $res_page = mysqli_query( $cms["base"], $q ) and $page = mysqli_fetch_assoc( $res_page ) ) { | |
504 $item["title"] = $page["title"]; | |
505 } else { | |
506 $item["title"] = __( "deleted_page" ); | |
507 } | |
508 } elseif ( empty( $item["title"] ) ) { | |
509 $item["title"] = __( "no_page" ); | |
510 } | |
511 $title = htmlspecialchars( $item["title"] ); | |
512 $ident = str_repeat( " ", $lvl ); | |
513 $parents .= "<div class=option value={$item['mid']}>{$ident}{$title}</div>"; | |
514 $parents .= cms_menu_get_parents_list( $item["mid"], $lvl + 1 ); | |
515 } | |
516 } | |
517 return $parents; | |
518 } | |
519 | |
520 function cms_menu_admin() { | |
521 global $cms; | |
522 | |
523 $conf = $cms["config"]["menu.mod.php"]["menu"]["menu"]; | |
524 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
525 | |
526 $page = " | |
527 <div class=main-main> | |
528 <div class=menu-grid> | |
529 </div> | |
530 </div> | |
531 <div class=main-footer> | |
532 <a class=create data-item=0>" . __( "add_menu" ) . "</a> | |
533 </div>"; | |
534 | |
535 // Create menu item if not exists | |
536 if ( empty( $cms["config"]["menu.mod.php"]["menu"]["menu"] ) ) { | |
537 $cms["config"]["menu.mod.php"]["menu"]["menu"] = array( | |
538 "title" => "menu_module_name", | |
539 "sort" => 200, | |
540 "section" => "content", | |
541 ); | |
542 cms_save_config(); | |
543 } | |
544 | |
545 $cms["admin_pages"]["menu"] = $page; | |
546 | |
547 } | |
548 } | |
549 | |
550 function cms_menu_create_table() { | |
551 global $cms; | |
552 | |
553 mysqli_query( $cms["base"], " | |
554 CREATE TABLE IF NOT EXISTS `menu` ( | |
555 `mid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, | |
556 `pid` int(11) DEFAULT 0, | |
557 `id` int(11) NOT NULL DEFAULT 0, | |
558 `title` varchar(255) NOT NULL DEFAULT '', | |
559 `tag_title` varchar(255) NOT NULL DEFAULT '', | |
560 `url` varchar(255) NOT NULL DEFAULT '', | |
561 `sort` int(11) NOT NULL DEFAULT 1000, | |
562 `class` varchar(255) NOT NULL DEFAULT '', | |
563 `area` varchar(32) NOT NULL DEFAULT '', | |
564 `target_blank` tinyint(1) NOT NULL DEFAULT 0, | |
565 UNIQUE KEY `mid` (`mid`) | |
566 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |
567 "); | |
568 | |
569 } | |
570 | |
571 // One or more Menus | |
572 function menu( $area ) { | |
573 global $cms; | |
574 if ( empty( $cms["base"] ) ) { return ""; } // fix php 8.0 | |
575 $area = mysqli_real_escape_string( $cms["base"], $area ); | |
576 $q = "SELECT * FROM menu WHERE pid=0 AND area='{$area}' ORDER BY sort"; | |
577 $html = ""; | |
578 $cms["menu"] = array(); | |
579 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
580 while ( $menu = mysqli_fetch_assoc( $res ) ) { | |
581 $cms["menu.mod.php"]["menu"] = $menu; | |
582 $html .= menu1( $menu["mid"] ); | |
583 } | |
584 } | |
585 return $html; | |
586 } | |
587 | |
588 | |
589 function menu1( $pid = 0 ) { | |
590 global $cms; | |
591 | |
592 $html = ""; | |
593 | |
594 $q = "SELECT * FROM menu WHERE pid={$pid} ORDER BY sort"; | |
595 // Child Items | |
596 if ( $res2 = mysqli_query( $cms["base"], $q ) ) { | |
597 while ( $item = mysqli_fetch_assoc( $res2 ) ) { | |
598 | |
599 // Совместимость с модулем блоков | |
600 $q_blocks = "SELECT * FROM blocks_pages WHERE id={$item['id']}"; | |
601 $page = NULL; | |
602 if ( $res_b = mysqli_query( $cms["base"], $q_blocks ) ) { | |
603 $page = mysqli_fetch_assoc( $res_b ); | |
604 } | |
605 | |
606 // Если отработал модуль блоков, то не искать страницы | |
607 $q_pages = "SELECT * FROM pages WHERE id={$item['id']}"; | |
608 if ( ! $page && $res_p = mysqli_query( $cms["base"], $q_pages ) ) { | |
609 $page = mysqli_fetch_assoc( $res_p ); | |
610 } | |
611 | |
612 if ( $item["id"] !== "0" ) { | |
613 $item["url"] = $cms["base_path"] . $page["url"]; | |
614 if ( empty( $item["title"] ) ) { | |
615 if ( empty( $page["title"] ) ) { | |
616 $item["title"] = __( "deteled_page" ); | |
617 } else { | |
618 $item["title"] = $page["title"]; | |
619 } | |
620 } | |
621 } | |
622 | |
623 if ( isset( $cms["page"]["url"] ) && $item["url"] === $cms["base_path"] . $cms["page"]["url"] && !( $item["id"] === "0" && empty( $item['url'] ) ) ) { | |
624 $class = "active"; | |
625 } else { | |
626 $class = ""; | |
627 } | |
628 if ( $item["target_blank"] ) { | |
629 $target_blank = " target=_blank"; | |
630 } else { | |
631 $target_blank = ""; | |
632 } | |
633 if ( $item["tag_title"] ) { | |
634 $e_tag_title = htmlspecialchars( $item["tag_title"] ); | |
635 $tag_title = " title=\"{$e_tag_title}\""; | |
636 } else { | |
637 $tag_title = ""; | |
638 } | |
639 | |
640 // submenu | |
641 $sub = menu1( $item["mid"] ); | |
642 if ( ! empty( $sub ) ) { | |
643 $class .= " has-sub-menu"; | |
644 $has_submenu = true; | |
645 } else { | |
646 $has_submenu = false; | |
647 } | |
648 if ( ! empty( $class ) || ! empty( $item["class"] ) ) { | |
649 $class = trim( "{$class} {$item['class']}" ); | |
650 } | |
651 | |
652 // Формирование ссылки или span | |
653 if ( $item["id"] === "0" && empty( $item['url'] ) ) { | |
654 $link = "<a{$tag_title}>{$item['title']}</a>"; | |
655 } elseif ( $item["id"] !== "0" && isset( $page["published"] ) && $page["published"] === "0" ) { | |
656 // снята с публикации | |
657 $link = "<a{$tag_title}>{$item['title']}</a>"; | |
658 $class = trim( "{$class} unpublished" ); | |
659 } else { | |
660 $link = "<a href='{$item['url']}'{$target_blank}{$tag_title}>{$item['title']}</a>"; | |
661 } | |
662 | |
663 | |
664 // Для хука | |
665 $cms["menu.mod.php"]["item_link"] = array( | |
666 "link" => $link, | |
667 "has_submenu" => $has_submenu, | |
668 ); | |
669 do_hook( "menu_item_link" ); | |
670 | |
671 | |
672 if ( empty( $sub ) && $item["id"] !== "0" && isset( $page["published"] ) && $page["published"] === "0" ) { | |
673 // Если нет дочерних и страница снята с публикации, то не добавлять | |
674 $item_html = ""; | |
675 } else { | |
676 if ( ! empty( $class ) ) { | |
677 $tag_class = " class='{$class}'"; | |
678 } else { | |
679 $tag_class = ""; | |
680 } | |
681 $item_html = "<li{$tag_class}>{$cms["menu.mod.php"]["item_link"]["link"]}{$sub}</li>"; | |
682 } | |
683 | |
684 | |
685 // Для хука | |
686 $cms["menu.mod.php"]["item"] = array( | |
687 "html" => $item_html, | |
688 "has_submenu" => $has_submenu, | |
689 ); | |
690 do_hook( "menu_item" ); | |
691 | |
692 | |
693 $html .= $cms["menu.mod.php"]["item"]["html"]; | |
694 } | |
695 } | |
696 | |
697 $q = "SELECT * FROM menu WHERE mid={$pid}"; | |
698 // If exists childs items | |
699 if ( ! empty( $html ) and $res = mysqli_query( $cms["base"], $q ) and $menu = mysqli_fetch_assoc( $res ) ) { | |
700 if ( ! empty( $menu["class"] ) && $menu["pid"] == 0 ) { | |
701 $class = " class='{$menu['class']}'"; | |
702 } elseif ( $menu["pid"] != 0 ) { | |
703 $class = " class='sub-menu'"; | |
704 } else { | |
705 $class = ""; | |
706 } | |
707 $html = "<ul{$class}>{$html}</ul>"; | |
708 } | |
709 | |
710 return $html; | |
711 } | |
712 | |
713 | |
714 // Новое меню | |
715 function dyn_menu( $area ) { | |
716 global $cms; | |
717 | |
718 if ( empty( $cms["base"] ) ) { return ""; } // fix php 8.0 | |
719 //file_put_contents( __DIR__ . "/menu_export.php", "<?php\n" ); | |
720 $cms["menu"] = array(); | |
721 $area = mysqli_real_escape_string( $cms["base"], $area ); | |
722 $q = "SELECT * FROM menu WHERE pid=0 AND area='{$area}' ORDER BY sort"; | |
723 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
724 while ( $menu = mysqli_fetch_assoc( $res ) ) { | |
725 $cms["menu"][ $menu["mid"] ] = $menu; | |
726 menu_get_items( $menu["mid"], $cms["menu"][ $menu["mid"] ] ); | |
727 } | |
728 } | |
729 do_hook( "menu" ); | |
730 | |
731 //file_put_contents( __DIR__ . "/menu_export.php", "\$cms['menu'] = " . var_export( $cms["menu"], true ) . ";\n", FILE_APPEND ); | |
732 } | |
733 | |
734 | |
735 function menu_get_items( $pid, &$items ) { | |
736 global $cms; | |
737 | |
738 $items["items"] = array(); | |
739 $q = "SELECT * FROM menu WHERE pid={$pid} ORDER BY sort"; | |
740 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
741 while ( $item = mysqli_fetch_assoc( $res ) ) { | |
742 menu_get_items( $item["mid"], $item ); | |
743 $items["items"][] = $item; | |
744 } | |
745 } | |
746 //file_put_contents( __DIR__ . "/menu_export.php", "\$a = " . var_export( $items, true ) . ";\n", FILE_APPEND ); | |
747 | |
748 } | |
749 |