Added manga controller
This commit is contained in:
parent
77d2c29e38
commit
c96bbb92c5
@ -20,8 +20,8 @@ class Router {
|
||||
*/
|
||||
public function get_route()
|
||||
{
|
||||
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
$route = $this->router->match($path, $_SERVER);
|
||||
//$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
$route = $this->router->match($_SERVER['REQUEST_URI'], $_SERVER);
|
||||
|
||||
return $route;
|
||||
}
|
||||
@ -34,6 +34,8 @@ class Router {
|
||||
*/
|
||||
public function dispatch($route = NULL)
|
||||
{
|
||||
global $defaultHandler;
|
||||
|
||||
if (is_null($route))
|
||||
{
|
||||
$route = $this->get_route();
|
||||
@ -41,6 +43,9 @@ class Router {
|
||||
|
||||
if ( ! $route)
|
||||
{
|
||||
$failure = $this->router->getFailedRoute();
|
||||
$defaultHandler->addDataTable('failed_route', (array)$failure);
|
||||
|
||||
$controller_name = 'BaseController';
|
||||
$action_method = 'outputHTML';
|
||||
$params = [
|
||||
@ -49,6 +54,7 @@ class Router {
|
||||
'title' => 'Page Not Found'
|
||||
]
|
||||
];
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -66,18 +72,22 @@ class Router {
|
||||
private function _setup_routes()
|
||||
{
|
||||
$host = $_SERVER['HTTP_HOST'];
|
||||
$controller_class = ($host == "anime.timshomepage.net") ? "AnimeController" : "MangaController";
|
||||
$route_type = "";
|
||||
switch($host)
|
||||
{
|
||||
case "anime.timshomepage.net":
|
||||
$route_type = "anime";
|
||||
break;
|
||||
|
||||
case "manga.timshomepage.net":
|
||||
$route_type = "manga";
|
||||
break;
|
||||
}
|
||||
|
||||
$routes = require __DIR__ . '/../config/routes.php';
|
||||
|
||||
// Add the default route
|
||||
$this->router->add('home', '/')->addValues([
|
||||
'controller' => $controller_class,
|
||||
'action' => 'index'
|
||||
]);
|
||||
|
||||
// Add routes by the configuration file
|
||||
foreach($routes as $name => $route)
|
||||
foreach($routes[$route_type] as $name => $route)
|
||||
{
|
||||
$path = $route['path'];
|
||||
unset($route['path']);
|
||||
|
@ -1,42 +1,95 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'anime_all' => [
|
||||
'path' => '/all',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'all',
|
||||
'params' => []
|
||||
],
|
||||
'anime_plan_to_watch' => [
|
||||
'path' => '/plan_to_watch',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'plan-to-watch'
|
||||
'anime' => [
|
||||
'index' => [
|
||||
'path' => '/',
|
||||
'controller' => 'AnimeController'
|
||||
],
|
||||
'all' => [
|
||||
'path' => '/all',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'all'
|
||||
],
|
||||
'plan_to_watch' => [
|
||||
'path' => '/plan_to_watch',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'plan-to-watch'
|
||||
]
|
||||
],
|
||||
'on_hold' => [
|
||||
'path' => '/on_hold',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'on-hold'
|
||||
]
|
||||
],
|
||||
'dropped' => [
|
||||
'path' => '/dropped',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'dropped'
|
||||
]
|
||||
],
|
||||
'completed' => [
|
||||
'path' => '/completed',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'completed'
|
||||
]
|
||||
],
|
||||
'anime_login' => [
|
||||
'path' => '/login',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'login'
|
||||
]
|
||||
],
|
||||
'anime_on_hold' => [
|
||||
'path' => '/on_hold',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'on-hold'
|
||||
]
|
||||
],
|
||||
'anime_dropped' => [
|
||||
'path' => '/dropped',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'dropped'
|
||||
]
|
||||
],
|
||||
'anime_completed' => [
|
||||
'path' => '/completed',
|
||||
'controller' => 'AnimeController',
|
||||
'action' => 'anime_list',
|
||||
'params' => [
|
||||
'type' => 'completed'
|
||||
]
|
||||
'manga' => [
|
||||
'index' => [
|
||||
'path' => '/',
|
||||
'controller' => 'MangaController'
|
||||
],
|
||||
'all' => [
|
||||
'path' => '/all',
|
||||
'controller' => 'MangaController',
|
||||
'action' => 'all'
|
||||
],
|
||||
'plan_to_read' => [
|
||||
'path' => '/plan_to_read',
|
||||
'controller' => 'MangaController',
|
||||
'action' => 'manga_list',
|
||||
'params' => [
|
||||
'type' => 'Plan to Read'
|
||||
]
|
||||
],
|
||||
'on_hold' => [
|
||||
'path' => '/on_hold',
|
||||
'controller' => 'MangaController',
|
||||
'action' => 'manga_list',
|
||||
'params' => [
|
||||
'type' => 'On Hold'
|
||||
]
|
||||
],
|
||||
'dropped' => [
|
||||
'path' => '/dropped',
|
||||
'controller' => 'MangaController',
|
||||
'action' => 'manga_list',
|
||||
'params' => [
|
||||
'type' => 'Dropped'
|
||||
]
|
||||
],
|
||||
'completed' => [
|
||||
'path' => '/completed',
|
||||
'controller' => 'MangaController',
|
||||
'action' => 'manga_list',
|
||||
'params' => [
|
||||
'type' => 'Completed'
|
||||
]
|
||||
],
|
||||
]
|
||||
];
|
@ -37,5 +37,11 @@ class AnimeController extends BaseController {
|
||||
'sections' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
public function login()
|
||||
{
|
||||
$data = $this->model->authenticate();
|
||||
//print_r($data);
|
||||
}
|
||||
}
|
||||
// End of AnimeController.php
|
47
app/controllers/MangaController.php
Normal file
47
app/controllers/MangaController.php
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
class MangaController extends BaseController {
|
||||
|
||||
private $model;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->model = new MangaModel();
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
parent::__destruct();
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$this->manga_list('Reading');
|
||||
}
|
||||
|
||||
public function all()
|
||||
{
|
||||
$data = $this->model->get_all_lists();
|
||||
$this->outputHTML('manga_list', [
|
||||
'title' => "Tim's Manga List · All",
|
||||
'sections' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
public function manga_list($type, $title="Tim's Manga List")
|
||||
{
|
||||
$data = $this->model->get_list($type);
|
||||
$this->outputHTML('manga_list', [
|
||||
'title' => $title,
|
||||
'sections' => [$type => $data]
|
||||
]);
|
||||
}
|
||||
|
||||
public function login()
|
||||
{
|
||||
$data = $this->model->authenticate();
|
||||
//print_r($data);
|
||||
}
|
||||
}
|
||||
// End of MangaController.php
|
@ -23,10 +23,10 @@ class AnimeModel extends BaseModel {
|
||||
{
|
||||
$output = [
|
||||
'Watching' => [],
|
||||
'Completed' => [],
|
||||
'Plan to Watch' => [],
|
||||
'On Hold' => [],
|
||||
'Dropped' => []
|
||||
'Dropped' => [],
|
||||
'Completed' => [],
|
||||
];
|
||||
|
||||
$data = $this->_get_list();
|
||||
@ -76,10 +76,10 @@ class AnimeModel extends BaseModel {
|
||||
{
|
||||
$map = [
|
||||
'currently-watching' => 'Watching',
|
||||
'completed' => 'Completed',
|
||||
'plan-to-watch' => 'Plan to Watch',
|
||||
'on-hold' => 'On Hold',
|
||||
'dropped' => 'Dropped'
|
||||
'dropped' => 'Dropped',
|
||||
'completed' => 'Completed',
|
||||
];
|
||||
|
||||
$data = $this->_get_list($type);
|
||||
|
130
app/models/MangaModel.php
Normal file
130
app/models/MangaModel.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Model for handling requests dealing with the manga list
|
||||
*/
|
||||
class MangaModel extends BaseModel {
|
||||
|
||||
protected $client;
|
||||
protected $cookieJar;
|
||||
protected $base_url = "https://hummingbird.me";
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full set of anime lists
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_all_lists()
|
||||
{
|
||||
$data = $this->_get_list();
|
||||
|
||||
foreach ($data as $key => &$val)
|
||||
{
|
||||
$this->sort_by_name($val);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a category out of the full list
|
||||
*
|
||||
* @param string $type
|
||||
* @return array
|
||||
*/
|
||||
public function get_list($type)
|
||||
{
|
||||
$data = $this->_get_list($type);
|
||||
|
||||
$this->sort_by_name($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function _get_list($type="all")
|
||||
{
|
||||
global $defaultHandler;
|
||||
|
||||
$config = [
|
||||
'query' => [
|
||||
'user_id' => 'timw4mail',
|
||||
],
|
||||
'allow_redirects' => false
|
||||
];
|
||||
|
||||
$response = $this->client->get($this->_url('/manga_library_entries'), $config);
|
||||
|
||||
$defaultHandler->addDataTable('response', (array)$response);
|
||||
|
||||
if ($response->getStatusCode() != 200)
|
||||
{
|
||||
throw new Exception($response->getEffectiveUrl());
|
||||
}
|
||||
|
||||
// Reorganize data to be more usable
|
||||
$raw_data = $response->json();
|
||||
|
||||
$data = [
|
||||
'Reading' => [],
|
||||
'Plan to Read' => [],
|
||||
'On Hold' => [],
|
||||
'Dropped' => [],
|
||||
'Completed' => [],
|
||||
];
|
||||
$manga_data = [];
|
||||
|
||||
foreach($raw_data['manga'] as $manga)
|
||||
{
|
||||
$manga_data[$manga['id']] = $manga;
|
||||
}
|
||||
|
||||
foreach($raw_data['manga_library_entries'] as $entry)
|
||||
{
|
||||
$entry['manga'] = $manga_data[$entry['manga_id']];
|
||||
|
||||
switch($entry['status'])
|
||||
{
|
||||
case "Plan to Read":
|
||||
$data['Plan to Read'][] = $entry;
|
||||
break;
|
||||
|
||||
case "Dropped":
|
||||
$data['Dropped'][] = $entry;
|
||||
break;
|
||||
|
||||
case "On Hold":
|
||||
$data['On Hold'][] = $entry;
|
||||
break;
|
||||
|
||||
case "Currently Reading":
|
||||
$data['Reading'][] = $entry;
|
||||
break;
|
||||
|
||||
case "Completed":
|
||||
default:
|
||||
$data['Completed'][] = $entry;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (array_key_exists($type, $data)) ? $data[$type] : $data;
|
||||
}
|
||||
|
||||
private function sort_by_name(&$array)
|
||||
{
|
||||
$sort = array();
|
||||
|
||||
foreach($array as $key => $item)
|
||||
{
|
||||
$sort[$key] = $item['manga']['romaji_title'];
|
||||
}
|
||||
|
||||
array_multisort($sort, SORT_ASC, $array);
|
||||
}
|
||||
}
|
||||
// End of MangaModel.php
|
8
app/views/anime_edit.php
Normal file
8
app/views/anime_edit.php
Normal file
@ -0,0 +1,8 @@
|
||||
<body>
|
||||
<?php include 'anime_nav.php' ?>
|
||||
<main>
|
||||
<form action="<?= $action ?>" method="post">
|
||||
</form>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
@ -1,16 +1,7 @@
|
||||
<?php include 'header.php' ?>
|
||||
<body>
|
||||
<h1>Tim's Anime List</h1>
|
||||
<nav>
|
||||
<ul>
|
||||
<li class="<?= is_selected('/all', $route_path) ?>"><a href="/all">All</a></li>
|
||||
<li class="<?= is_selected('/', $route_path) ?>"><a href="/">Watching</a></li>
|
||||
<li class="<?= is_selected('/plan_to_watch', $route_path) ?>"><a href="/plan_to_watch">Plan to Watch</a></li>
|
||||
<li class="<?= is_selected('/on_hold', $route_path) ?>"><a href="/on_hold">On Hold</a></li>
|
||||
<li class="<?= is_selected('/dropped', $route_path) ?>"><a href="/dropped">Dropped</a></li>
|
||||
<li class="<?= is_selected('/completed', $route_path) ?>"><a href="/completed">Completed</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<h1>Tim's Anime List [<a href="//manga.timshomepage.net">Manga List</a>]</h1>
|
||||
<?php include 'anime_nav.php' ?>
|
||||
<main>
|
||||
<?php foreach ($sections as $name => $items): ?>
|
||||
<section class="status">
|
||||
@ -27,7 +18,7 @@
|
||||
<div class="media_type"><?= $item['anime']['show_type'] ?></div>
|
||||
<div class="airing_status"><?= $item['anime']['status'] ?></div>
|
||||
<div class="user_rating"><?= (int)($item['rating']['value'] * 2) ?> / 10</div>
|
||||
<div class="completion"><?= $item['episodes_watched'] ?> / <?= $item['anime']['episode_count'] ?></div>
|
||||
<div class="completion">Episodes: <?= $item['episodes_watched'] ?> / <?= $item['anime']['episode_count'] ?></div>
|
||||
</div>
|
||||
</article>
|
||||
<?php endforeach ?>
|
||||
|
10
app/views/anime_nav.php
Normal file
10
app/views/anime_nav.php
Normal file
@ -0,0 +1,10 @@
|
||||
<nav>
|
||||
<ul>
|
||||
<li class="<?= is_selected('/', $route_path) ?>"><a href="/">Watching</a></li>
|
||||
<li class="<?= is_selected('/plan_to_watch', $route_path) ?>"><a href="/plan_to_watch">Plan to Watch</a></li>
|
||||
<li class="<?= is_selected('/on_hold', $route_path) ?>"><a href="/on_hold">On Hold</a></li>
|
||||
<li class="<?= is_selected('/dropped', $route_path) ?>"><a href="/dropped">Dropped</a></li>
|
||||
<li class="<?= is_selected('/completed', $route_path) ?>"><a href="/completed">Completed</a></li>
|
||||
<li class="<?= is_selected('/all', $route_path) ?>"><a href="/all">All</a></li>
|
||||
</ul>
|
||||
</nav>
|
40
app/views/manga_list.php
Normal file
40
app/views/manga_list.php
Normal file
@ -0,0 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title><?= $title ?></title>
|
||||
<link rel="stylesheet" href="/public/css/marx.css" />
|
||||
<link rel="stylesheet" href="/public/css/base.css" />
|
||||
<link rel="stylesheet" href="/public/css/manga.css" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Tim's Manga List [<a href="//anime.timshomepage.net">Anime List</a>]</h1>
|
||||
<?php include 'manga_nav.php' ?>
|
||||
<main>
|
||||
<?php foreach ($sections as $name => $items): ?>
|
||||
<section class="status">
|
||||
<h2><?= $name ?></h2>
|
||||
<section class="media-wrap">
|
||||
<?php foreach($items as $item): ?>
|
||||
<article class="media" id="manga-<?= $item['manga']['id'] ?>">
|
||||
<img src="<?= $item['manga']['poster_image'] ?>" />
|
||||
<div class="name"><a href="https://hummingbird.me/manga/<?= $item['manga']['id'] ?>">
|
||||
<?= $item['manga']['romaji_title'] ?>
|
||||
<?= (isset($item['manga']['english_title'])) ? "<br />({$item['manga']['english_title']})" : ""; ?>
|
||||
</a></div>
|
||||
<div class="media_metadata">
|
||||
<div class="media_type"><?= $item['manga']['manga_type'] ?></div>
|
||||
<?php /*<div class="airing_status"><?= $item['manga']['status'] ?></div>*/ ?>
|
||||
<div class="user_rating"><?= ($item['rating'] > 0) ? (int)($item['rating'] * 2) : '-' ?> / 10</div>
|
||||
<div class="completion">
|
||||
Chapters: <?= $item['chapters_read'] ?> / <?= ($item['manga']['chapter_count'] > 0) ? $item['manga']['chapter_count'] : "-" ?><?php /*<br />
|
||||
Volumes: <?= $item['volumes_read'] ?> / <?= ($item['manga']['volume_count'] > 0) ? $item['manga']['volume_count'] : "-" ?>*/ ?>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<?php endforeach ?>
|
||||
</section>
|
||||
</section>
|
||||
<?php endforeach ?>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
10
app/views/manga_nav.php
Normal file
10
app/views/manga_nav.php
Normal file
@ -0,0 +1,10 @@
|
||||
<nav>
|
||||
<ul>
|
||||
<li class="<?= is_selected('/', $route_path) ?>"><a href="/">Reading</a></li>
|
||||
<li class="<?= is_selected('/plan_to_read', $route_path) ?>"><a href="/plan_to_read">Plan to Read</a></li>
|
||||
<li class="<?= is_selected('/on_hold', $route_path) ?>"><a href="/on_hold">On Hold</a></li>
|
||||
<li class="<?= is_selected('/dropped', $route_path) ?>"><a href="/dropped">Dropped</a></li>
|
||||
<li class="<?= is_selected('/completed', $route_path) ?>"><a href="/completed">Completed</a></li>
|
||||
<li class="<?= is_selected('/all', $route_path) ?>"><a href="/all">All</a></li>
|
||||
</ul>
|
||||
</nav>
|
@ -3,6 +3,8 @@
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
require __DIR__ . '/app/base/autoloader.php';
|
||||
|
||||
session_start();
|
||||
|
||||
use \Whoops\Handler\PrettyPageHandler;
|
||||
use \Whoops\Handler\JsonResponseHandler;
|
||||
|
||||
|
@ -1,3 +1,7 @@
|
||||
body {
|
||||
margin: 0.5em;
|
||||
}
|
||||
|
||||
.media-wrap {
|
||||
text-align:center;
|
||||
margin:0 auto;
|
||||
@ -59,8 +63,3 @@
|
||||
.user_rating::before {
|
||||
content: "Rating: ";
|
||||
}
|
||||
|
||||
.completion::before {
|
||||
content: "Episodes: ";
|
||||
}
|
||||
|
||||
|
13
public/css/manga.css
Normal file
13
public/css/manga.css
Normal file
@ -0,0 +1,13 @@
|
||||
.media {
|
||||
position:relative;
|
||||
vertical-align:top;
|
||||
display:inline-block;
|
||||
text-align:center;
|
||||
width:200px;
|
||||
height:290px;
|
||||
margin:0.25em;
|
||||
}
|
||||
|
||||
.completion::before {
|
||||
content: "";
|
||||
}
|
Loading…
Reference in New Issue
Block a user