WebOrbiton
v1.0.0.8

Publisium

67 lines · 2.0 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. if (!Auth::hasRoleAtLeast(Auth::ROLE_MANAGING_EDITOR)) {
  6. exit;
  7. }
  8. ​
  9. $title = trim((string) ($_POST['title'] ?? ''));
  10. $pageId = (int) ($_POST['page_id'] ?? 0) ?: null;
  11. $status = ($_POST['status'] ?? 'draft') === 'published' ? 'published' : 'draft';
  12. $showInMenu = isset($_POST['show_in_menu']) ? 1 : 0;
  13. $blocksJson = BlockEditor::sanitize((string) ($_POST['blocks_json'] ?? '{"blocks":[]}'), true);
  14. ​
  15. if ($title === '') {
  16. exit;
  17. }
  18. ​
  19. require_once __DIR__ . '/../includes/slugger.php';
  20. ​
  21. $db = Database::site();
  22. ​
  23. // Page addresses must be unique: a second page called "About" becomes about-2, and so on.
  24. $baseSlug = Slugger::make($title);
  25. $baseSlug = $baseSlug !== '' ? $baseSlug : 'page';
  26. $slugTaken = $db->prepare('SELECT COUNT(*) FROM pages WHERE slug = :slug AND id <> :id');
  27. $slug = $baseSlug;
  28. for ($slugNumber = 2; $slugNumber <= 1000; $slugNumber++) {
  29. $slugTaken->execute(['slug' => $slug, 'id' => $pageId ?? 0]);
  30. if ((int) $slugTaken->fetchColumn() === 0) {
  31. break;
  32. }
  33. $slug = $baseSlug . '-' . $slugNumber;
  34. }
  35. ​
  36. if ($pageId !== null) {
  37. $statement = $db->prepare(
  38. 'UPDATE pages SET title = :title, slug = :slug, content_blocks = :content, status = :status, show_in_menu = :show_in_menu WHERE id = :id'
  39. );
  40. $statement->execute([
  41. 'title' => $title,
  42. 'slug' => $slug,
  43. 'content' => $blocksJson,
  44. 'status' => $status,
  45. 'show_in_menu' => $showInMenu,
  46. 'id' => $pageId,
  47. ]);
  48. } else {
  49. $statement = $db->prepare(
  50. 'INSERT INTO pages (author_id, title, slug, content_blocks, status, show_in_menu) VALUES (:author_id, :title, :slug, :content, :status, :show_in_menu)'
  51. );
  52. $statement->execute([
  53. 'author_id' => $currentUser['id'],
  54. 'title' => $title,
  55. 'slug' => $slug,
  56. 'content' => $blocksJson,
  57. 'status' => $status,
  58. 'show_in_menu' => $showInMenu,
  59. ]);
  60. }
  61. ​
  62. if ($showInMenu === 1) {
  63. SiteFront::appendToCustomNav('page', $pageId ?? (int) $db->lastInsertId());
  64. }
  65. ​
  66. CleanUrls::sync();
  67. ​