WebOrbiton
v2.0.0.0

Publisium

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