From 7b637dac7b35371c94d457dafd16f1edce386f7d Mon Sep 17 00:00:00 2001 From: rodude123 Date: Mon, 26 Jun 2023 16:52:48 +0100 Subject: [PATCH] Added in the ability not upload a headerImage and instead use a placeholder. Folder ID is now stored in the DB Signed-off-by: rodude123 --- composer.json | 3 ++- dist/api/blog/blogData.php | 21 +++++++++++++++------ dist/api/blog/blogRoutes.php | 10 ++++++++-- dist/blog/imgs/placeholder.png | Bin 0 -> 6146 bytes src/api/blog/blogData.php | 21 +++++++++++++++------ src/api/blog/blogRoutes.php | 10 ++++++++-- src/blog/imgs/placeholder.png | Bin 0 -> 6146 bytes 7 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 dist/blog/imgs/placeholder.png create mode 100644 src/blog/imgs/placeholder.png diff --git a/composer.json b/composer.json index 1c75063..7537df6 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "slim/slim": "^4.10", "rbdwllr/psr-jwt": "^2.0", "tuupola/slim-jwt-auth": "^3.6", - "ext-dom": "*" + "ext-dom": "*", + "ext-libxml": "*" } } diff --git a/dist/api/blog/blogData.php b/dist/api/blog/blogData.php index 358b288..e0eb5cd 100644 --- a/dist/api/blog/blogData.php +++ b/dist/api/blog/blogData.php @@ -145,10 +145,18 @@ class blogData public function createPost(string $title, string $body, string $dateCreated, string $featured, string $categories, UploadedFileInterface $headerImg): int|string { $conn = dbConn(); - $targetDir = "../blog/imgs/" . $title . "_" . uniqid() . "/"; - mkdir($targetDir, 0777, true); - $imagUtils = new imgUtils(); - $targetFile = $imagUtils->uploadFile($targetDir, $headerImg); + $targetFile = ""; + $folderID = uniqid(); + if ($headerImg !== null) + { + $targetDir = "../blog/imgs/" . $title . "_" . $folderID . "/"; + mkdir($targetDir, 0777, true); + $imagUtils = new imgUtils(); + $targetFile = $imagUtils->uploadFile($targetDir, $headerImg); + } + + $targetFile = array("imgLocation" => ".../blog/imgs/placeholder.png"); + if (!is_array($targetFile)) { return $targetFile; @@ -192,8 +200,8 @@ class blogData $newBody .= $htmlDoc->saveHTML($node); } - $stmt = $conn->prepare("INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, body, categories) - VALUES (:title, :dateCreated, :dateModified, :featured, :headerImg, :body, :categories);"); + $stmt = $conn->prepare("INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, body, categories, folderID) + VALUES (:title, :dateCreated, :dateModified, :featured, :headerImg, :body, :categories, :folderID);"); $stmt->bindParam(":title", $title); $stmt->bindParam(":dateCreated", $dateCreated); $stmt->bindParam(":dateModified", $dateCreated); @@ -201,6 +209,7 @@ class blogData $stmt->bindParam(":headerImg", $targetFile["imgLocation"]); $stmt->bindParam(":body", $newBody); $stmt->bindParam(":categories", $categories); + $stmt->bindParam(":folderID", $folderID); if ($stmt->execute()) { diff --git a/dist/api/blog/blogRoutes.php b/dist/api/blog/blogRoutes.php index fd54313..a12075a 100644 --- a/dist/api/blog/blogRoutes.php +++ b/dist/api/blog/blogRoutes.php @@ -33,14 +33,20 @@ class blogRoutes implements routesInterface { $data = $request->getParsedBody(); $files = $request->getUploadedFiles(); - if (empty($data["title"]) || empty($data["body"]) || empty($data["dateCreated"]) || empty($data["featured"]) || empty($data["categories"]) || empty($files["headerImg"])) + $headerImg = $files["headerImg"]; + if (empty($data["title"]) || empty($data["body"]) || empty($data["dateCreated"]) || empty($data["featured"]) || empty($data["categories"])) { // uh oh sent some empty data $response->getBody()->write(json_encode(array("error" => "Error, empty data sent"))); return $response->withStatus(400); } - $insertedID = $this->blogData->createPost($data["title"], $data["body"], $data["dateCreated"], $data["featured"], $data["categories"], $files["headerImg"]); + if (empty($files["headerImg"])) + { + $headerImg = null; + } + + $insertedID = $this->blogData->createPost($data["title"], $data["body"], $data["dateCreated"], $data["featured"], $data["categories"], $headerImg); if (!is_int($insertedID)) { // uh oh something went wrong diff --git a/dist/blog/imgs/placeholder.png b/dist/blog/imgs/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1d31046f6bb3ca7699ba3bc40b953380d1b754 GIT binary patch literal 6146 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 bOZa=5ECsvRPtgOVfAL0oX1c{_EdIX$Go=nF literal 0 HcmV?d00001 diff --git a/src/api/blog/blogData.php b/src/api/blog/blogData.php index 358b288..e0eb5cd 100644 --- a/src/api/blog/blogData.php +++ b/src/api/blog/blogData.php @@ -145,10 +145,18 @@ class blogData public function createPost(string $title, string $body, string $dateCreated, string $featured, string $categories, UploadedFileInterface $headerImg): int|string { $conn = dbConn(); - $targetDir = "../blog/imgs/" . $title . "_" . uniqid() . "/"; - mkdir($targetDir, 0777, true); - $imagUtils = new imgUtils(); - $targetFile = $imagUtils->uploadFile($targetDir, $headerImg); + $targetFile = ""; + $folderID = uniqid(); + if ($headerImg !== null) + { + $targetDir = "../blog/imgs/" . $title . "_" . $folderID . "/"; + mkdir($targetDir, 0777, true); + $imagUtils = new imgUtils(); + $targetFile = $imagUtils->uploadFile($targetDir, $headerImg); + } + + $targetFile = array("imgLocation" => ".../blog/imgs/placeholder.png"); + if (!is_array($targetFile)) { return $targetFile; @@ -192,8 +200,8 @@ class blogData $newBody .= $htmlDoc->saveHTML($node); } - $stmt = $conn->prepare("INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, body, categories) - VALUES (:title, :dateCreated, :dateModified, :featured, :headerImg, :body, :categories);"); + $stmt = $conn->prepare("INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, body, categories, folderID) + VALUES (:title, :dateCreated, :dateModified, :featured, :headerImg, :body, :categories, :folderID);"); $stmt->bindParam(":title", $title); $stmt->bindParam(":dateCreated", $dateCreated); $stmt->bindParam(":dateModified", $dateCreated); @@ -201,6 +209,7 @@ class blogData $stmt->bindParam(":headerImg", $targetFile["imgLocation"]); $stmt->bindParam(":body", $newBody); $stmt->bindParam(":categories", $categories); + $stmt->bindParam(":folderID", $folderID); if ($stmt->execute()) { diff --git a/src/api/blog/blogRoutes.php b/src/api/blog/blogRoutes.php index fd54313..a12075a 100644 --- a/src/api/blog/blogRoutes.php +++ b/src/api/blog/blogRoutes.php @@ -33,14 +33,20 @@ class blogRoutes implements routesInterface { $data = $request->getParsedBody(); $files = $request->getUploadedFiles(); - if (empty($data["title"]) || empty($data["body"]) || empty($data["dateCreated"]) || empty($data["featured"]) || empty($data["categories"]) || empty($files["headerImg"])) + $headerImg = $files["headerImg"]; + if (empty($data["title"]) || empty($data["body"]) || empty($data["dateCreated"]) || empty($data["featured"]) || empty($data["categories"])) { // uh oh sent some empty data $response->getBody()->write(json_encode(array("error" => "Error, empty data sent"))); return $response->withStatus(400); } - $insertedID = $this->blogData->createPost($data["title"], $data["body"], $data["dateCreated"], $data["featured"], $data["categories"], $files["headerImg"]); + if (empty($files["headerImg"])) + { + $headerImg = null; + } + + $insertedID = $this->blogData->createPost($data["title"], $data["body"], $data["dateCreated"], $data["featured"], $data["categories"], $headerImg); if (!is_int($insertedID)) { // uh oh something went wrong diff --git a/src/blog/imgs/placeholder.png b/src/blog/imgs/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1d31046f6bb3ca7699ba3bc40b953380d1b754 GIT binary patch literal 6146 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 bOZa=5ECsvRPtgOVfAL0oX1c{_EdIX$Go=nF literal 0 HcmV?d00001