0
|
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 }
|