Added the ability to edit and delete posts which includes uploading of images for the posts and managing those images
Signed-off-by: rodude123 <rodude123@gmail.com>
This commit is contained in:
+209
-43
@@ -21,7 +21,8 @@ class blogData
|
||||
public function getBlogPosts(): array
|
||||
{
|
||||
$conn = dbConn();
|
||||
$stmt = $conn->prepare("SELECT ID, title, dateCreated, dateModified, body, categories FROM blog ORDER BY dateCreated DESC;");
|
||||
$stmt = $conn->prepare("SELECT ID, title, dateCreated, dateModified, body, categories, featured
|
||||
FROM blog ORDER BY dateCreated;");
|
||||
$stmt->execute();
|
||||
|
||||
// set the resulting array to associative
|
||||
@@ -99,6 +100,164 @@ class blogData
|
||||
return array("errorMessage" => "Error, blog post could not found");
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a blog post with the given ID
|
||||
* @param int $ID - ID of the blog post to delete
|
||||
* @return string - Success or error message
|
||||
*/
|
||||
public function deletePost(int $ID): string
|
||||
{
|
||||
$conn = dbConn();
|
||||
|
||||
$stmtCheckPost = $conn->prepare("SELECT * FROM blog WHERE ID = :ID");
|
||||
$stmtCheckPost->bindParam(":ID", $ID);
|
||||
$stmtCheckPost->execute();
|
||||
$result = $stmtCheckPost->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result)
|
||||
{
|
||||
return "post not found";
|
||||
}
|
||||
|
||||
if ($result["featured"] === 1)
|
||||
{
|
||||
return "cannot delete";
|
||||
}
|
||||
|
||||
$stmt = $conn->prepare("DELETE FROM blog WHERE ID = :ID");
|
||||
$stmt->bindParam(":ID", $ID);
|
||||
|
||||
if ($stmt->execute())
|
||||
{
|
||||
$imagUtils = new imgUtils();
|
||||
$imagUtils->deleteDirectory("../blog/imgs/" . $result["title"] . "_" . $result["folderID"] . "/");
|
||||
return "success";
|
||||
}
|
||||
|
||||
return "error";
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the blog post with the given ID
|
||||
* @param int $ID - ID of the blog post to update
|
||||
* @param string $title - Title of the blog post
|
||||
* @param bool $featured - Whether the blog post is featured or not
|
||||
* @param string $body - Body of the blog post
|
||||
* @param string $dateModified - Date the blog post was modified
|
||||
* @param string $categories - Categories of the blog post
|
||||
* @return bool|string - Success or error message
|
||||
*/
|
||||
public function updatePost(int $ID, string $title, bool $featured, string $body, string $dateModified, string $categories): bool|string
|
||||
{
|
||||
$conn = dbConn();
|
||||
|
||||
$stmtCheckPost = $conn->prepare("SELECT * FROM blog WHERE ID = :ID");
|
||||
$stmtCheckPost->bindParam(":ID", $ID);
|
||||
$stmtCheckPost->execute();
|
||||
$result = $stmtCheckPost->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result)
|
||||
{
|
||||
return "post not found";
|
||||
}
|
||||
|
||||
if (!$featured && $result["featured"] === 1)
|
||||
{
|
||||
return "unset feature";
|
||||
}
|
||||
|
||||
if ($featured)
|
||||
{
|
||||
$stmtUnsetFeatured = $conn->prepare("UPDATE blog SET featured = 0 WHERE featured = 1;");
|
||||
$stmtUnsetFeatured->execute();
|
||||
}
|
||||
|
||||
$to = "../blog/imgs/" . $title . "_" . $result["folderID"] . "/";
|
||||
if ($result["title"] !== $title)
|
||||
{
|
||||
$from = "../blog/imgs/" . $result["title"] . "_" . $result["folderID"] . "/";
|
||||
mkdir($to, 0777, true);
|
||||
rename($result["headerImg"], $to . basename($result["headerImg"]));
|
||||
$body = $this->changeHTMLSrc($body, $to, $from);
|
||||
rmdir($from);
|
||||
}
|
||||
|
||||
$from = "../blog/imgs/tmp/";
|
||||
$newBody = $this->changeHTMLSrc($body, $to, $from);
|
||||
|
||||
$stmt = $conn->prepare("UPDATE blog SET title = :title, featured = :featured, body = :body, dateModified = :dateModified, categories = :categories WHERE ID = :ID;");
|
||||
$stmt->bindParam(":ID", $ID);
|
||||
$stmt->bindParam(":title", $title);
|
||||
$stmt->bindParam(":featured", $featured);
|
||||
$stmt->bindParam(":body", $newBody);
|
||||
$stmt->bindParam(":dateModified", $dateModified);
|
||||
$stmt->bindParam(":categories", $categories);
|
||||
|
||||
return $stmt->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new post di rectory, uploads the header image and moves the images from the
|
||||
* temp folder to the new folder, then updates the post html to point to the new images, finally
|
||||
* it creates the post in the database
|
||||
* @param string $title - Title of the blog post
|
||||
* @param string $body - Body of the blog post
|
||||
* @param string $dateCreated - Date the blog post was created
|
||||
* @param bool $featured - Whether the blog post is featured or not
|
||||
* @param string $categories - Categories of the blog post
|
||||
* @param UploadedFileInterface $headerImg - Header image of the blog post
|
||||
* @return int|string - ID of the blog post or error message
|
||||
*/
|
||||
public function createPost(string $title, string $body, string $dateCreated, bool $featured, string $categories, UploadedFileInterface $headerImg): int|string
|
||||
{
|
||||
$conn = dbConn();
|
||||
$folderID = uniqid();
|
||||
$targetFile = array("imgLocation" => "../blog/imgs/placeholder.png");
|
||||
|
||||
$targetDir = "../blog/imgs/" . $title . "_" . $folderID . "/";
|
||||
mkdir($targetDir, 0777, true);
|
||||
|
||||
if ($headerImg !== null)
|
||||
{
|
||||
$imagUtils = new imgUtils();
|
||||
$targetFile = $imagUtils->uploadFile($targetDir, $headerImg);
|
||||
}
|
||||
|
||||
|
||||
if (!is_array($targetFile))
|
||||
{
|
||||
return $targetFile;
|
||||
}
|
||||
|
||||
$newBody = $this->changeHTMLSrc($body, $targetDir, "../blog/imgs/tmp/");
|
||||
|
||||
|
||||
if ($featured)
|
||||
{
|
||||
$stmtMainProject = $conn->prepare("UPDATE blog SET featured = 0 WHERE featured = 1;");
|
||||
$stmtMainProject->execute();
|
||||
}
|
||||
|
||||
$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);
|
||||
$isFeatured = $featured ? 1 : 0;
|
||||
$stmt->bindParam(":featured", $isFeatured);
|
||||
$stmt->bindParam(":headerImg", $targetFile["imgLocation"]);
|
||||
$stmt->bindParam(":body", $newBody);
|
||||
$stmt->bindParam(":categories", $categories);
|
||||
$stmt->bindParam(":folderID", $folderID);
|
||||
|
||||
if ($stmt->execute())
|
||||
{
|
||||
return intval($conn->lastInsertId());
|
||||
}
|
||||
|
||||
return "Error, couldn't create post";
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload the images in the post to temp folder and return image location
|
||||
* @param UploadedFileInterface $img - Image to upload
|
||||
@@ -131,37 +290,60 @@ class blogData
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new post directory, uploads the header image and moves the images from the
|
||||
* temp folder to the new folder, then updates the post html to point to the new images, finally
|
||||
* it creates the post in the database
|
||||
* @param string $title - Title of the blog post
|
||||
* @param string $body - Body of the blog post
|
||||
* @param string $dateCreated - Date the blog post was created
|
||||
* @param string $featured - Whether the blog post is featured or not
|
||||
* @param string $categories - Categories of the blog post
|
||||
* @param UploadedFileInterface $headerImg - Header image of the blog post
|
||||
* @return int|string - ID of the blog post or error message
|
||||
* Upload the header image of the post and update the database
|
||||
* @param int $ID - ID of the post
|
||||
* @param UploadedFileInterface $img - Image to upload
|
||||
* @return string|array - String with error message or array with the location of the uploaded file
|
||||
*/
|
||||
public function createPost(string $title, string $body, string $dateCreated, string $featured, string $categories, UploadedFileInterface $headerImg): int|string
|
||||
public function uploadHeaderImage(int $ID, UploadedFileInterface $img): string|array
|
||||
{
|
||||
$conn = dbConn();
|
||||
$targetFile = "";
|
||||
$folderID = uniqid();
|
||||
if ($headerImg !== null)
|
||||
$stmt = $conn->prepare("SELECT * FROM blog WHERE ID = :ID;");
|
||||
$stmt->bindParam(":ID", $ID);
|
||||
$stmt->execute();
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result)
|
||||
{
|
||||
$targetDir = "../blog/imgs/" . $title . "_" . $folderID . "/";
|
||||
mkdir($targetDir, 0777, true);
|
||||
$imagUtils = new imgUtils();
|
||||
$targetFile = $imagUtils->uploadFile($targetDir, $headerImg);
|
||||
return "Couldn't find the post";
|
||||
}
|
||||
|
||||
$targetFile = array("imgLocation" => ".../blog/imgs/placeholder.png");
|
||||
$targetDir = "../blog/imgs/" . $result["title"] . "_" . $result["folderID"] . "/";
|
||||
$imagUtils = new imgUtils();
|
||||
$targetFile = $imagUtils->uploadFile($targetDir, $img);
|
||||
|
||||
if (!is_array($targetFile))
|
||||
{
|
||||
return $targetFile;
|
||||
}
|
||||
|
||||
if (file_exists($targetFile["imgLocation"]))
|
||||
{
|
||||
unlink($result["headerImg"]);
|
||||
$stmt = $conn->prepare("UPDATE blog SET headerImg = :headerImg WHERE ID = :ID;");
|
||||
$stmt->bindParam(":ID", $ID);
|
||||
$stmt->bindParam(":headerImg", $targetFile["imgLocation"]);
|
||||
$stmt->execute();
|
||||
if ($stmt->rowCount() > 0)
|
||||
{
|
||||
return $targetFile;
|
||||
}
|
||||
|
||||
return "Couldn't update the post";
|
||||
}
|
||||
|
||||
return "Couldn't upload the image";
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the HTML src of the images in the post to point to the new location
|
||||
* @param string $body - Body of the post
|
||||
* @param string $to - New location of the images
|
||||
* @param string $from - Old location of the images
|
||||
* @return string - Body of the post with the new image locations
|
||||
*/
|
||||
public function changeHTMLSrc(string $body, string $to, string $from): string
|
||||
{
|
||||
$htmlDoc = new DOMDocument();
|
||||
$htmlDoc->loadHTML($body, LIBXML_NOERROR);
|
||||
$doc = $htmlDoc->getElementsByTagName('body')->item(0);
|
||||
@@ -172,24 +354,25 @@ class blogData
|
||||
foreach ($imgs as $img)
|
||||
{
|
||||
$src = $img->getAttribute("src");
|
||||
$src = urldecode($src);
|
||||
$srcList[] = $src;
|
||||
$fileName = basename($src);
|
||||
|
||||
$img->setAttribute("src", $targetDir . $fileName);
|
||||
$img->setAttribute("src", $to . $fileName);
|
||||
}
|
||||
|
||||
$files = scandir("../blog/imgs/tmp/");
|
||||
$files = scandir($from);
|
||||
foreach ($files as $file)
|
||||
{
|
||||
if ($file != "." && $file != "..")
|
||||
{
|
||||
if (!in_array("../blog/imgs/tmp/" . $file, $srcList))
|
||||
if (!in_array($from . $file, $srcList))
|
||||
{
|
||||
unlink("../blog/imgs/tmp/" . $file);
|
||||
unlink($from . $file);
|
||||
}
|
||||
else
|
||||
{
|
||||
rename("../blog/imgs/tmp/" . $file, $targetDir . $file);
|
||||
rename($from . $file, $to . $file);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,23 +382,6 @@ class blogData
|
||||
{
|
||||
$newBody .= $htmlDoc->saveHTML($node);
|
||||
}
|
||||
|
||||
$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);
|
||||
$stmt->bindParam(":featured", $featured);
|
||||
$stmt->bindParam(":headerImg", $targetFile["imgLocation"]);
|
||||
$stmt->bindParam(":body", $newBody);
|
||||
$stmt->bindParam(":categories", $categories);
|
||||
$stmt->bindParam(":folderID", $folderID);
|
||||
|
||||
if ($stmt->execute())
|
||||
{
|
||||
return intval($conn->lastInsertId());
|
||||
}
|
||||
|
||||
return "Error, couldn't create post";
|
||||
return $newBody;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user