From f4836368811023c774d88d898208ff1d31527c23 Mon Sep 17 00:00:00 2001 From: SulthanDA28 <13521159@std.stei.itb.ac.id> Date: Sat, 11 Nov 2023 05:13:13 +0700 Subject: [PATCH] add click post in home and like integration --- src/app/controllers/Home/LikeController.php | 26 ++++++++++ src/app/models/HomeModel.php | 31 +++++++++++- src/app/view/home.php | 2 +- src/app/view/post.php | 25 ++++++++++ src/index.php | 5 +- src/public/css/home.css | 53 +++++++++++++++++++-- src/public/js/home.js | 43 +++++++++++++++++ src/public/js/post.js | 8 ++++ 8 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 src/app/controllers/Home/LikeController.php create mode 100644 src/app/view/post.php create mode 100644 src/public/js/post.js diff --git a/src/app/controllers/Home/LikeController.php b/src/app/controllers/Home/LikeController.php new file mode 100644 index 0000000..37a67a2 --- /dev/null +++ b/src/app/controllers/Home/LikeController.php @@ -0,0 +1,26 @@ +<?php + +require_once SRC_ROOT_PATH . "/app/baseclasses/BaseController.php"; +require_once SRC_ROOT_PATH . "/app/models/HomeModel.php"; +class LikeController extends BaseController{ + protected static $instance; + public static function getInstance(){ + if(!isset(self::$instance)){ + self::$instance = new static(HomeModel::getInstance()); + } + return self::$instance; + } + public function post($urlParams){ + $post_id = $_POST['post_id']; + $owner = $_POST['owner']; + $result = $this->srv->likes($post_id,$owner); + if($result){ + return json_encode(array('status' => 'success')); + } + else{ + return json_encode(array('status' => 'failed')); + } + } +} + +?> \ No newline at end of file diff --git a/src/app/models/HomeModel.php b/src/app/models/HomeModel.php index f58dfd2..bbc6d68 100644 --- a/src/app/models/HomeModel.php +++ b/src/app/models/HomeModel.php @@ -19,7 +19,7 @@ class HomeModel try{ $db = PDOHandler::getInstance()->getPDO(); $page = $page * 10; - $sql = "SELECT * FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id ORDER BY p.post_id DESC LIMIT 10 OFFSET $page"; + $sql = "SELECT p.post_id,u.id,u.username,u.profile_name,u.profile_picture_path,p.body,pr.path FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id ORDER BY p.post_id DESC LIMIT 10 OFFSET $page"; $count = "SELECT COUNT(*) as count FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id "; $result = $db->query($sql); $result2 = $db->query($count); @@ -41,6 +41,35 @@ class HomeModel } } + public function likes($post_id,$owner){ + try{ + $user_id = $_SESSION['user_id']; + $db = PDOHandler::getInstance()->getPDO(); + $sql = "INSERT INTO likes (post_id,post_owner_id,user_id) VALUES ($post_id,$owner,$user_id)"; + $check = "SELECT * FROM likes WHERE post_id=$post_id AND post_owner_id=$owner AND user_id=$user_id"; + $result2 = $db->query($check); + if($result2){ + $result = $result2->fetchAll(PDO::FETCH_ASSOC); + if(count($result) > 0){ + return false; + } + else{ + $result = $db->query($sql); + if($result){ + return true; + } + else{ + return false; + } + } + } + else{ + return false; + } + }catch(Exception $e){ + return false; + } + } } ?> \ No newline at end of file diff --git a/src/app/view/home.php b/src/app/view/home.php index e17783b..158fa87 100644 --- a/src/app/view/home.php +++ b/src/app/view/home.php @@ -4,13 +4,13 @@ require_once PAGE_PATH . "/templates/navbar.php"; <!DOCTYPE html> <html> - <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home</title> <link rel="stylesheet" href="/public/css/home.css" /> <link rel="stylesheet" href="/public/css/shared.css" /> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"> </head> <body> diff --git a/src/app/view/post.php b/src/app/view/post.php new file mode 100644 index 0000000..a29bff1 --- /dev/null +++ b/src/app/view/post.php @@ -0,0 +1,25 @@ +<?php +require_once PAGE_PATH . "/templates/navbar.php"; +?> + +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <link rel="stylesheet" href="/public/css/home.css" /> + <link rel="stylesheet" href="/public/css/shared.css" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Document</title> +</head> +<body> + <div class="layout"> + <?php + echo Navbar(); + ?> + <div id="test"> + test + </div> + </div> + <script src="/public/js/post.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/index.php b/src/index.php index d66c2c3..464d3ef 100644 --- a/src/index.php +++ b/src/index.php @@ -17,6 +17,7 @@ require_once CONTROLLER_PATH . "/Admin/UnbanController.php"; require_once CONTROLLER_PATH . "/Admin/SetAdmin.php"; require_once CONTROLLER_PATH . "/Admin/DeleteUserController.php"; require_once CONTROLLER_PATH . "/Home/GetPostController.php"; +require_once CONTROLLER_PATH . "/Home/LikeController.php"; require_once CONTROLLER_PATH . "/Page/HomePage.php"; require_once CONTROLLER_PATH . "/Page/LoginPage.php"; @@ -44,6 +45,8 @@ $router->addHandler("/api/unban", UnbanController::getInstance(), []); $router->addHandler("/api/setadmin", SetAdminController::getInstance(), []); $router->addHandler("/api/deleteuser", DeleteUserController::getInstance(), []); $router->addHandler("/api/getpost/*", GetPostController::getInstance(), []); +$router->addHandler("/api/like", LikeController::getInstance(), []); + $router->addHandler("/", HomePage::getInstance(), []); $router->addHandler("/login", LoginPage::getInstance(), []); @@ -53,6 +56,6 @@ $router->addHandler("/*", UserPage::getInstance(), []); $router->addHandler("/settings/*", SettingsPage::getInstance(), [CheckLogin::getInstance()]); $router->addHandler("/admin/*", AdminPage::getInstance(), [CheckAdmin::getInstance()]); $router->addHandler("/admin/unban/*", AdminPageUnban::getInstance(), [CheckAdmin::getInstance()]); -$router->addHandler("/*/status/*", PostPage::getInstance(), []); +$router->addHandler("/post/*/*", PostPage::getInstance(), []); $router->run($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']); \ No newline at end of file diff --git a/src/public/css/home.css b/src/public/css/home.css index 6bc067b..d918d01 100644 --- a/src/public/css/home.css +++ b/src/public/css/home.css @@ -35,20 +35,22 @@ position: absolute; top: 10%; left: 40%; + display: flex; + justify-content: center; + align-items: center; } .box { border: 2px solid #333; padding: 20px; - max-width: 100%; + max-width: 600px; margin-top: 10px; display: flex; flex-direction: column; - width: 500%; + width: 600px; word-wrap: break-word; overflow: hidden; border-radius: 20px; - } img { @@ -73,6 +75,12 @@ img { max-width: 100%; border-bottom: 1px solid #333; } +.iden:hover{ + cursor: pointer; +} +.isitext:hover{ + cursor: pointer; +} .kolom{ display: flex; flex-direction: column; @@ -143,4 +151,43 @@ img { font-weight: 600; color: #fff; +} +.like-button { + padding: 10px 20px; + background-color: #007bff; + color: #fff; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} + +.share-button { + padding: 10px 20px; + background-color: #3b5998; + color: #fff; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} +.like-button:hover, .share-button:hover { + background-color: #0056b3; +} + +.like-button:focus, .share-button:focus { + box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); +} + +.like-button, .share-button { + text-align: center; +} + +.like-button i, .share-button i { + margin-right: 5px; +} + +.button-container { + display: flex; + align-items: center; } \ No newline at end of file diff --git a/src/public/js/home.js b/src/public/js/home.js index 54925e7..8c2f589 100644 --- a/src/public/js/home.js +++ b/src/public/js/home.js @@ -27,6 +27,7 @@ function createPost(data,totalsemuapage,pagenow){ identitas.classList.add('iden'); identitas.appendChild(fotoprofile); identitas.appendChild(simpanidentitas); + identitas.addEventListener('click',function(){gotoProfile(element.id)}); const box = document.createElement('div'); box.classList.add('box'); @@ -34,6 +35,8 @@ function createPost(data,totalsemuapage,pagenow){ const isitext = document.createElement('p'); isitext.textContent = element.body; + isitext.classList.add('isitext'); + isitext.addEventListener('click',function(){gotoPost(element.post_id,element.id)}); box.appendChild(isitext); var pathToRemove = "/var/www/html"; var path = element.path; @@ -63,6 +66,16 @@ function createPost(data,totalsemuapage,pagenow){ box.appendChild(isiaudio); } } + const logolike = document.createElement('i'); + logolike.classList.add('fas','fa-thumbs-up'); + const like = document.createElement('button'); + like.classList.add('like-button'); + like.addEventListener('click',function(){likeId(element.post_id,element.id)}); + like.appendChild(logolike); + const buatbutton = document.createElement('div'); + buatbutton.classList.add('button-container'); + buatbutton.appendChild(like); + box.appendChild(buatbutton); post.appendChild(box); }); const list = document.createElement('ul'); @@ -72,6 +85,36 @@ function createPost(data,totalsemuapage,pagenow){ post.appendChild(pagination); makePagination(totalsemuapage,pagenow); } +function gotoPost(postid,ownerid){ + console.log(postid,"post"); + window.location.href = "/post/"+ownerid+"/"+postid; +} +function gotoProfile(userid){ + console.log(userid,"user"); +} +function likeId(postid,userid){ + console.log("like",postid); + const xhr = new XMLHttpRequest(); + const url = '/api/like'; + xhr.open('POST', url, true); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + const response = JSON.parse(xhr.responseText); + if(response.status==="failed"){ + alert("Failed to like post"); + } + else if(response.status==="success"){ + console.log(response); + } + } else { + console.error('Gagal melakukan permintaan'); + } + } + }; + xhr.send(`post_id=${encodeURIComponent(postid)}&owner=${encodeURIComponent(userid)}`); +} const xhr = new XMLHttpRequest(); const url = '/api/getpost/0'; diff --git a/src/public/js/post.js b/src/public/js/post.js new file mode 100644 index 0000000..8f4ee6a --- /dev/null +++ b/src/public/js/post.js @@ -0,0 +1,8 @@ +let currUrl = window.location.href; +currUrl = currUrl.split('/'); +postid = currUrl[currUrl.length-1]; +ownerid = currUrl[currUrl.length-2]; +console.log(postid); +console.log(ownerid); +const ambil = document.getElementById('test'); +ambil.textContent = postid; -- GitLab