From 1567a6d48f8538a635ccec4323b12e7c9906ed7d Mon Sep 17 00:00:00 2001 From: Kenneth Ezekiel <88850771+KenEzekiel@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:06:53 +0700 Subject: [PATCH] fix: update, delete and styling for review --- public/css/film-detail.css | 13 ++- public/css/styles.css | 2 + src/base/BaseRepository.php | 16 +-- src/controllers/ReviewController.php | 106 +++++++++++------- views/film-detail.php | 155 -------------------------- views/review.php | 157 +++++++++++++++++++++++++++ 6 files changed, 244 insertions(+), 205 deletions(-) delete mode 100644 views/film-detail.php create mode 100644 views/review.php diff --git a/public/css/film-detail.css b/public/css/film-detail.css index d387521..7e12f23 100644 --- a/public/css/film-detail.css +++ b/public/css/film-detail.css @@ -2,10 +2,11 @@ display: flex; justify-content: center; align-items: center; + background-color: black; } .insert-review { - background-color: black; + background-color: var(--neutral-black, #17181D); padding: 2rem 8rem; } @@ -39,7 +40,8 @@ .submit-btn button { background-color: #5360dc; - border-radius: 0.5rem; + border:none; + border-radius: 8px; padding: 0.5rem 1rem; font-size: 1rem; font-style: normal; @@ -60,13 +62,14 @@ } .delete-btn button { - background-color: #404650; - border-radius: 0.5rem; + background-color: #de2727; + border:none; + border-radius: 8px; padding: 0.5rem 1rem; font-size: 1rem; font-style: normal; font-weight: 500; - color: #FB4646; + color: #fff; } .stars { diff --git a/public/css/styles.css b/public/css/styles.css index 74246b2..3be55bf 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -179,6 +179,8 @@ textarea { flex-direction: row; justify-content: center; align-items: center; + padding-left: 30px; + padding-right: 30px; } .nav-here p { diff --git a/src/base/BaseRepository.php b/src/base/BaseRepository.php index 795f04b..7848a3b 100644 --- a/src/base/BaseRepository.php +++ b/src/base/BaseRepository.php @@ -221,28 +221,30 @@ abstract class BaseRepository return "$key = :$key"; }, array_keys($arrParams), array_values($arrParams))); $primaryKey = $model->get('_primary_key'); - $sql .= " WHERE $primaryKey = :primaryKey"; - - $stmt = $this->pdo->prepare($sql); - // Hydrating and sanitizing - foreach ($arrParams as $key => $value) { - $stmt->bindValue(":$key", $model->get($key), $value); - } if (is_array($primaryKey)) { + $sql .= " WHERE "; $sql .= implode(" AND ", array_map(function ($key, $value) { return "$value = :$value"; // Menggunakan nama parameter yang sesuai }, array_keys($primaryKey), array_values($primaryKey))); + $stmt = $this->pdo->prepare($sql); + foreach ($primaryKey as $key => $value) { $stmt->bindValue(":$value", $model->get($value), PDO::PARAM_STR); // Menggunakan nama parameter yang sesuai } } else { + $sql .= " WHERE "; $sql .= "$primaryKey = :primaryKey"; $stmt = $this->pdo->prepare($sql); $stmt->bindValue(":primaryKey", $model->get($primaryKey), PDO::PARAM_INT); } + // Hydrating and sanitizing + foreach ($arrParams as $key => $value) { + $stmt->bindValue(":$key", $model->get($key), $value); + } + $stmt->execute(); return $stmt->rowCount(); } diff --git a/src/controllers/ReviewController.php b/src/controllers/ReviewController.php index 46fb665..6adc263 100644 --- a/src/controllers/ReviewController.php +++ b/src/controllers/ReviewController.php @@ -3,21 +3,25 @@ namespace app\controllers; use app\base\BaseController; +use app\exceptions\BadRequestException; use app\Request; use app\services\ReviewService; use app\services\UserService; use Exception; -class ReviewController extends BaseController { +class ReviewController extends BaseController +{ protected $userService; - public function __construct() { + public function __construct() + { parent::__construct(ReviewService::getInstance()); $this->userService = UserService::getInstance(); } - protected function get($urlParams) { - $film_id = 1; + protected function get($urlParams) + { + $film_id = $urlParams['film_id']; $reviews = $this->service->getAllReviewByFilmId($film_id); foreach ($reviews as $review) { $user_id = $review->user_id; @@ -26,41 +30,41 @@ class ReviewController extends BaseController { } $urlParams["reviews"] = $reviews; if (isset($_SESSION['user_id'])) { - try { - // echo 'MASUK'; + if (isset($urlParams['isset']) and $urlParams['isset'] == 'yes') { + unset($urlParams['errorMsg']); $user_id = $_SESSION['user_id']; $user_review = $this->service->getReviewByUserFilmId($user_id, $film_id); - // var_dump($user_review); if (isset($user_review->user_id, $user_review->film_id)) { $urlParams["user_review"] = $user_review; } - } catch (Exception $e) { - echo $e; + } else { + if (isset($urlParams['isset']) and $urlParams['isset'] == 'no') { + $user_id = $_SESSION['user_id']; + $user_review = $this->service->getReviewByUserFilmId($user_id, $film_id); + if (isset($user_review)) { + $urlParams['rating'] = $user_review->rating; + $urlParams['notes'] = $review->notes; + $urlParams['published_time'] = $review->published_time; + } + } } + parent::render($urlParams, 'review', 'layouts/base'); + } else { + parent::redirect("/login"); } - parent::render($urlParams, 'film-detail', 'layouts/base'); } - protected function post($urlParams) { + protected function post($urlParams) + { if (isset($_SESSION['user_id'])) { if (isset($_POST['action'])) { $action = $_POST['action']; if ($action == 'edit') { try { - $user_id = $_SESSION['user_id']; - $film_id = 1; - $review = $this->service->getReviewByUserFilmId($user_id, $film_id); - // GET DATA - $rating = $review->rating; - $notes = $review->notes; - $published_time = $review->published_time; - $review ->set('rating', $rating) ->set('notes', $notes)->set('published_time', $published_time); - $response = $this->service->update($review); - if ($response == 1) { - $msg = "Review updated successfully!"; - $urlParams['msg'] = $msg; - } - parent::redirect('/review', $urlParams); + $data = []; + $data['film_id'] = $urlParams['film_id']; + $data['isset'] = 'no'; + parent::redirect('/review', $data); } catch (Exception $e) { $msg = $e->getMessage(); $urlParams['errorMsg'] = $msg; @@ -69,16 +73,17 @@ class ReviewController extends BaseController { } elseif ($action == 'delete') { try { $user_id = $_SESSION['user_id']; - $film_id = 1; + $film_id = $urlParams['film_id']; $notes = $this->service->getReviewByUserFilmId($user_id, $film_id); $response = $this->service->deleteByUserFilmId($notes->user_id, $notes->film_id); if ($response == 1) { $msg = "Review deleted successfully"; $urlParams['msg'] = $msg; + $urlParams['isset'] = 'no'; } parent::redirect("/review", $urlParams); - // parent::render($urlParams, 'film-detail', 'layouts/base'); - } catch (Exception $e){ + // parent::render($urlParams, 'review', 'layouts/base'); + } catch (Exception $e) { $msg = $e->getMessage(); $urlParams['errorMsg'] = $msg; parent::redirect("/review", $urlParams); @@ -86,21 +91,46 @@ class ReviewController extends BaseController { } } else { try { - // GET DATA $user_id = $_SESSION['user_id']; - // $film_id = $urlParams['film_id']; - $film_id = 1; - $rating = $_POST['rating']; - $notes = $_POST['notes']; - date_default_timezone_set('Asia/Jakarta'); - $published_time = date('Y-m-d H:i:s'); - $response = $this->service->create($user_id, $film_id, $rating, $notes, $published_time); + $film_id = $urlParams['film_id']; + $review = $this->service->getReviewByUserFilmId($user_id, $film_id); + if (!isset($_POST['notes']) or !isset($_POST['rating'])) { + throw new BadRequestException("Rating or notes can't be empty!"); + } + if ($review == null) { + // No review, user review is empty + // GET DATA + $rating = $_POST['rating']; + $notes = $_POST['notes']; + date_default_timezone_set('Asia/Jakarta'); + $published_time = date('Y-m-d H:i:s'); + $response = $this->service->create($user_id, $film_id, $rating, $notes, $published_time); + unset($urlParams['msg']); + $urlParams['isset'] = 'yes'; + unset($urlParams['errorMsg']); + parent::redirect('review', $urlParams); + } else { + // Has a review, want to update + // GET DATA + $rating = $_POST['rating']; + $notes = $_POST['notes']; + $published_time = $review->published_time; + $review->set('rating', $rating)->set('notes', $notes)->set('published_time', $published_time); + $response = $this->service->update($review); + if ($response == 1) { + $msg = "Review updated successfully!"; + $urlParams['msg'] = $msg; + } + $urlParams['isset'] = 'yes'; + unset($urlParams['errorMsg']); + parent::redirect('/review', $urlParams); + } } catch (Exception $e) { $msg = $e->getMessage(); - parent::render(['errorMsg' => $msg], 'film-detail', 'layouts/base'); + $urlParams['errorMsg'] = $msg; + parent::redirect("/review", $urlParams); } } - parent::render($urlParams, 'film-detail', 'layouts/base'); } else { // parent::render($urlParams, 'login', 'layouts/base'); parent::redirect("/login"); diff --git a/views/film-detail.php b/views/film-detail.php deleted file mode 100644 index c6d1f9a..0000000 --- a/views/film-detail.php +++ /dev/null @@ -1,155 +0,0 @@ -<html> -<head> - <link rel='stylesheet' href='/public/css/film-detail.css'> - <link rel='stylesheet' href='/public/css/styles.css'> -</head> -<body> -<div class='insert-review'> - <h2>Write your review</h2> - <p class='error-msg'> - <?php if (isset($errorMsg)) { - echo $errorMsg; - } ?> - </p> - <?php - if (!isset($user_review)) { - echo '<form class="review-form" method="post"> - <div class="review-group"> - <div class="stars"> - <label> - <input type="radio" name="rating" value="1" /> - <span class="icon">★</span> - </label> - <label> - <input type="radio" name="rating" value="2" /> - <span class="icon">★</span> - <span class="icon">★</span> - </label> - <label> - <input type="radio" name="rating" value="3" /> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - </label> - <label> - <input type="radio" name="rating" value="4" /> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - </label> - <label> - <input type="radio" name="rating" value="5" /> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - <span class="icon">★</span> - </label> - </div> - <br> - <input class="input" type="text" id="notes" name="notes" placeholder="Write review here..." required> - <br> - </div> - <div class="submit-btn"> - <button type="submit">Submit Review</button> - </div> - </form>'; - } else { - $rating = $user_review->rating; - $notes = $user_review->notes; - $film_id = $user_review->film_id; - $published_time = $user_review->published_time; - $timestamp = strtotime($published_time); - $formatted_time = date("j F Y H:i", $timestamp); - $user_id = $user_review->user_id; - $username = $_SESSION['username']; - echo '<div class="review-group"> - <div class="review-info"> - <div class="loop">'; - - for ($i = 0; $i < 5; $i++) { - if ($i < $rating) { - echo '<span class="icon-rating">★</span>'; - } else { - echo '<span class="icon-rating-non">★</span>'; - } - } - - echo '</div> - <p>by ' . $username . '</p> - </div> - <h3 class="review-result">' . $notes . '</h3> - <h3 class="time">' . $formatted_time . '</h3> - </div> - <div class="buttons"> - <div class="submit-btn"> - <form method="post"> - <input type="hidden" name="action" value="edit"> - <button type="submit">Edit Review</button> - </form> - </div> - <div class="delete-btn"> - <form method="post"> - <input type="hidden" name="action" value="delete"> - <button type="submit">Delete Review</button> - </form> - </div> - </div>'; - } - ?> -</div> - -<div class='insert-review'> - <h2>What people say</h2> - <h3> - <?php - foreach ($reviews as $review) { - $rating = $review->rating; - $notes = $review->notes; - $film_id = $review->film_id; - $published_time = $review->published_time; - $timestamp = strtotime($published_time); - $formatted_time = date("j F Y H:i", $timestamp); - $user_id = $review->user_id; - $username = $review->username; - ?> - </h3> - <form class='review-form' method='get'> - <div class='review-group'> - <div class='review-info'> - <div class='loop'> - <?php - for ($i=0; $i<5; $i++) { - if ($i < $rating) { - echo '<span class="icon-rating">★</span>'; - } else { - echo '<span class="icon-rating-non">★</span>'; - } - } - ?> - </div> - <p?>by <?php echo $username; ?></p> - <!-- <?php - // $user = $this->service->getById($film_id); - // $username = $user->$username; - // $data = getById($user_id); - // $username = $data->$username; - // echo "<span>$username</span>" - // Cari nama user dengan user_id - ?></p> --> - </div> - <h3 class='review-result'><?php echo $notes; ?></h3> - <h3 class='time'><?php echo $formatted_time; ?></h3> - - <!-- <label name='rating'></label> - <label name='notes'></label> --> - </div> - </form> - <?php - } - ?> -</div> -</body> - -</html> \ No newline at end of file diff --git a/views/review.php b/views/review.php new file mode 100644 index 0000000..a381213 --- /dev/null +++ b/views/review.php @@ -0,0 +1,157 @@ +<html> + +<head> + <link rel='stylesheet' href='/public/css/film-detail.css'> + <link rel='stylesheet' href='/public/css/styles.css'> +</head> + +<body> + <div class='insert-review'> + <h2>Write your review</h2> + <p class='error-msg'> + <?php if (isset($errorMsg)) { + echo $errorMsg; + } ?> + </p> + <?php + if (!isset($user_review) or $isset == 'no') { + echo '<form class="review-form" method="post"> + <div class="review-group"> + <div class="stars"> + <label> + <input type="radio" name="rating" value="1" /> + <span class="icon">★</span> + </label> + <label> + <input type="radio" name="rating" value="2" /> + <span class="icon">★</span> + <span class="icon">★</span> + </label> + <label> + <input type="radio" name="rating" value="3" /> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + </label> + <label> + <input type="radio" name="rating" value="4" /> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + </label> + <label> + <input type="radio" name="rating" value="5" /> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + <span class="icon">★</span> + </label> + </div> + <br> + <input class="input" type="text" id="notes" name="notes" placeholder="Write review here..." value="' . (isset($notes) and $notes != "" ? $notes : "") . '"required> + <br> + </div> + <div class="submit-btn"> + <button type="submit">Submit Review</button> + </div> + </form>'; + } else { + $rating = $user_review->rating; + $notes = $user_review->notes; + $film_id = $user_review->film_id; + $published_time = $user_review->published_time; + $timestamp = strtotime($published_time); + $formatted_time = date("j F Y H:i", $timestamp); + $user_id = $user_review->user_id; + $username = $_SESSION['username']; + echo '<div class="review-group"> + <div class="review-info"> + <div class="loop">'; + + for ($i = 0; $i < 5; $i++) { + if ($i < $rating) { + echo '<span class="icon-rating">★</span>'; + } else { + echo '<span class="icon-rating-non">★</span>'; + } + } + + echo '</div> + <p>by ' . $username . '</p> + </div> + <h3 class="review-result">' . $notes . '</h3> + <h3 class="time">' . $formatted_time . '</h3> + </div> + <div class="buttons"> + <div class="submit-btn"> + <form method="post"> + <input type="hidden" name="action" value="edit"> + <button type="submit">Edit Review</button> + </form> + </div> + <div class="delete-btn"> + <form method="post"> + <input type="hidden" name="action" value="delete"> + <button type="submit">Delete Review</button> + </form> + </div> + </div>'; + } + ?> + </div> + + <div class='insert-review'> + <h2>What people say</h2> + <h3> + <?php + foreach ($reviews as $review) { + $rating = $review->rating; + $notes = $review->notes; + $film_id = $review->film_id; + $published_time = $review->published_time; + $timestamp = strtotime($published_time); + $formatted_time = date("j F Y H:i", $timestamp); + $user_id = $review->user_id; + $username = $review->username; + ?> + </h3> + <form class='review-form' method='get'> + <div class='review-group'> + <div class='review-info'> + <div class='loop'> + <?php + for ($i = 0; $i < 5; $i++) { + if ($i < $rating) { + echo '<span class="icon-rating">★</span>'; + } else { + echo '<span class="icon-rating-non">★</span>'; + } + } + ?> + </div> + <p?>by <?php echo $username; ?></p> + <!-- <?php + // $user = $this->service->getById($film_id); + // $username = $user->$username; + // $data = getById($user_id); + // $username = $data->$username; + // echo "<span>$username</span>" + // Cari nama user dengan user_id + ?></p> --> + </div> + <h3 class='review-result'><?php echo $notes; ?></h3> + <h3 class='time'><?php echo $formatted_time; ?></h3> + + <!-- <label name='rating'></label> + <label name='notes'></label> --> + </div> + </form> + <?php + } + ?> + </div> +</body> + +</html> \ No newline at end of file -- GitLab