v1.0.0.9
Publisium
- <?php
-
- declare(strict_types=1);
-
- if (!Auth::hasRoleAtLeast(Auth::ROLE_MANAGING_EDITOR)) {
- exit;
- }
-
- $title = trim((string) ($_POST['title'] ?? ''));
- $pageId = (int) ($_POST['page_id'] ?? 0) ?: null;
- $status = ($_POST['status'] ?? 'draft') === 'published' ? 'published' : 'draft';
- $showInMenu = isset($_POST['show_in_menu']) ? 1 : 0;
- $blocksJson = BlockEditor::sanitize((string) ($_POST['blocks_json'] ?? '{"blocks":[]}'), true);
-
- if ($title === '') {
- exit;
- }
-
- require_once __DIR__ . '/../includes/slugger.php';
-
- $db = Database::site();
-
- // Page addresses must be unique: a second page called "About" becomes about-2, and so on.
- $baseSlug = Slugger::make($title);
- $baseSlug = $baseSlug !== '' ? $baseSlug : 'page';
- $slugTaken = $db->prepare('SELECT COUNT(*) FROM pages WHERE slug = :slug AND id <> :id');
- $slug = $baseSlug;
- for ($slugNumber = 2; $slugNumber <= 1000; $slugNumber++) {
- $slugTaken->execute(['slug' => $slug, 'id' => $pageId ?? 0]);
- if ((int) $slugTaken->fetchColumn() === 0) {
- break;
- }
- $slug = $baseSlug . '-' . $slugNumber;
- }
-
- if ($pageId !== null) {
- $statement = $db->prepare(
- 'UPDATE pages SET title = :title, slug = :slug, content_blocks = :content, status = :status, show_in_menu = :show_in_menu WHERE id = :id'
- );
- $statement->execute([
- 'title' => $title,
- 'slug' => $slug,
- 'content' => $blocksJson,
- 'status' => $status,
- 'show_in_menu' => $showInMenu,
- 'id' => $pageId,
- ]);
- } else {
- $statement = $db->prepare(
- 'INSERT INTO pages (author_id, title, slug, content_blocks, status, show_in_menu) VALUES (:author_id, :title, :slug, :content, :status, :show_in_menu)'
- );
- $statement->execute([
- 'author_id' => $currentUser['id'],
- 'title' => $title,
- 'slug' => $slug,
- 'content' => $blocksJson,
- 'status' => $status,
- 'show_in_menu' => $showInMenu,
- ]);
- }
-
- if ($showInMenu === 1) {
- SiteFront::appendToCustomNav('page', $pageId ?? (int) $db->lastInsertId());
- }
-
- CleanUrls::sync();
-