diff --git a/controllers/savepage.php b/controllers/savepage.php index eb404f7..6b8e73c 100644 --- a/controllers/savepage.php +++ b/controllers/savepage.php @@ -1,26 +1,33 @@ get('id'); // fallback for errors +// ------------------------- // Check login +// ------------------------- if (empty($session->get('username'))) { $messages->error('You are not logged in'); $redirect->url('/novaconium/login'); makeitso(); } -// Check token +// ------------------------- +// Check CSRF token +// ------------------------- if ($session->get('token') != $post->get('token')) { $messages->error('Invalid Token'); $redirect->url('/novaconium/pages'); makeitso(); } +// ------------------------- // Gather POST data +// ------------------------- $id = $post->get('id'); $title = $_POST['title'] ?? ''; $heading = $_POST['heading'] ?? ''; @@ -35,9 +42,20 @@ $notes = $_POST['notes'] ?? ''; $draft = !empty($post->get('draft')) ? 1 : 0; $changefreq = $_POST['changefreq'] ?? 'monthly'; $priority = $_POST['priority'] ?? 0.0; -$tags_json = $_POST['tags_json'] ?? '[]'; +$tags_json = $_POST['tags_json'] ?? '[]'; +// ------------------------- +// Decode & sanitize tags +// ------------------------- +$tags = json_decode($tags_json, true); +if (!is_array($tags)) $tags = []; +$tags = array_map('trim', $tags); +$tags = array_filter($tags, fn($t) => $t !== ''); +$tags = array_unique($tags); + +// ------------------------- // Validate required fields +// ------------------------- if (empty($title) || empty($slug) || empty($body)) { $messages->error('Title, Slug, and Body are required.'); $redirect->url($url_error); @@ -45,8 +63,12 @@ if (empty($title) || empty($slug) || empty($body)) { } try { + $tagManager = new TagManager(); + if ($id == 'newpage') { + // ------------------------- // Create new page + // ------------------------- $query = "INSERT INTO `pages` (`title`, `heading`, `description`, `keywords`, `author`, `slug`, `path`, `intro`, `body`, `notes`, @@ -58,28 +80,13 @@ try { $draft, $changefreq, $priority ]; $db->query($query, $params); - $id = $db->lastid; // Get new page ID + $id = $db->lastid; $messages->notice('Page Created'); - $newpage = true; + } else { - $newpage = false; - } - - if (!empty($id) && !$newpage) { - - /** Work in Progress - // Delete old tag links for this page (cleanup) - $deleteQuery = <<query($deleteQuery, [$id]); - - $tagManager = new TagManager(); - - dd($tags_json); - **/ - + // ------------------------- // Update existing page + // ------------------------- $query = "UPDATE `pages` SET `title` = ?, `heading` = ?, `description` = ?, `keywords` = ?, `author` = ?, `slug` = ?, `path` = ?, `intro` = ?, `body` = ?, `notes` = ?, @@ -92,12 +99,18 @@ try { ]; $db->query($query, $params); $messages->notice('Page Updated'); - } + } + + // ------------------------- + // Save tags (for both new and existing pages) + // ------------------------- + $tagManager->setTagsForPage($id, $tags); + } catch (Exception $e) { $messages->error($e->getMessage()); $redirect->url($url_error); makeitso(); } -// Redirect to edit page +// Redirect back to edit page $redirect->url('/novaconium/page/edit/' . $id); diff --git a/docs/Dev-Fake_autoload.md b/docs/Dev-Fake_autoload.md new file mode 100644 index 0000000..daae1a0 --- /dev/null +++ b/docs/Dev-Fake_autoload.md @@ -0,0 +1,18 @@ +# Fake autoload for dev + +put this in index.php + +``` +// --- Dev-only autoloader for manually cloned vendor copy --- +spl_autoload_register(function ($class) { + if (str_starts_with($class, 'Novaconium\\')) { + $baseDir = BASEPATH . '/vendor/4lt/novaconium/src/'; + $relativeClass = substr($class, strlen('Novaconium\\')); + $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php'; + if (file_exists($file)) { + require_once $file; + } + } +}); + +``` diff --git a/src/Services/TagManager.php b/src/Services/TagManager.php index ab66446..8617848 100644 --- a/src/Services/TagManager.php +++ b/src/Services/TagManager.php @@ -1,14 +1,53 @@ db = $db; } -} \ No newline at end of file + + /** + * Assign tags to a page. + * + * This will delete old links and insert new ones. + * + * @param int $pageId + * @param array $tags Array of tag names + */ + public function setTagsForPage(int $pageId, array $tags): void + { + // Remove existing links + $this->db->query("DELETE FROM page_tags WHERE page_id = ?", [$pageId]); + + foreach ($tags as $tagName) { + $tagName = trim($tagName); + if ($tagName === '') continue; + + // Check if tag exists + $stmt = $this->db->query("SELECT id FROM tags WHERE name = ?", [$tagName]); + $row = $stmt->fetch_assoc(); // mysqli_result -> assoc array + if ($row) { + $tagId = $row['id']; + } else { + // Insert new tag + $this->db->query( + "INSERT INTO tags (name, created) VALUES (?, NOW())", + [$tagName] + ); + $tagId = $this->db->lastid; + } + + // Link page to tag + $this->db->query( + "INSERT INTO page_tags (page_id, tag_id) VALUES (?, ?)", + [$pageId, $tagId] + ); + } + } +}