Mercurial
comparison .cms/mod/pages.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"]["pages.mod.php"] = array( | |
4 "name" => "pages_module_name", | |
5 "description" => "pages_module_description", | |
6 "files" => array( | |
7 ".cms/mod/pages.mod.php", | |
8 ".cms/js/pages.js", | |
9 ".cms/css/pages.css", | |
10 ".cms/lang/ru_RU.UTF-8/pages.mod.php", | |
11 ".cms/lang/en_US.UTF-8/pages.mod.php", | |
12 ".cms/lang/uk_UA.UTF-8/pages.mod.php", | |
13 ), | |
14 ); | |
15 | |
16 // Return if module disabled | |
17 if ( ! empty( $cms["config"]["pages.mod.php"]["disabled"] ) ) { | |
18 | |
19 return; | |
20 | |
21 } else { | |
22 | |
23 if ( is_admin() ) { | |
24 if ( empty( $_COOKIE["pages_pager"] ) ) { | |
25 if ( PHP_VERSION_ID < 70300 ) { | |
26 setcookie( "pages_pager", 100 ); | |
27 } else { | |
28 setcookie( "pages_pager", 100, array( "SameSite" => "Lax" ) ); | |
29 } | |
30 } | |
31 | |
32 hook_add_fn( "create_tables", "cms_pages_create_tables" ); | |
33 hook_add_fn( "admin", "cms_pages_admin" ); | |
34 hook_add_fn( "admin_header", "cms_pages_admin_header" ); | |
35 hook_add_fn( "api", "cms_pages_api" ); | |
36 hook_add_fn( "mod_menu_item", "cms_pages_menu_item" ); | |
37 } | |
38 hook_add_fn( "query", "cms_pages_query" ); | |
39 hook_add_fn( "menu", "cms_pages_menu" ); | |
40 | |
41 } | |
42 | |
43 function cms_pages_menu_item() { | |
44 global $cms; | |
45 if ( empty( $cms["menu.mod.php"]["item"]["found"] ) ) { | |
46 $q = "SELECT id, title, url FROM pages WHERE id={$cms["menu.mod.php"]["item"]['id']}"; | |
47 if ( $res_page = mysqli_query( $cms["base"], $q ) ) { | |
48 if ( $page = mysqli_fetch_assoc( $res_page ) ) { | |
49 $cms["menu.mod.php"]["item"]["link_title"] = $page["title"]; | |
50 $cms["menu.mod.php"]["item"]["select_title"] = $page["title"]; | |
51 $cms["menu.mod.php"]["item"]["url"] = $page["url"]; | |
52 $cms["menu.mod.php"]["item"]["found"] = true; | |
53 } else { | |
54 $cms["menu.mod.php"]["item"]["link_title"] = __( "deleted_page" ); | |
55 $cms["menu.mod.php"]["item"]["select_title"] = __( "deleted_page" ); | |
56 $cms["menu.mod.php"]["item"]["found"] = false; | |
57 } | |
58 } | |
59 } | |
60 } | |
61 | |
62 function cms_pages_admin_header() { | |
63 global $cms; | |
64 $hide = true; | |
65 foreach ( $cms["config"]["pages.mod.php"]["menu"] as $menu ) { | |
66 $hide = $hide && ( ! empty( $menu["hide"] ) || ! empty( $cms["config"]["admin_sections"][ $menu["section"] ]["hide"] ) ); | |
67 } | |
68 if ( ! $hide ) { | |
69 echo "<link rel=stylesheet href='{$cms['base_path']}css/pages.css'>"; | |
70 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/lib/codemirror.css'>"; | |
71 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.css'>"; | |
72 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.css'>"; | |
73 echo "<script src='{$cms['base_path']}lib/codemirror/lib/codemirror.js'></script>"; | |
74 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.js'></script>"; | |
75 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/xml-hint.js'></script>"; | |
76 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/html-hint.js'></script>"; | |
77 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/javascript-hint.js'></script>"; | |
78 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/anyword-hint.js'></script>"; | |
79 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/css-hint.js'></script>"; | |
80 echo "<script src='{$cms['base_path']}lib/codemirror/addon/selection/active-line.js'></script>"; | |
81 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/search.js'></script>"; | |
82 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/searchcursor.js'></script>"; | |
83 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/jump-to-line.js'></script>"; | |
84 echo "<script src='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.js'></script>"; | |
85 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchbrackets.js'></script>"; | |
86 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchtags.js'></script>"; | |
87 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closebrackets.js'></script>"; | |
88 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closetag.js'></script>"; | |
89 #region folding | |
90 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.css'>"; | |
91 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldcode.js'></script>"; | |
92 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.js'></script>"; | |
93 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/brace-fold.js'></script>"; | |
94 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/xml-fold.js'></script>"; | |
95 //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/indent-fold.js'></script>"; | |
96 //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/markdown-fold.js'></script>"; | |
97 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/comment-fold.js'></script>"; | |
98 #endregion | |
99 echo "<script src='{$cms['base_path']}lib/codemirror/mode/htmlmixed/htmlmixed.js'></script>"; | |
100 echo "<script src='{$cms['base_path']}lib/codemirror/mode/xml/xml.js'></script>"; | |
101 echo "<script src='{$cms['base_path']}lib/codemirror/mode/javascript/javascript.js'></script>"; | |
102 echo "<script src='{$cms['base_path']}lib/codemirror/mode/css/css.js'></script>"; | |
103 echo "<script src='{$cms['base_path']}lib/codemirror/mode/clike/clike.js'></script>"; | |
104 echo "<script src='{$cms['base_path']}lib/codemirror/mode/php/php.js'></script>"; | |
105 echo "<script src='{$cms['base_path']}js/pages.js'></script>"; | |
106 } | |
107 } | |
108 | |
109 | |
110 function cms_pages_api() { | |
111 global $cms; | |
112 | |
113 if ( ! empty( $_POST["fn"] ) ) { | |
114 | |
115 switch ( $_POST["fn"] ) { | |
116 | |
117 case "create_page": | |
118 | |
119 if ( empty( $cms["base"] ) ) { | |
120 echo( json_encode( array( | |
121 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", | |
122 ) ) ); | |
123 return; | |
124 } | |
125 | |
126 // Read template settings | |
127 cms_template_load_settings(); | |
128 | |
129 $tpl = "page"; | |
130 | |
131 // Default text for new page from template | |
132 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] ) ) { | |
133 $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] ); | |
134 } else { | |
135 $text = ""; | |
136 } | |
137 | |
138 $modified = number_format( microtime( true ), 6, ".", "" ); | |
139 //$modified = 0; // Это позволит исключить новые страницы из RSS, но сортировка страниц в админке по этому полю | |
140 $created = date( "Y-m-d H:i:s", $modified ); | |
141 | |
142 $q = "INSERT INTO pages SET created='{$created}', modified='{$modified}', tpl='{$tpl}', text='{$text}'"; | |
143 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
144 $id = mysqli_insert_id( $cms["base"] ); | |
145 } else { | |
146 echo( json_encode( array( | |
147 "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ), | |
148 "info_class" => "info-error", | |
149 "info_time" => 5000, | |
150 ) ) ); | |
151 return; | |
152 } | |
153 | |
154 // Create title, url and update in database | |
155 $title = __( "page_default_title" ); | |
156 $url = "{$id}"; | |
157 | |
158 // Если страница одна, то сделать ее главной | |
159 $q = "SELECT COUNT(*) FROM pages"; | |
160 $res = mysqli_query( $cms["base"], $q ); | |
161 $row = mysqli_fetch_assoc( $res ); | |
162 $count = $row["COUNT(*)"]; | |
163 if ( $count == 1 ) { | |
164 $url = ""; | |
165 $title = __( "home_page" ); | |
166 } | |
167 | |
168 $q = "UPDATE pages SET title='{$title}', url='{$url}' WHERE id={$id}"; | |
169 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
170 $_POST["where"] = "id={$id}"; | |
171 $r = cms_pages_get_pages_list(); | |
172 $r = array_merge( $r, | |
173 array( | |
174 "info_text" => __( "page_created" ), | |
175 "info_class" => "info-success", | |
176 "info_time" => 5000, | |
177 ) | |
178 ); | |
179 echo( json_encode( $r ) ); | |
180 return; | |
181 } else { | |
182 echo( json_encode( array( | |
183 "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ), | |
184 "info_class" => "info-error", | |
185 "info_time" => 5000, | |
186 ) ) ); | |
187 return; | |
188 } | |
189 break; | |
190 | |
191 case "save_prop": | |
192 | |
193 $_POST["url"] = trim( $_POST["url"] ); | |
194 if ( substr( $_POST["url"], 0, 1 ) === "/" ) { | |
195 $_POST["url"] = substr( $_POST["url"], 1 ); | |
196 } | |
197 | |
198 // Read template settings | |
199 cms_template_load_settings(); | |
200 | |
201 $id = (int) $_POST["id"]; | |
202 $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] ); | |
203 $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] ); | |
204 $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] ); | |
205 $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] ); | |
206 | |
207 // get page text | |
208 $q = "SELECT `text` FROM `pages` WHERE `id`={$id}"; | |
209 $r = mysqli_query( $cms["base"], $q ); | |
210 $row = mysqli_fetch_assoc( $r ); | |
211 $text = $row["text"]; | |
212 | |
213 $update_text = ""; | |
214 // Default text for old_template | |
215 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) { | |
216 $text2 = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ]; | |
217 } else { | |
218 $text2 = ""; | |
219 } | |
220 | |
221 // Change template text | |
222 if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) { | |
223 // Default text for template | |
224 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) { | |
225 $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ); | |
226 $update_text = ", `text`='{$text}'"; | |
227 } | |
228 } | |
229 | |
230 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); | |
231 | |
232 // Check dupl | |
233 if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) { | |
234 if ( $cnt = mysqli_fetch_assoc( $r ) ) { | |
235 if ( $cnt["COUNT(*)"] > 0 ) { | |
236 $_POST["url"] = cms_uid(); | |
237 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); | |
238 } | |
239 } | |
240 } | |
241 | |
242 if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; } | |
243 if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; } | |
244 $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" ); | |
245 $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] ); | |
246 $modified = str_replace( ",", ".", microtime( true ) ); | |
247 $q = "UPDATE `pages` SET | |
248 `title`='{$title}', | |
249 `seo_title`='{$seo_title}', | |
250 `description`='{$description}', | |
251 `tags`='{$tags}', | |
252 `created`='{$created}', | |
253 `modified`='{$modified}', | |
254 `tpl`='{$tpl}', | |
255 `url`='{$esc_url}' | |
256 {$update_text} | |
257 WHERE id={$id}"; | |
258 | |
259 // clear cache before change url | |
260 if ( function_exists( "cms_clear_cache" ) ) { | |
261 cms_clear_cache(); | |
262 } | |
263 if ( $r = mysqli_query( $cms["base"], $q ) ) { | |
264 if ( strtotime( $created ) > time() ) { | |
265 $planned = true; | |
266 } else { | |
267 $planned = false; | |
268 } | |
269 $time = strtotime( $created ); | |
270 $created = date( "d.m.Y", $time )."<br>".date( "H:i", $time ); | |
271 | |
272 $r = array( | |
273 "info_text" => __( "updated" ), | |
274 "info_class" => "info-success", | |
275 "info_time" => 1000, | |
276 "title" => htmlspecialchars( $_POST["title"] ), | |
277 "url" => $_POST["url"], | |
278 "base_path" => $cms["base_path"], | |
279 "created" => $created, | |
280 "planned" => $planned, | |
281 "ok" => "true", | |
282 ); | |
283 if ( function_exists( "cms_sitemap_update" ) ) { | |
284 cms_sitemap_update(); | |
285 } | |
286 if ( function_exists( "cms_rss_update" ) ) { | |
287 cms_rss_update(); | |
288 } | |
289 | |
290 // Если страница задействована в меню, то нужно сообщить, | |
291 // что требуется перезагрузить страницу меню | |
292 $q = "SELECT * FROM `menu` WHERE `id`={$id}"; | |
293 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { | |
294 $r["update_menu"] = "true"; | |
295 } else { | |
296 $r["update_menu"] = "false"; | |
297 } | |
298 | |
299 echo( json_encode( $r ) ); | |
300 return; | |
301 } | |
302 break; | |
303 | |
304 case "save_page": | |
305 | |
306 $_POST["url"] = trim( $_POST["url"] ); | |
307 if ( substr( $_POST["url"], 0, 1 ) === "/" && strlen( $_POST["url"] ) > 1 ) { | |
308 $_POST["url"] = substr( $_POST["url"], 1 ); | |
309 } | |
310 | |
311 // Read template settings | |
312 cms_template_load_settings(); | |
313 | |
314 // hook for save page | |
315 do_hook( "save_page" ); | |
316 | |
317 $id = (int) $_POST["id"]; | |
318 $old_modified = mysqli_real_escape_string( $cms["base"], $_POST["modified"] ); | |
319 $modified = number_format( microtime( true ), 6, ".", "" ); | |
320 $text = mysqli_real_escape_string( $cms["base"], $_POST["text"] ); | |
321 | |
322 // Default text for old_template | |
323 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) { | |
324 $text2 = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ); | |
325 } else { | |
326 $text2 = ""; | |
327 } | |
328 | |
329 // Change template text | |
330 $new_text = ""; | |
331 if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) { | |
332 // Default text for template | |
333 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) { | |
334 $new_text = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ]; | |
335 $text = mysqli_real_escape_string( $cms["base"], $new_text ); | |
336 } | |
337 } | |
338 | |
339 | |
340 $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] ); | |
341 $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] ); | |
342 $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] ); | |
343 $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] ); | |
344 | |
345 | |
346 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); | |
347 | |
348 // Check dupl | |
349 if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) { | |
350 if ( $cnt = mysqli_fetch_assoc( $r ) ) { | |
351 if ( $cnt["COUNT(*)"] > 0 ) { | |
352 $_POST["url"] = cms_uid(); | |
353 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); | |
354 } | |
355 } | |
356 } | |
357 | |
358 if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; } | |
359 if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; } | |
360 $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" ); | |
361 $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] ); | |
362 | |
363 $q = "UPDATE pages SET | |
364 text='{$text}', | |
365 modified={$modified}, | |
366 title='{$title}', | |
367 seo_title='{$seo_title}', | |
368 description='{$description}', | |
369 tags='{$tags}', | |
370 created='{$created}', | |
371 tpl='{$tpl}', | |
372 url='{$esc_url}' | |
373 WHERE id={$id} AND modified={$old_modified}"; | |
374 | |
375 // clear cache before change url | |
376 if ( function_exists( "cms_clear_cache" ) ) { | |
377 cms_clear_cache(); | |
378 } | |
379 | |
380 if ( mysqli_query( $cms["base"], $q ) ) { | |
381 | |
382 if ( ! mysqli_affected_rows( $cms["base"] ) ) { | |
383 echo( json_encode( array( | |
384 "ok" => "false", | |
385 "info_text" => __( "page_changed" ), | |
386 "info_class" => "info-error", | |
387 "info_time" => 5000, | |
388 ) ) ); | |
389 return; | |
390 } | |
391 | |
392 // update sitemap and rss | |
393 if ( function_exists( "cms_sitemap_update" ) ) { | |
394 cms_sitemap_update(); | |
395 } | |
396 if ( function_exists( "cms_rss_update" ) ) { | |
397 cms_rss_update(); | |
398 } | |
399 | |
400 if ( strtotime( $created ) > time() ) { | |
401 $planned = true; | |
402 } else { | |
403 $planned = false; | |
404 } | |
405 | |
406 $r = array( | |
407 "ok" => "true", | |
408 "info_text" => __( "saved" ), | |
409 "info_class" => "info-success", | |
410 "info_time" => 5000, | |
411 "modified" => $modified, | |
412 "planned" => $planned, | |
413 "title" => htmlspecialchars( $_POST["title"] ), | |
414 "url" => $_POST["url"], | |
415 "base_path" => $cms["base_path"], | |
416 "new_text" => $new_text, | |
417 ); | |
418 | |
419 // Если страница задействована в меню, то нужно сообщить, | |
420 // что требуется перезагрузить страницу меню | |
421 $q = "SELECT * FROM `menu` WHERE `id`={$id}"; | |
422 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { | |
423 $r["update_menu"] = "true"; | |
424 } else { | |
425 $r["update_menu"] = "false"; | |
426 } | |
427 | |
428 echo( json_encode( $r ) ); | |
429 return; | |
430 } else { | |
431 echo( json_encode( array( | |
432 "ok" => "false", | |
433 "info_text" => mysqli_error( $cms["base"] ), | |
434 "info_class" => "info-error", | |
435 "info_time" => 5000, | |
436 ) ) ); | |
437 return; | |
438 } | |
439 break; | |
440 | |
441 case "page_pin": | |
442 $id = (int) $_POST['id']; | |
443 $pin = (int) $_POST['pin']; | |
444 $q = "UPDATE `pages` SET `pin`={$pin} WHERE `id`={$id}"; | |
445 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
446 echo( json_encode( array( | |
447 "ok" => "true", | |
448 ) ) ); | |
449 return; | |
450 } | |
451 break; | |
452 | |
453 case "page_publish": | |
454 $id = (int) $_POST['id']; | |
455 $published = (int) $_POST['published']; | |
456 $q = "UPDATE `pages` SET `published`={$published} WHERE `id`={$id}"; | |
457 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
458 echo( json_encode( array( | |
459 "ok" => "true", | |
460 ) ) ); | |
461 return; | |
462 } | |
463 break; | |
464 | |
465 case "get_page": | |
466 if ( $id = (int) $_POST['id'] and $res = mysqli_query( $cms["base"], "SELECT * FROM `pages` WHERE `id`={$id}" ) ) { | |
467 if ( $page = mysqli_fetch_assoc( $res ) ) { | |
468 | |
469 // date and time | |
470 $date = date( "Y-m-d", strtotime( $page["created"] ) ); | |
471 $time = date( "H:i", strtotime( $page["created"] ) ); | |
472 | |
473 // template | |
474 $templates_list = array(); | |
475 $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php"; | |
476 foreach ( glob( $expr ) as $tpl ) { | |
477 $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl ); | |
478 if ( $name !== "html" && strpos( $name, "." ) === false ) { | |
479 array_push( $templates_list, $name ); | |
480 } | |
481 } | |
482 | |
483 cms_template_load_settings(); | |
484 $current_template = $cms["config"]["template.mod.php"]["template"]; | |
485 | |
486 $template_options = ""; | |
487 foreach( $templates_list as $tpl ) { | |
488 if ( $tpl !== $page['tpl'] ) { | |
489 $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>"; | |
490 } | |
491 } | |
492 // Добавляем текущий подшаблон страницы в список если его там нет. | |
493 // Такое может быть если переключен главный шаблон. | |
494 if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) { | |
495 $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>"; | |
496 } | |
497 | |
498 | |
499 // files | |
500 $farr = array(); | |
501 foreach ( glob( "{$cms['site_dir']}/uploads/{$page['id']}/*", GLOB_NOSORT ) as $path ) { | |
502 if ( is_file( $path ) ) { | |
503 $farr[] = array( "path" => $path, "sort" => filemtime( $path ) ); | |
504 } | |
505 } | |
506 cms_asort( $farr ); | |
507 | |
508 $flist = ""; | |
509 foreach ( $farr as $f ) { | |
510 // cut path | |
511 $path_name = str_replace( $_SERVER["DOCUMENT_ROOT"], "", $f["path"] ); | |
512 //$rel_path_name = str_replace( $cms['site_dir'], "$", $f["path"] ); | |
513 $name = preg_replace( "/.*\//u", "", $path_name ); | |
514 $ext = strtolower( preg_replace( "/.*\./u", ".", $path_name ) ); // .jpg | |
515 // icon file | |
516 if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) { | |
517 $icon = "{$cms['base_path']}img/icon{$ext}.svg"; | |
518 } else { | |
519 $icon = "{$cms['base_path']}img/icon.default.svg"; | |
520 } | |
521 // no need icon for image | |
522 switch ( $ext ) { | |
523 case ".webp": | |
524 case ".tiff": | |
525 case ".jpeg": | |
526 case ".jpg": | |
527 case ".png": | |
528 case ".svg": | |
529 case ".gif": | |
530 case ".bmp": | |
531 case ".ico": | |
532 $size = getimagesize( $f["path"] ); | |
533 if ( ! empty( $size[3] ) ) { | |
534 $size = $size[3]; | |
535 } else { | |
536 $size = ""; | |
537 } | |
538 // $upd = time(); | |
539 // ?upd={$upd} | |
540 $flist = "<div class=file-block><div class=media-name>{$name}</div><img src='{$path_name}' data-src='{$path_name}' {$size}><input type=checkbox><div class=ext>{$ext}</div></div>{$flist}"; | |
541 break; | |
542 | |
543 default: | |
544 $flist = "<div class=file-block><div class=media-name>{$name}</div><img src='{$icon}' data-src='{$path_name}'><input type=checkbox><div class=ext>{$ext}</div></div>{$flist}"; | |
545 break; | |
546 } | |
547 } | |
548 echo( json_encode( array( | |
549 "result" => "ok", | |
550 "page" => $page, | |
551 "base_path" => $cms["base_path"], | |
552 "flist" => $flist, | |
553 "date" => $date, | |
554 "time" => $time, | |
555 "options" => $template_options, | |
556 "option" => $page['tpl'], | |
557 "option_tr" => __( $page['tpl'], $current_template ), | |
558 ) ) ); | |
559 return; | |
560 } | |
561 } | |
562 break; | |
563 | |
564 case "del_files": | |
565 foreach ( $_POST["flist"] as $path_name ) { | |
566 $f = "{$_SERVER["DOCUMENT_ROOT"]}{$path_name}"; | |
567 if ( is_file( $f ) ) { | |
568 unlink( $f ); | |
569 } | |
570 } | |
571 $dir = dirname( $f ); | |
572 if ( is_dir_and_empty( $dir ) ) { | |
573 rmdir( $dir ); | |
574 } | |
575 echo( json_encode( array( | |
576 "info_text" => __( "files_deleted" ), | |
577 "info_class" => "info-success", | |
578 "info_time" => 5000, | |
579 ) ) ); | |
580 return; | |
581 break; | |
582 | |
583 case "get_pages_list": | |
584 echo( json_encode( cms_pages_get_pages_list() ) ); | |
585 return; | |
586 break; | |
587 | |
588 case "del_pages": | |
589 // Clear cache | |
590 if ( function_exists( "cms_clear_cache" ) ) { | |
591 cms_clear_cache(); | |
592 } | |
593 // Создание корзины | |
594 $trash = $cms["site_dir"] . "/uploads/.trash"; | |
595 if ( ! is_dir( $trash ) ) { | |
596 mkdir( $trash ); | |
597 } | |
598 foreach( $_POST["ids"] as $id ) { | |
599 if ( $id = (int) $id ) { | |
600 // Вытаскивание и сохранение страницы | |
601 $q = "SELECT * FROM pages WHERE `id`={$id}"; | |
602 $res = mysqli_query( $cms["base"], $q ); | |
603 $p = mysqli_fetch_assoc( $res ); | |
604 file_put_contents( "{$trash}/{$id}.txt", "url {$p['url']}\nid {$p['id']}\npin {$p['pin']}\npublished {$p['published']}\ncreated {$p['created']}\nmodified {$p['modified']}\ntpl {$p['tpl']}\ntitle {$p['title']}\nseo_title {$p['seo_title']}\ndescription {$p['description']}\ntags {$p['tags']}\ntext\n{$p['text']}\n" ); | |
605 | |
606 // Delete page from base | |
607 mysqli_query( $cms["base"], "DELETE FROM `pages` WHERE `id`={$id}" ); | |
608 | |
609 // Перемещение файлов страницы | |
610 $files_dir = "{$cms['site_dir']}/uploads/{$id}"; | |
611 if ( $files_dir ) { | |
612 rename( $files_dir, "{$trash}/{$id}" ); | |
613 } | |
614 // Delete page files | |
615 /* | |
616 foreach ( glob( "{$cms['site_dir']}/uploads/{$id}/*", GLOB_NOSORT ) as $f ) { | |
617 if ( is_file( $f ) ) { | |
618 unlink( $f ); | |
619 } | |
620 } | |
621 | |
622 if ( isset( $f ) ) { | |
623 $dir = dirname( $f ); | |
624 if ( is_dir_and_empty( $dir ) ) { | |
625 rmdir( $dir ); | |
626 } | |
627 } | |
628 */ | |
629 | |
630 } | |
631 } | |
632 | |
633 // update sitemap and rss | |
634 if ( function_exists( "cms_sitemap_update" ) ) { | |
635 cms_sitemap_update(); | |
636 } | |
637 if ( function_exists( "cms_rss_update" ) ) { | |
638 cms_rss_update(); | |
639 } | |
640 | |
641 // Если страницы задействованы в меню, то нужно сообщить, | |
642 // что требуется перезагрузить страницу меню | |
643 $q = "SELECT * FROM `menu` WHERE `id` IN ( " . implode( ",", $_POST["ids"] ) . " )"; | |
644 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { | |
645 $update_menu = "true"; | |
646 } else { | |
647 $update_menu = "false"; | |
648 } | |
649 | |
650 echo( json_encode( array( | |
651 "info_text" => __( "pages_deleted" ), | |
652 "info_class" => "info-success", | |
653 "info_time" => 5000, | |
654 "update_menu" => $update_menu, | |
655 ) ) ); | |
656 return; | |
657 break; | |
658 | |
659 case "upload_files": | |
660 $id = (int) $_POST["id"]; | |
661 $path = "{$cms['base_path']}uploads/{$id}"; | |
662 $dir = $_SERVER["DOCUMENT_ROOT"] . $path; | |
663 // create dir if not exists | |
664 if ( ! is_dir( $dir ) && ! mkdir( $dir, 0777, true ) ) { | |
665 echo( json_encode( array( | |
666 "info_text" => __( "error_create_folder" ) . " " . $dir, | |
667 "info_class" => "info-error", | |
668 "info_time" => 5000, | |
669 ) ) ); | |
670 return; | |
671 } | |
672 $flist = ""; | |
673 $success = true; | |
674 foreach ( $_FILES["myfile"]["name"] as $n => $name ) { | |
675 if ( $_FILES["myfile"]["error"][$n] ) { | |
676 $success = false; | |
677 $text = __( "error_upload_file" ) . " \"{$name}\""; | |
678 break; | |
679 } | |
680 // Транслит | |
681 $ext = strtolower( preg_replace( "/.*\./u", ".", $name ) ); | |
682 $name = substr( $name, 0, strlen( $name ) - strlen( $ext ) ); | |
683 $name = strtolower( cms_translit_file( $name ) ); | |
684 $name = "{$name}{$ext}"; | |
685 // Перемещение с заменой. Проверка на одинаковость и предупреждение об этом сделано на js | |
686 if ( ! move_uploaded_file( $_FILES["myfile"]["tmp_name"][$n], "{$dir}/{$name}" ) ) { | |
687 $success = false; | |
688 $text = __( "file_move_error" ) . " \"{$dir}/{$name}\""; | |
689 break; | |
690 } | |
691 if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) { | |
692 $icon = "{$cms['base_path']}img/icon{$ext}.svg"; | |
693 } else { | |
694 $icon = "{$cms['base_path']}img/icon.default.svg"; | |
695 } | |
696 if ( $success ) { | |
697 switch ( $ext ) { | |
698 case ".webp": | |
699 case ".tiff": | |
700 case ".jpeg": | |
701 case ".jpg": | |
702 case ".png": | |
703 case ".svg": | |
704 case ".gif": | |
705 case ".bmp": | |
706 case ".ico": | |
707 $size = getimagesize( "{$dir}/{$name}" ); | |
708 if ( ! empty( $size[3] ) ) { | |
709 $size = $size[3]; | |
710 } else { | |
711 $size = ""; | |
712 } | |
713 $upd = time(); | |
714 $flist .= "<div class='file-block'><div class=media-name>{$name}</div><img src='{$path}/{$name}?upd={$upd}' data-src='{$path}/{$name}' {$size}><input type=checkbox><div class=ext>{$ext}</div></div>"; | |
715 break; | |
716 | |
717 default: | |
718 $flist .= "<div class='file-block'><div class=media-name>{$name}</div><img src='{$icon}' data-src='{$path}/{$name}'><input type=checkbox><div class=ext>{$ext}</div></div>"; | |
719 break; | |
720 } | |
721 | |
722 } | |
723 } | |
724 | |
725 if ( $success ) { | |
726 $text = __( "files_uploaded" ); | |
727 echo( json_encode( array( | |
728 "info_text" => $text, | |
729 "info_class" => "info-success", | |
730 "info_time" => 5000, | |
731 "flist" => $flist, | |
732 ) ) ); | |
733 return; | |
734 } else { | |
735 echo( json_encode( array( | |
736 "info_text" => $text, | |
737 "info_class" => "info-error", | |
738 "info_time" => 5000, | |
739 ) ) ); | |
740 return; | |
741 } | |
742 break; | |
743 | |
744 case "replace_in_pages": | |
745 $table = mysqli_real_escape_string( $cms["base"], $_POST["table"] ); | |
746 $id_col = mysqli_real_escape_string( $cms["base"], $_POST["id_col"] ); | |
747 $column = mysqli_real_escape_string( $cms["base"], $_POST["column"] ); | |
748 $q = "SELECT `{$id_col}`, `{$column}` FROM `{$table}`"; | |
749 $t = trim( $_POST["search_regex"] ); | |
750 if ( ! empty( $t ) ) { | |
751 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
752 $regex = preg_replace( "/\//u", "\\/", $_POST["search_regex"] ); // Escape / for regexp | |
753 while( $page = mysqli_fetch_assoc( $res ) ) { | |
754 $new_text = preg_replace( "/{$regex}/u", $_POST["replace"], $page[$_POST["column"]] ); | |
755 $text = mysqli_real_escape_string( $cms["base"], $new_text ); | |
756 $id_val = $page[$_POST["id_col"]]; | |
757 $q = "UPDATE `{$table}` SET `{$column}`='{$text}' WHERE `{$id_col}`='{$id_val}'"; | |
758 mysqli_query( $cms["base"], $q ); | |
759 } | |
760 } | |
761 } | |
762 | |
763 echo( json_encode( array( | |
764 "info_text" => __( "replace_ok" ), | |
765 "info_class" => "info-success", | |
766 "info_time" => 5000, | |
767 ) ) ); | |
768 return; | |
769 break; | |
770 } | |
771 } | |
772 } | |
773 | |
774 // Create pages list | |
775 // $_POST["where"] = "id=123"; нужно для момента создания страницы | |
776 // $_POST["count"] = "1000"; | |
777 // $_POST["search"] = "test"; | |
778 // $_COOKIE["pages_pager"] = 10; | |
779 function cms_pages_get_pages_list() { | |
780 global $cms; | |
781 | |
782 if ( empty( $cms["base"] ) ) { | |
783 return array( | |
784 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", | |
785 ); | |
786 } | |
787 | |
788 $templates_list = array(); | |
789 $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php"; | |
790 foreach ( glob( $expr ) as $tpl ) { | |
791 $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl ); | |
792 if ( $name !== "html" && strpos( $name, "." ) === false ) { | |
793 array_push( $templates_list, $name ); | |
794 } | |
795 } | |
796 | |
797 if ( ! empty( $_POST["where"] ) ) { | |
798 $where = $_POST["where"]; | |
799 } else { | |
800 $where = "1"; | |
801 } | |
802 | |
803 if ( empty( $_COOKIE["pages_pager"] ) ) { | |
804 $pager = 100; | |
805 } else { | |
806 $pager = (int) $_COOKIE["pages_pager"]; | |
807 } | |
808 | |
809 if ( empty( $_POST["offset"] ) ) { | |
810 $_POST["offset"] = 0; | |
811 } | |
812 $offset = $_POST["offset"]; | |
813 | |
814 if ( ! empty( $_POST["count"] ) ) { | |
815 $pager = $_POST["count"]; | |
816 } | |
817 $limit = "LIMIT {$offset}, {$pager}"; | |
818 | |
819 if ( ! empty( $_POST["search"] ) ) { | |
820 | |
821 // Shift разбивает искомое на символы | |
822 if ( $_POST["Shift"] === "true" ) { | |
823 $s = preg_replace( "/\s/u", "", $_POST["search"] ); | |
824 $s = preg_split( '//u', $s, -1, PREG_SPLIT_NO_EMPTY ); | |
825 foreach( $s as $n => $ch ) { | |
826 $s[$n] = mysqli_real_escape_string( $cms["base"], $ch ); | |
827 } | |
828 $s = implode( "%", $s ); | |
829 } else { | |
830 $s = mysqli_real_escape_string( $cms["base"], $_POST["search"] ); | |
831 } | |
832 | |
833 // Ctrl ищет только по тексту | |
834 if ( $_POST["Ctrl"] === "true" ) { | |
835 $search = "( text LIKE '%{$s}%' )"; | |
836 } else { | |
837 $search = "( title LIKE '%{$s}%' OR url LIKE '%{$s}%' OR tpl LIKE '%{$s}%' OR tags LIKE '%{$s}%' )"; | |
838 } | |
839 | |
840 $q_count = "SELECT COUNT(*) FROM `pages` WHERE {$search}"; | |
841 } else { | |
842 $search = "1"; | |
843 $q_count = "SELECT COUNT(*) FROM `pages`"; | |
844 } | |
845 // count pages | |
846 if ( ! $res = mysqli_query( $cms["base"], $q_count ) ) { | |
847 return array( | |
848 "no_database" => "<span class=no-tables>" . __( "no_tables_db" ) . "</span>", | |
849 ); | |
850 } | |
851 $res = mysqli_fetch_assoc( $res ); | |
852 $count = $res["COUNT(*)"]; | |
853 | |
854 $pages = array(); | |
855 $start = microtime( true ); | |
856 $overload = false; | |
857 $q = "SELECT `id`, `published`, `pin`, `title`, `seo_title`, `description`, `created`, `url`, `tpl`, `tags`, `modified` FROM `pages` WHERE {$search} AND {$where} ORDER BY `pin` DESC, FROM_UNIXTIME( `modified` ) DESC {$limit}"; | |
858 | |
859 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
860 | |
861 $tTitle = __( "title" ); | |
862 $tDescription = __( "description" ); | |
863 $tSeoTitle = __( "seo_title" ); | |
864 $tTemplate = __( "template" ); | |
865 $tPublished = __( "published" ); | |
866 $tUnPublished = __( "unpublished" ); | |
867 $tDate = __( "date" ); | |
868 $tTime = __( "time" ); | |
869 $tSave = __( "save" ); | |
870 $tProperties = __( "properties" ); | |
871 $tEdit = __( "edit" ); | |
872 $tr_pin = __( "pin" ); | |
873 | |
874 cms_template_load_settings(); | |
875 $current_template = $cms["config"]["template.mod.php"]["template"]; | |
876 | |
877 while ( $page = mysqli_fetch_assoc( $res ) ) { | |
878 | |
879 $time = strtotime( $page["created"] ); | |
880 if ( time() >= $time ) { | |
881 $date_class = "past"; | |
882 } else { | |
883 $date_class = "future"; | |
884 } | |
885 $created = date( "d.m.Y", $time ) . "<br>" . date( "H:i", $time ); | |
886 $date = date( "Y-m-d", $time ); | |
887 $time = date( "H:i", $time ); | |
888 | |
889 $template_options = ""; | |
890 foreach( $templates_list as $tpl ) { | |
891 if ( $tpl !== $page['tpl'] ) { | |
892 $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>"; | |
893 } | |
894 } | |
895 // Добавляем текущий подшаблон страницы в список если его там нет. | |
896 // Такое может быть если переключен главный шаблон. | |
897 if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) { | |
898 $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>"; | |
899 } | |
900 | |
901 if ( $page["published"] ) { | |
902 $tpub = $tPublished; | |
903 } else { | |
904 $tpub = $tUnPublished; | |
905 } | |
906 | |
907 if ( $page["url"] == "" ) { | |
908 $class = "class=home"; | |
909 } else { | |
910 $class = ""; | |
911 } | |
912 | |
913 if ( empty( $page["tpl"] ) ) { | |
914 $tpl_translated = __( "no_template" ); | |
915 } else { | |
916 $tpl_translated = __( $page['tpl'], $current_template ); | |
917 } | |
918 | |
919 $html = " | |
920 <div {$class} data-id={$page['id']} data-pin={$page['pin']} data-published={$page['published']}> | |
921 | |
922 <a class=page-name href='{$cms['base_path']}{$page["url"]}' target=_blank title='id={$page['id']}'>{$page['title']}</a> | |
923 <div class=pin title='" . $tr_pin . "'></div> | |
924 <div class=published title='{$tpub}'></div> | |
925 <div class=page-buttons> | |
926 <div class=page-edit-btn>{$tEdit}</div> | |
927 <div class=page-prop-btn>{$tProperties}</div> | |
928 <div class=page-prop-save-btn>{$tSave}</div> | |
929 </div> | |
930 <div class='page-date {$date_class}'>{$created}</div> | |
931 <input type=checkbox> | |
932 | |
933 <div class=page-prop> | |
934 | |
935 <div class='page title'>{$tTitle}:</div> | |
936 <input name=title type=text value='{$page['title']}'> | |
937 | |
938 <div class='url title'>URL:</div> | |
939 <div class=url-input> | |
940 <input name=url type=text value='{$page['url']}' placeholder='" . __( "front_url" ) . "'> | |
941 <div class=url-translit title='" . __( "url_translit" ) . "'></div> | |
942 </div> | |
943 | |
944 <div class='seo title'>{$tSeoTitle}:</div> | |
945 <input name=seo_title type=text value='{$page['seo_title']}'> | |
946 | |
947 <div class='description title'>{$tDescription}:</div> | |
948 <textarea name=description rows=3>{$page['description']}</textarea> | |
949 | |
950 <div class='template title'>{$tTemplate}:</div> | |
951 <div class=template-select-grid> | |
952 <div class=field-select data-template='{$page['tpl']}' data-old-template='{$page['tpl']}'> | |
953 <div class=value>{$tpl_translated}</div> | |
954 <div class=icon></div> | |
955 </div> | |
956 <div class=field-options> | |
957 {$template_options} | |
958 </div> | |
959 </div> | |
960 | |
961 <div class='date title'>{$tDate}:</div> | |
962 <input name=date type=date value='{$date}'> | |
963 <div class='time title'>{$tTime}:</div> | |
964 <input name=time type=time value='{$time}'> | |
965 | |
966 <div class='tags title'>" . __( "tags" ) . ":</div> | |
967 <textarea name=tags rows=3>" . htmlspecialchars( $page["tags"] ) . "</textarea> | |
968 | |
969 </div> | |
970 | |
971 </div>"; | |
972 array_push( $pages, array( "id" => (int) $page["id"], "html" => $html ) ); | |
973 if ( microtime( true ) - $start > 1 ) { | |
974 $overload = true; | |
975 break; | |
976 } | |
977 } | |
978 } | |
979 if ( isset( $_POST["search"] ) ) { | |
980 $search = trim( $_POST["search"] ); | |
981 } else { | |
982 $search = ""; | |
983 } | |
984 | |
985 return array( | |
986 "pages" => $pages, | |
987 "offset" => $_POST["offset"], | |
988 "count" => $count, | |
989 "overload" => $overload, | |
990 "search" => $search, | |
991 ); | |
992 } | |
993 | |
994 | |
995 function cms_pages_query() { | |
996 global $cms; | |
997 | |
998 // Skip SQL query if file exists | |
999 if ( is_file( $cms["cms_file"] ) ) { | |
1000 return; | |
1001 } | |
1002 | |
1003 // fix template warnings | |
1004 $cms["page"]["id"] = 0; | |
1005 $cms["page"]["tpl"] = ""; | |
1006 | |
1007 if ( empty( $cms["base"] ) ) return; // fix 500 error | |
1008 $url = mysqli_real_escape_string( $cms["base"], $cms["url"]["path"] ); | |
1009 if ( $res = mysqli_query( $cms["base"], "SELECT * FROM pages WHERE url = '{$url}' OR CONCAT( url, '/' ) = '{$url}' OR url = CONCAT( '{$url}', '/' )" ) ) { | |
1010 if ( $page = mysqli_fetch_assoc( $res ) ) { | |
1011 $cms["page"] = $page; | |
1012 if ( $cms["page"]["created"] <= date( "Y-m-d H:i:s" ) && $cms["page"]["published"] ) { | |
1013 $cms["status"] = "200"; | |
1014 } else { | |
1015 $cms["status"] = "404"; // disable write to disk but echo if admin | |
1016 } | |
1017 } | |
1018 } | |
1019 } | |
1020 | |
1021 function cms_pages_create_tables() { | |
1022 global $cms; | |
1023 | |
1024 mysqli_query( $cms["base"], " | |
1025 CREATE TABLE IF NOT EXISTS `pages` ( | |
1026 `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, | |
1027 `pin` tinyint(1) NOT NULL DEFAULT 0, | |
1028 `published` tinyint(1) NOT NULL DEFAULT 1, | |
1029 `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
1030 `modified` double NOT NULL DEFAULT 0, | |
1031 `tpl` varchar(64) DEFAULT NULL, | |
1032 `title` varchar(255) DEFAULT NULL, | |
1033 `seo_title` varchar(255) DEFAULT NULL, | |
1034 `text` longtext DEFAULT NULL, | |
1035 `url` varchar(255) DEFAULT NULL, | |
1036 `description` varchar(2048) NOT NULL DEFAULT '', | |
1037 `tags` varchar(2048) NOT NULL DEFAULT '', | |
1038 UNIQUE KEY `id` (`id`) | |
1039 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |
1040 "); | |
1041 | |
1042 } | |
1043 | |
1044 | |
1045 function cms_pages_admin() { | |
1046 global $cms; | |
1047 | |
1048 $conf = $cms["config"]["pages.mod.php"]["menu"]["pages"]; | |
1049 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
1050 | |
1051 // Read template settings | |
1052 cms_template_load_settings(); | |
1053 | |
1054 $tMaxUploadSize = __( "max_size" ) . " " . number_format( file_upload_max_size(), 0, ".", " " ) . " " . __( "bytes" ); | |
1055 | |
1056 $help_file = "{$cms['config']['template.mod.php']['template']}/instruction.{$cms['config']['locale']}.html"; | |
1057 if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) { | |
1058 $help_blanks = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "blanks" ) . "</a>"; | |
1059 } else { | |
1060 $help_blanks = ""; | |
1061 } | |
1062 | |
1063 $help_file = "man/{$cms['config']['locale']}/codemirror.html"; | |
1064 if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) { | |
1065 $help_codemirror = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "codemirror" ) . "</a>"; | |
1066 } else { | |
1067 $help_codemirror = ""; | |
1068 } | |
1069 | |
1070 $files_panel = " | |
1071 <div class=mediateka-grid> | |
1072 <div class=mediateka-files-hscroll> | |
1073 <div class=mediateka-files-grid> | |
1074 | |
1075 </div> | |
1076 </div> | |
1077 | |
1078 <div class=mediateka-buttons> | |
1079 <div class=upload-files> | |
1080 <input id=upload-btn type=file name='myfile[]' multiple class=inputfile title='{$tMaxUploadSize}'> | |
1081 <label for=upload-btn title='{$tMaxUploadSize}'>" . __( "upload" ) . "</label> | |
1082 </div> | |
1083 <div class=link-file> | |
1084 <span class=link-file-tag></span> | |
1085 <span class=link-file-copy-btn>" . __( "copy" ) . "</span> | |
1086 </div> | |
1087 <div class='del-uploaded-files disabled'>" . __( "delete" ) . "</div> | |
1088 </div> | |
1089 | |
1090 </div>"; | |
1091 | |
1092 $buttons = "<div class=save-page-button>" . __( "save" ) . "</div>"; | |
1093 $buttons .= "<div class=open-properties>" . __( "properties" ) . "</div>"; | |
1094 $buttons .= "<div class=open-mediateka>" . __( "mediateka" ) . "</div>"; | |
1095 $buttons .= "<div class=tags-helper>" . __( "tags" ) . "</div>"; | |
1096 $buttons .= "<div class=codemirror-replace>" . __( "replace" ) . "</div>"; | |
1097 $buttons .= $help_blanks; | |
1098 $buttons .= $help_codemirror; | |
1099 | |
1100 $page = " | |
1101 <div class=main-header> | |
1102 | |
1103 <div class=search-wrapper> | |
1104 <input class=page-search type=text | |
1105 placeholder='" . __( "search" ) . "' | |
1106 title='" . __( "search_with_ctrl" ) . "' | |
1107 autocomplete=off data-result-of=''> | |
1108 <div class=reset></div> | |
1109 <button class=page-search-button></button> | |
1110 </div> | |
1111 | |
1112 <div class=add-page-btn> | |
1113 <div class=x1></div> | |
1114 <div class=x2></div> | |
1115 <div class=add-page-label>" . __( "add_page_title" ) . "</div> | |
1116 </div> | |
1117 | |
1118 <div> </div> | |
1119 | |
1120 <a class=del-pages-btn title='" . __( "delete_pages" ) . "'></a> | |
1121 | |
1122 </div> | |
1123 | |
1124 <div class=main-main> | |
1125 | |
1126 <div class=pages-grid> | |
1127 </div> | |
1128 | |
1129 </div> | |
1130 | |
1131 <div class=main-footer> | |
1132 <div class=pager></div> | |
1133 <div class=counters> | |
1134 <input class=loaded value=0 autocomplete=off data-offset=0> | |
1135 <span>" . __( "of" ) . "</span> | |
1136 <span class=count>0</span> | |
1137 </div> | |
1138 </div> | |
1139 | |
1140 <div class='page-editor-bg hidden'> | |
1141 <div class='page-editor-grid editor-grid'> | |
1142 | |
1143 <div class=page-editor-header> | |
1144 <div class=close-page-button></div> | |
1145 <a data-page-title class=page-editor-title target=_blank></a> | |
1146 </div> | |
1147 | |
1148 <div class=page-editor-buttons>{$buttons}</div> | |
1149 | |
1150 <div class='page-properties hidden'> | |
1151 | |
1152 <div class='page title'>" . __( "title" ) . ":</div> | |
1153 <input name=title type=text> | |
1154 | |
1155 <div class='url title'>URL:</div> | |
1156 <div class=url-input> | |
1157 <input name=url type=text placeholder='" . __( "front_url" ) . "'> | |
1158 <div class=url-translit title='" . __( "url_translit" ) . "'></div> | |
1159 </div> | |
1160 | |
1161 <div class='seo title'>" . __( "seo_title" ) . ":</div> | |
1162 <input name=seo_title type=text> | |
1163 | |
1164 <div class='description title'>" . __( "description" ) . ":</div> | |
1165 <textarea name=description rows=3></textarea> | |
1166 | |
1167 <div class='template title'>" . __( "template" ) . ":</div> | |
1168 <div class=template-select-grid> | |
1169 <div class=field-select data-template data-old-template> | |
1170 <div class=value></div> | |
1171 <div class=icon></div> | |
1172 </div> | |
1173 <div class=field-options> | |
1174 | |
1175 </div> | |
1176 </div> | |
1177 | |
1178 <div class='date title'>" . __( "date" ) . ":</div> | |
1179 <input name=date type=date> | |
1180 <div class='time title'>" . __( "time" ) . ":</div> | |
1181 <input name=time type=time> | |
1182 | |
1183 <div class='tags title'>" . __( "tags" ) . ":</div> | |
1184 <textarea name=tags rows=3></textarea> | |
1185 | |
1186 </div> | |
1187 | |
1188 <div class='page-editor-panel hidden'> | |
1189 <div class=upload-progress></div> | |
1190 {$files_panel} | |
1191 </div> | |
1192 | |
1193 <div class=page-editor> | |
1194 <textarea data-modified class=coffee-editorpage-area name=add_editorpage></textarea> | |
1195 </div> | |
1196 | |
1197 <div class=tags> | |
1198 <div class=tags-grid> | |
1199 <div data-type=wrap data-otag='<h1>' data-ctag='</h1>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag><h1></span></div> | |
1200 <div data-type=wrap data-otag='<h2>' data-ctag='</h2>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag><h2></span></div> | |
1201 <div data-type=wrap data-otag='<p>' data-ctag='</p>' data-len=3><span>" . __( "p" ) . "</span> <span class=tag><p></span></div> | |
1202 <div data-type=wrap data-otag='<div>' data-ctag='</div>' data-len=5><span>" . __( "div" ) . "</span> <span class=tag><div></span></div> | |
1203 <div data-type=wrap-a><span>" . __( "link" ) . "</span> <span class=tag><a></span></div> | |
1204 <div data-type=wrap data-otag='<code>' data-ctag='</code>' data-len=6><span>" . __( "code" ) . "</span> <span class=tag><code></span></div> | |
1205 <div data-type=wrap data-otag='<pre><code>' data-ctag='</code></pre>' data-len=11><span>" . __( "code" ) . "</span> <span class=tag><pre><code></span></div> | |
1206 <div data-type=wrap data-otag='<span>' data-ctag='</span>' data-len=6><span>" . __( "span" ) . "</span> <span class=tag><span></span></div> | |
1207 <div data-type=wrap data-otag='<blockquote>' data-ctag='</blockquote>' data-len=12><span>" . __( "cite" ) . "</span> <span class=tag><blockquote></span></div> | |
1208 <div data-type=wrap-list data-tag=ul><span>" . __( "ul" ) . "</span> <span class=tag><ul></span></div> | |
1209 <div data-type=wrap-list data-tag=ol><span>" . __( "ol" ) . "</span> <span class=tag><ol></span></div> | |
1210 <div data-type=wrap data-otag='<li>' data-ctag='</li>' data-len=4><span>" . __( "li" ) . "</span> <span class=tag><li></span></div> | |
1211 <div data-type=wrap data-otag='<figure>\n ' data-ctag='\n <figcaption></figcaption>\n</figure>' data-ch=4 data-line=1><span>" . __( "figure" ) . "</span> <span class=tag><figure></span></div> | |
1212 <div data-type=wrap data-otag='<!-- ' data-ctag=' -->' data-len=5><span class=tag><!--</span> <span>" . __( "comment" ) . "</span> <span class=tag>--></span></div> | |
1213 <div data-type=wrap data-otag='<b>' data-ctag='</b>' data-len=3><span>" . __( "bold" ) . "</span> <span class=tag><b></span></div> | |
1214 <div data-type=wrap data-otag='<kbd>' data-ctag='</kbd>' data-len=5><span>" . __( "kbd" ) . "</span> <span class=tag><kbd></span></div> | |
1215 <div data-type=wrap data-otag='<mark>' data-ctag='</mark>' data-len=6><span>" . __( "mark" ) . "</span> <span class=tag><mark></span></div> | |
1216 </div> | |
1217 </div> | |
1218 </div> | |
1219 </div>"; | |
1220 | |
1221 // Create menu item if not exists | |
1222 if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages"] ) ) { | |
1223 $cms["config"]["pages.mod.php"]["menu"]["pages"] = array( | |
1224 "title" => "pages_module_name", | |
1225 "sort" => 10, | |
1226 "section" => "content", | |
1227 ); | |
1228 cms_save_config(); | |
1229 } | |
1230 | |
1231 $cms["admin_pages"]["pages"] = $page; | |
1232 | |
1233 } | |
1234 | |
1235 | |
1236 | |
1237 $conf = $cms["config"]["pages.mod.php"]["menu"]["pages-utils"]; | |
1238 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
1239 | |
1240 // Create menu item if not exists | |
1241 if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] ) ) { | |
1242 $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] = array( | |
1243 "title" => "pages_utils", | |
1244 "sort" => 15, | |
1245 "section" => "content", | |
1246 "hide" => true, | |
1247 ); | |
1248 cms_save_config(); | |
1249 } | |
1250 | |
1251 | |
1252 $page = " | |
1253 <div class=pages-utils-main> | |
1254 <div class=replace-util> | |
1255 <p>" . __( "replace_instruction" ) . "</p> | |
1256 <div class=replace-inputs> | |
1257 <div class=replace_table> | |
1258 <div class=title>" . __( "replace_table" ) . "</div> | |
1259 <input type=text name=table autocomplete=off value=pages> | |
1260 </div> | |
1261 <div class=stub></div> | |
1262 <div class=replace_id_col> | |
1263 <div class=title>" . __( "replace_id_col" ) . "</div> | |
1264 <input type=text name=id_col autocomplete=off value=id> | |
1265 </div> | |
1266 <div class=replace_column> | |
1267 <div class=title>" . __( "replace_column" ) . "</div> | |
1268 <input type=text name=column autocomplete=off value=text> | |
1269 </div> | |
1270 <div class=regex> | |
1271 <div class=title>" . __( "regex_title" ) . "</div> | |
1272 <input type=text name=search_regex autocomplete=off> | |
1273 </div> | |
1274 <div class=replace> | |
1275 <div class=title>" . __( "replace_title" ) . "</div> | |
1276 <input type=text name=replace autocomplete=off> | |
1277 </div> | |
1278 </div> | |
1279 <div class=replace-btn>" . __( "replace_btn" ) . "</div> | |
1280 </div> | |
1281 </div> | |
1282 "; | |
1283 | |
1284 $cms["admin_pages"]["pages-utils"] = $page; | |
1285 | |
1286 } | |
1287 } | |
1288 | |
1289 | |
1290 function cms_pages_menu() { | |
1291 global $cms; | |
1292 | |
1293 foreach( $cms["menu"] as $id => $menu ) { | |
1294 if ( is_array( $menu["items"] ) ) { | |
1295 cms_pages_menu_items( $cms["menu"][$id]["items"] ); | |
1296 } | |
1297 } | |
1298 } | |
1299 | |
1300 | |
1301 function cms_pages_menu_items( &$items ) { | |
1302 global $cms; | |
1303 | |
1304 foreach( $items as $id => $item ) { | |
1305 if ( $item["id"] ) { | |
1306 $q_pages = "SELECT * FROM pages WHERE id={$item['id']}"; | |
1307 if ( $res_p = mysqli_query( $cms["base"], $q_pages ) ) { | |
1308 if ( $page = mysqli_fetch_assoc( $res_p ) ) { | |
1309 if ( empty( $items[$id]["title"] ) ) { | |
1310 $items[$id]["title"] = $page["title"]; | |
1311 } | |
1312 $items[$id]["url"] = $page["url"]; | |
1313 } else { | |
1314 $items[$id]["title"] = __( "deteled_page" ); | |
1315 } | |
1316 } | |
1317 } | |
1318 if ( is_array( $items[$id]["items"] ) ) { | |
1319 cms_pages_menu_items( $items[$id]["items"] ); | |
1320 } | |
1321 } | |
1322 } |