diff --git a/app/api/anime/filter.php b/app/api/anime/filter.php index a9e8d5e4d6b389f4c921e7f85a3dc7b0b94374df..9e040887d4baabcf9c73421dc53f9dfb20fad8d8 100644 --- a/app/api/anime/filter.php +++ b/app/api/anime/filter.php @@ -3,34 +3,80 @@ require_once(dirname(__DIR__,2).'/define.php'); require_once(BASE_DIR.'/models/Anime.php'); -$first = true; - -$a = new Anime(); -$genreFilter = $_POST['filter-genre'] != "Any" ? 'genre='.$_POST['filter-genre'] : ""; -$typeFilter = $_POST['filter-type'] != "Any" ? 'type='.$_POST['filter-type'] : ""; -$statusFilter = $_POST['filter-status'] != "Any" ? 'status='.$_POST['filter-status'] : ""; -$ratingFilter = $_POST['filter-rating'] != "Any" ? 'rating='.$_POST['filter-rating'] : ""; -$studioFilter = $_POST['filter-studio'] != "Any" ? 'studio='.$_POST['filter-studio'] : ""; -$sortFilter = $_POST['filter-sort'] != "Any" ? 'sort='.$_POST['filter-sort'] : ""; - -$filterArray = array ( - $genreFilter, $typeFilter, $statusFilter, $ratingFilter, $studioFilter, $sortFilter -); + +// $xml = file_get_contents('php://input'); +// $data = json_decode($xml, true); + $url = '/?anime/'; -foreach($filterArray as $f){ - if ($first){ - if ($f != ""){ - $url = $url.$f; - $first = false; - } - } else { - if ($f != ""){ - $url = $url.'&'.$f; + +// if (!$data) { + $first = true; + + $a = new Anime(); + $genreFilter = $_POST['filter-genre'] != "Any" ? 'genre='.$_POST['filter-genre'] : ""; + $typeFilter = $_POST['filter-type'] != "Any" ? 'type='.$_POST['filter-type'] : ""; + $statusFilter = $_POST['filter-status'] != "Any" ? 'status='.$_POST['filter-status'] : ""; + $ratingFilter = $_POST['filter-rating'] != "Any" ? 'rating='.$_POST['filter-rating'] : ""; + $studioFilter = $_POST['filter-studio'] != "Any" ? 'studio='.$_POST['filter-studio'] : ""; + $sortFilter = $_POST['filter-sort'] != "Any" ? 'sort='.$_POST['filter-sort'] : ""; + $searchFilter = $_POST['filter-search'] != "" ? 'search='.strtolower($_POST['filter-search']) : ""; + + $filterArray = array ( + $searchFilter, $genreFilter, $typeFilter, $statusFilter, $ratingFilter, $studioFilter, $sortFilter + ); + + foreach($filterArray as $f){ + if ($first){ + if ($f != ""){ + $url = $url.$f; + $first = false; + } + } else { + if ($f != ""){ + $url = $url.'&'.$f; + } } } -} -$url = $first ? $url.'page=1' : $url.'&page=1'; + $url = $first ? $url.'page=1' : $url.'&page=1'; + + header("Location: ".$url); +// } else { +// $searchFilter = $data['filter-search'] != "Any" ? 'search='.$data['filter-search'] : ""; +// $genreFilter = $data['filter-genre'] != "Any" ? 'genre='.$data['filter-genre'] : ""; +// $typeFilter = $data['filter-type'] != "Any" ? 'type='.$data['filter-type'] : ""; +// $statusFilter = $data['filter-status'] != "Any" ? 'status='.$data['filter-status'] : ""; +// $ratingFilter = $data['filter-rating'] != "Any" ? 'rating='.$data['filter-rating'] : ""; +// $studioFilter = $data['filter-studio'] != "Any" ? 'studio='.$data['filter-studio'] : ""; +// $sortFilter = $data['filter-sort'] != "Any" ? 'sort='.$data['filter-sort'] : ""; + +// $filterArray = array ( +// $searchFilter, $genreFilter, $typeFilter, $statusFilter, $ratingFilter, $studioFilter, $sortFilter +// ); + +// foreach($filterArray as $f){ +// if ($first){ +// if ($f != ""){ +// $url = $url.$f; +// $first = false; +// } +// } else { +// if ($f != ""){ +// $url = $url.'&'.$f; +// } +// } +// } +// $url = $first ? $url.'page=1' : $url.'&page=1'; + +// http_response_code(200); +// echo json_encode ( +// array ( +// 'status' => 'success', +// 'url' => $url +// ) +// ); +// } + + -header("Location: ".$url); ?> \ No newline at end of file diff --git a/app/models/anime.php b/app/models/anime.php index 4915a1da43b7d20334793f63be52b87950865bf3..957ecc3bbdc11f3cbabd31586aad0a718849d4f4 100644 --- a/app/models/anime.php +++ b/app/models/anime.php @@ -135,7 +135,7 @@ class Anime { return $this->db->fetchAllData(); } - public function getAllAnimeWithFilter($genre, $type, $status, $rating, $studio, $sortColumn, $desc, $limit, $offset) + public function getAllAnimeWithFilter($genre, $type, $status, $rating, $studio, $sortColumn, $desc, $limit, $offset, $search) { $first = true; $genreQuery = $genre ? " genre.name = ".$this->db->processDataType($genre) : ""; @@ -144,7 +144,7 @@ class Anime { $ratingQuery = $rating ? " anime.rating = ".$this->db->processDataType($rating) : ""; $studioQuery = $studio ? " studio.studio_id = ".$studio : ""; $limitQuery = $limit ? ' LIMIT '.$limit.' OFFSET '.$offset : ""; - + $searchQuery = $search ? " LOWER(anime.title) LIKE '%".$search."%' OR LOWER(studio.name) LIKE '%".$search."%' OR LOWER(genre.name) LIKE '%".$search."%' " : ""; if ($sortColumn){ if ($desc){ @@ -166,7 +166,7 @@ class Anime { $additionalQuery = array ( - $genreQuery, $typeQuery, $statusQuery, $ratingQuery, $studioQuery + $genreQuery, $typeQuery, $statusQuery, $ratingQuery, $studioQuery, $searchQuery ); foreach($additionalQuery as $q){ diff --git a/app/public/handler/anime.js b/app/public/handler/anime.js index 36ed66245827882983190c4e5d78d4be3e3a6f98..7b86f8f6d78931e29b3d84ce9b909bc05afc2e01 100644 --- a/app/public/handler/anime.js +++ b/app/public/handler/anime.js @@ -1,3 +1,32 @@ function handleSearch(){ - let val = document.getElementById('search-bar').value; + let search = document.getElementById('search-bar').value; + let genre = document.getElementById('filter-genre').value; + let type = document.getElementById('filter-type').value; + let status = document.getElementById('filter-status').value; + let rating = document.getElementById('filter-rating').value; + let studio = document.getElementById('filter-studio').value; + let sort = document.getElementById('filter-sort').value; + + const xhr = new XMLHttpRequest(); + xhr.open('POST', '../../api/anime/filter.php', true); + xhr.onload = function() { + if (this.status == 200){ + let response = JSON.parse(this.responseText); + if (response.status == 'success'){ + window.location.hred = response.url; + } + } + }; + xhr.send(JSON.stringify( + { + 'filter-search' : search, + 'filter-genre' : genre, + 'filter-type' : type, + 'filter-status' : status, + 'filter-rating' : rating, + 'filter-studio' : studio, + 'filter-sort' : sort, + } + )); + } \ No newline at end of file diff --git a/app/public/style/anime.css b/app/public/style/anime.css index b2aa1ec7a7b1d91466a49aa6174ba10869b22024..5849eab7179d731fab7f61cdc6357437988f4c03 100644 --- a/app/public/style/anime.css +++ b/app/public/style/anime.css @@ -6,7 +6,7 @@ background-color: #dedede; padding-top: 20px; padding-bottom: 20px; - gap: 5px; + gap: 20px; } .filter-part { @@ -75,6 +75,7 @@ justify-content: center; align-items: center; padding: 0px 20px; + gap: 20px; } .search-bar { diff --git a/app/views/anime/index.php b/app/views/anime/index.php index 7531ce7ddb0646f4079ff9bfaf0066f63a17dc9a..aef8ed06e5371e9d4722550f28c0b662275c0c5e 100644 --- a/app/views/anime/index.php +++ b/app/views/anime/index.php @@ -20,6 +20,8 @@ $sortColumn = null; $desc = null; $page = 1; $limitPerPage = 12; +$searchFilter = null; + $filter = explode('&', $path); foreach($filter as $f){ @@ -47,9 +49,11 @@ foreach($filter as $f){ $sortColumn = $sortArr[0]; $desc = $sortArr[1] == 'desc' ? true : false; } + else if ($temp[0] == 'search'){ + $searchFilter = $temp[1]; + } } - $animes = $a->getAllAnimeWithFilter( $genreFilter, $typeFilter, @@ -59,7 +63,8 @@ $animes = $a->getAllAnimeWithFilter( $sortColumn, $desc, $limitPerPage, - ($page-1) * $limitPerPage + ($page-1) * $limitPerPage, + $searchFilter ); $totalAnime = @@ -72,7 +77,8 @@ count($a->getAllAnimeWithFilter( $sortColumn, $desc, null, - null + null, + $searchFilter )); $maxPage = ceil($totalAnime/$limitPerPage); @@ -89,8 +95,8 @@ $maxPage = ceil($totalAnime/$limitPerPage); </head> <body> - <div class="filter-flex"> - <form action='/api/anime/filter.php' method='post' class='filter-part'> + <form action='/api/anime/filter.php' method='post' class="filter-flex"> + <div class='filter-part'> <div class="filter-block"> <label class='filter-label' for='filter-genre'>Genre </label> <select class='filter-select' id='filter-genre' name='filter-genre' placeholder='Genre'> @@ -98,8 +104,9 @@ $maxPage = ceil($totalAnime/$limitPerPage); $genres = $g->getAllGenre(); echo "<option value='Any'> Any </option>"; foreach($genres as $genre){ + $selected = $genreFilter == $genre['name'] ? 'selected' : ""; echo " - <option value=$genre[name]> $genre[name] </option> + <option value=$genre[name] $selected> $genre[name] </option> "; } ?> @@ -109,32 +116,48 @@ $maxPage = ceil($totalAnime/$limitPerPage); <div class="filter-block"> <label class='filter-label' for='filter-type'>Type </label> <select class='filter-select' id='filter-type' name='filter-type' placeholder='Type'> - <option value='Any'> Any </option> - <option value="TV">TV</option> - <option value="MOVIE">Movie</option> - <option value="OVA">OVA</option> + <?php + $typeArr = array('TV', 'MOVIE', 'OVA'); + echo "<option value='Any'> Any </option>"; + foreach ($typeArr as $type) { + $selected = $typeFilter == $type ? 'selected' : ""; + echo " + <option value=$type $selected> $type </option> + "; + } + ?> </select> </div> <div class="filter-block"> <label class='filter-label' for='filter-status'>Status </label> <select class='filter-select' id='filter-status' name='filter-status' placeholder='Status'> - <option value='Any'> Any </option> - <option value="ON-GOING">On Going</option> - <option value="COMPLETED">Completed</option> - <option value="HIATUS">Hiatus</option> - <option value="UPCOMING">Upcoming</option> + <?php + $statusArr = array('ON-GOING', 'COMPLETED', 'HIATUS', 'UPCOMING'); + echo "<option value='Any'> Any </option>"; + foreach ($statusArr as $status) { + $selected = $statusFilter == $status ? 'selected' : ""; + echo " + <option value=$status $selected> $status </option> + "; + } + ?> </select> </div> <div class="filter-block"> <label class='filter-label' for='filter-rating'>Rating </label> <select class='filter-select' id='filter-rating' name='filter-rating' placeholder='Rating'> - <option value='Any'> Any </option> - <option value="G">G</option> - <option value="PG-13">PG-13</option> - <option value="R(17+)">R(17+)</option> - <option value="Rx">Rx</option> + <?php + $ratingArr = array('G', 'PG-13', 'R(17+)', 'Rx'); + echo "<option value='Any'> Any </option>"; + foreach ($ratingArr as $rating) { + $selected = $ratingFilter == $rating ? 'selected' : ""; + echo " + <option value=$rating $selected> $rating </option> + "; + } + ?> </select> </div> @@ -142,14 +165,15 @@ $maxPage = ceil($totalAnime/$limitPerPage); <label class='filter-label' for='filter-studio'>Studio </label> <select class='filter-select' id='filter-studio' name='filter-studio' placeholder='Studio'> <?php - $studios = $s->getAllStudio(); - echo "<option value='Any'> Any </option>"; - // Special for studio, use Studio ID - foreach($studios as $studio){ - echo " - <option value=$studio[studio_id]> $studio[name] </option> - "; - } + $studios = $s->getAllStudio(); + echo "<option value='Any'> Any </option>"; + // Special for studio, use Studio ID + foreach($studios as $studio){ + $selected = $studioFilter == $studio['studio_id'] ? 'selected' : ""; + echo " + <option value=$studio[studio_id] $selected> $studio[name] </option> + "; + } ?> </select> </div> @@ -157,24 +181,37 @@ $maxPage = ceil($totalAnime/$limitPerPage); <div class="filter-block"> <label class='filter-label' for='filter-sort'>Sort </label> <select class='filter-select' id='filter-sort' name='filter-sort' placeholder='Sort'> - <option value='Any'> None </option> - <option value="title.asc">Title Ascending</option> - <option value="title.desc">Title Descending</option> - <option value="score.asc">Score Ascending</option> - <option value="score.desc">Score Descending</option> - <option value="release_date.asc">Release Date Ascending</option> - <option value="release_date.desc">Release Date Descending</option> + <?php + $sortListArr = array ( + "title.asc" => 'Title Ascending', + "title.desc" => 'Title Descending', + "score.asc" => 'Score Ascending', + "score.desc" => 'Score Descending', + "release_date.asc" => 'Release Date Ascending', + "release_date.desc" => 'Release Date Descending' + ); + echo "<option value='Any'> Any </option>"; + foreach ($sortListArr as $key => $value) { + $selected = $sortArr[0].'.'.$sortArr[1] == $key ? 'selected' : ''; + echo " + <option value=$key $selected> $value </option> + "; + } + + ?> </select> </div> - - <input class='filter-submit-btn' type='submit' value='Submit Filter'> - </form> + </div> + <div class='search-part'> <div class='search-bar'> - <input class='search-bar' id='search-bar' type='text' onkeyup='handleSearch()' placeholder='Search...'> + <input class='search-bar' id='filter-search' name='filter-search' type='text' placeholder='Search...'> </div> + + <input class='filter-submit-btn' type='submit' value='Submit Filter'> </div> - </div> + + </form> <div class="flex-wrap"> <?php