Simplify routing

This commit is contained in:
Timothy Warren 2016-01-06 11:08:56 -05:00
parent b4489311c9
commit 3c124456d0
22 changed files with 1032 additions and 400 deletions

View File

@ -34,11 +34,4 @@ $config = [
// path to public directory on the server // path to public directory on the server
'asset_dir' => realpath(__DIR__ . '/../../public'), 'asset_dir' => realpath(__DIR__ . '/../../public'),
// ----------------------------------------------------------------------------
// Included config files
// ----------------------------------------------------------------------------
// Routing paths and options
'routing' => require __DIR__ . '/routing.php',
]; ];

View File

@ -11,15 +11,41 @@
* @license MIT * @license MIT
*/ */
use Aviat\AnimeClient\AnimeClient;
return [ return [
'convention' => [ // -------------------------------------------------------------------------
'default_namespace' => '\\Aviat\\AnimeClient\\Controller', // Routing options
'default_controller' => '\\Aviat\\AnimeClient\\Controller\\Anime', //
'default_method' => 'index', // Specify default paths and views
'404_method' => 'not_found' // -------------------------------------------------------------------------
'route_config' => [
// Subfolder prefix for url, if in a subdirectory of the web root
'subfolder_prefix' => '',
// Path to public directory, where images/css/javascript are located,
// appended to the url
'asset_path' => '/public',
// Which list should be the default?
'default_list' => 'anime', // anime or manga
// Default pages for anime/manga
'default_anime_list_path' => "watching", // watching|plan_to_watch|on_hold|dropped|completed|all
'default_manga_list_path' => "reading", // reading|plan_to_read|on_hold|dropped|completed|all
// Default view type (cover_view/list_view)
'default_view_type' => 'cover_view',
], ],
// Routes on anime collection controller // -------------------------------------------------------------------------
'anime' => [ // Routing Config
//
// Maps paths to controlers and methods
// -------------------------------------------------------------------------
'routes' => [
// ---------------------------------------------------------------------
// Anime List Routes
// ---------------------------------------------------------------------
'anime_add_form' => [ 'anime_add_form' => [
'path' => '/anime/add', 'path' => '/anime/add',
'action' => 'add_form', 'action' => 'add_form',
@ -29,12 +55,10 @@ return [
'path' => '/anime/add', 'path' => '/anime/add',
'action' => 'add', 'action' => 'add',
'verb' => 'post' 'verb' => 'post'
] ],
], // ---------------------------------------------------------------------
'manga' => [ // Anime Collection Routes
// ---------------------------------------------------------------------
],
'collection' => [
'collection_search' => [ 'collection_search' => [
'path' => '/collection/search', 'path' => '/collection/search',
'action' => 'search' 'action' => 'search'
@ -69,5 +93,58 @@ return [
'view' => '[a-z_]+' 'view' => '[a-z_]+'
] ]
], ],
], // ---------------------------------------------------------------------
]; // Default / Shared routes
// ---------------------------------------------------------------------
'login' => [
'path' => '/{controller}/login',
'action' => 'login',
'verb' => 'get'
],
'login_post' => [
'path' => '/{controller}/login',
'action' => 'login_action',
'verb' => 'post'
],
'logout' => [
'path' => '/{controller}/logout',
'action' => 'logout'
],
'update' => [
'path' => '/{controller}/update',
'action' => 'update',
'tokens' => [
'controller' => '[a-z_]+'
]
],
'update_form' => [
'path' => '/{controller}/update_form',
'action' => 'form_update',
'verb' => 'post',
'tokens' => [
'controller' => '[a-z_]+'
]
],
'edit' => [
'path' => '/{controller}/edit/{id}/{status}',
'action' => 'edit',
'tokens' => [
'id' => '[0-9a-z_]+',
'status' => '[a-zA-z\- ]+',
]
],
'list' => [
'path' => '/{controller}/{type}{/view}',
'action' => AnimeClient::DEFAULT_CONTROLLER_METHOD,
'tokens' => [
'type' => '[a-z_]+',
'view' => '[a-z_]+'
]
],
'index_redirect' => [
'path' => '/',
'controller' => AnimeClient::DEFAULT_CONTROLLER_NAMESPACE,
'action' => 'redirect_to_default'
],
]
];

View File

@ -1,35 +0,0 @@
<?php
/**
* Hummingbird Anime Client
*
* An API client for Hummingbird to manage anime and manga watch lists
*
* @package HummingbirdAnimeClient
* @author Timothy J. Warren
* @copyright Copyright (c) 2015 - 2016
* @link https://github.com/timw4mail/HummingBirdAnimeClient
* @license MIT
*/
// ----------------------------------------------------------------------------
// Routing
// ----------------------------------------------------------------------------
return [
// Subfolder prefix for url, if in a subdirectory of the web root
'subfolder_prefix' => '',
// Path to public directory, where images/css/javascript are located,
// appended to the url
'asset_path' => '/public',
// Which list should be the default?
'default_list' => 'anime', // anime or manga
// Default pages for anime/manga
'default_anime_list_path' => "watching", // watching|plan_to_watch|on_hold|dropped|completed|all
'default_manga_list_path' => "reading", // reading|plan_to_read|on_hold|dropped|completed|all
// Default view type (cover_view/list_view)
'default_view_type' => 'cover_view',
];

View File

@ -32,13 +32,18 @@
<?php endif ?> <?php endif ?>
<?php if ($item['private'] || $item['rewatching']): ?> <?php if ($item['private'] || $item['rewatching']): ?>
<div class="row"> <div class="row">
<?php foreach(['private', 'rereading'] as $attr): ?> <?php foreach(['private', 'rewatching'] as $attr): ?>
<?php if($item[$attr]): ?> <?php if($item[$attr]): ?>
<span class="item-<?= $attr ?>"><?= ucfirst($attr) ?></span> <span class="item-<?= $attr ?>"><?= ucfirst($attr) ?></span>
<?php endif ?> <?php endif ?>
<?php endforeach ?> <?php endforeach ?>
</div> </div>
<?php endif ?> <?php endif ?>
<?php if ($item['rewatched'] > 0): ?>
<div class="row">
<div>Rewatched <?= $item['rewatched'] ?> time(s)</div>
</div>
<?php endif ?>
<div class="row"> <div class="row">
<div class="user_rating">Rating: <?= $item['user_rating'] ?> / 10</div> <div class="user_rating">Rating: <?= $item['user_rating'] ?> / 10</div>
<div class="completion">Episodes: <div class="completion">Episodes:

View File

@ -48,6 +48,9 @@
</td> </td>
<td><?= $item['anime']['age_rating'] ?></td> <td><?= $item['anime']['age_rating'] ?></td>
<td> <td>
<?php if ($item['rewatched'] > 0): ?>
Rewatched <?= $item['rewatched'] ?> time(s)<br />
<?php endif ?>
<?php $attr_list = []; ?> <?php $attr_list = []; ?>
<?php foreach(['private','rewatching'] as $attr): ?> <?php foreach(['private','rewatching'] as $attr): ?>
<?php if($item[$attr]): ?> <?php if($item[$attr]): ?>

5
app/views/error.php Normal file
View File

@ -0,0 +1,5 @@
<main>
<h1><?= $title ?></h1>
<h2><?= $message ?></h2>
<div><?= $log_message ?></div>
</main>

View File

@ -22,14 +22,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<td><label for="private">Is Private?</label></td>
<td>
<input type="checkbox" name="private" id="private"
<?php if($item['private']): ?>checked="checked"<?php endif ?>
/>
</td>
</tr>
<tr> <tr>
<td><label for="status">Reading Status</label></td> <td><label for="status">Reading Status</label></td>
<td> <td>

View File

@ -353,6 +353,10 @@ button {
Manga-list-specific styles Manga-list-specific styles
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
.manga .row {
padding: 1px;
}
.manga .media { .manga .media {
border: 1px solid #ddd; border: 1px solid #ddd;
width: 200px; width: 200px;
@ -362,6 +366,8 @@ button {
.manga .media > .edit_buttons { .manga .media > .edit_buttons {
position: absolute; position: absolute;
top: 86px;
top: calc(50% - 58.5px); top: calc(50% - 58.5px);
left: 5px;
left: calc(50% - 95px); left: calc(50% - 95px);
} }

View File

@ -275,6 +275,10 @@ button {
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
Manga-list-specific styles Manga-list-specific styles
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
.manga .row {
padding:1px;
}
.manga .media { .manga .media {
border:1px solid #ddd; border:1px solid #ddd;
width:200px; width:200px;
@ -284,6 +288,8 @@ button {
.manga .media > .edit_buttons { .manga .media > .edit_buttons {
position:absolute; position:absolute;
top: calc(50% - (117px / 2)); top: 86px;
left: calc(50% - (190px / 2)); top: calc(50% - 58.5px);
left: 5px;
left: calc(50% - 95px);
} }

View File

@ -1,167 +1,229 @@
:root { :root {
box-sizing: border-box; box-sizing: border-box;
cursor: default; cursor: default;
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif; font-family: 'Open Sans', 'Nimbus Sans L', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif;
line-height: 1.4; line-height: 1.4;
overflow-y: scroll; overflow-y: scroll;
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%; -ms-text-size-adjust: 100%;
text-size-adjust: 100%; } text-size-adjust: 100%;
}
audio:not([controls]) { audio:not([controls]) {
display: none; } display: none;
}
details { details {
display: block; } display: block;
}
/*input[type="number"] { /*input[type="number"] {
width: auto; }*/ width: auto; }*/
input[type="search"] { input[type="search"] {
-webkit-appearance: textfield; } -webkit-appearance: textfield;
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { }
-webkit-appearance: none; }
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
main { main {
display: block; } display: block;
}
summary { summary {
display: block; } display: block;
}
pre { pre {
overflow: auto; } overflow: auto;
}
progress { progress {
display: inline-block; } display: inline-block;
}
small { small {
font-size: 75%; } font-size: 75%;
}
big { big {
font-size: 125%; } font-size: 125%;
}
template { template {
display: none; } display: none;
}
textarea { textarea {
overflow: auto; overflow: auto;
resize: vertical; } resize: vertical;
}
[hidden] { [hidden] {
display: none; } display: none;
}
[unselectable] { [unselectable] {
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
user-select: none; } user-select: none;
}
*, ::before, ::after { *,
::before,
::after {
border-style: solid; border-style: solid;
border-width: 0; border-width: 0;
box-sizing: inherit; } box-sizing: inherit;
}
* { * {
font-size: inherit; font-size: inherit;
line-height: inherit; line-height: inherit;
margin: 0; margin: 0;
padding: 0; } padding: 0;
}
::before, ::after { ::before,
::after {
text-decoration: inherit; text-decoration: inherit;
vertical-align: inherit; } vertical-align: inherit;
}
a { a {
text-decoration: none; } text-decoration: none;
}
audio, canvas, iframe, img, svg, video { audio,
vertical-align: middle; } canvas,
iframe,
img,
svg,
video {
vertical-align: middle;
}
button, input, select, textarea { button,
input,
select,
textarea {
/*background-color: transparent;*/ /*background-color: transparent;*/
border: .1rem solid #ccc; border: .1rem solid #ccc;
color: inherit; color: inherit;
font-family: inherit; font-family: inherit;
font-style: inherit; font-style: inherit;
font-weight: inherit; font-weight: inherit;
min-height: 1.4em; } min-height: 1.4em;
}
code, kbd, pre, samp { code,
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace, monospace; } kbd,
pre,
samp {
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace, monospace;
}
table { table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; } border-spacing: 0;
}
::-moz-selection { ::-moz-selection {
background-color: #b3d4fc; background-color: #b3d4fc;
text-shadow: none; } text-shadow: none;
}
::selection { ::selection {
background-color: #b3d4fc; background-color: #b3d4fc;
text-shadow: none; } text-shadow: none;
}
button::-moz-focus-inner { button::-moz-focus-inner {
border: 0; } border: 0;
}
@media screen { @media screen {
[hidden~="screen"] { [hidden~="screen"] {
display: inherit; } display: inherit;
}
[hidden~="screen"]:not(:active):not(:focus):not(:target) { [hidden~="screen"]:not(:active):not(:focus):not(:target) {
clip: rect(0 0 0 0) !important; clip: rect(0 0 0 0) !important;
position: absolute !important; } } position: absolute !important;
}
}
body { body {
color: #444; color: #444;
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif; font-family: 'Open Sans', 'Nimbus Sans L', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif;
font-size: 1.6rem; font-size: 1.6rem;
font-style: normal; font-style: normal;
font-weight: 400; } font-weight: 400;
}
p { p {
margin: 0 0 1.6rem; } margin: 0 0 1.6rem;
}
h1, h2, h3, h4, h5, h6 { h1,
font-family: 'Lato', 'Open Sans', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif; h2,
margin: 2rem 0 1.6rem; } h3,
h4,
h5,
h6 {
font-family: 'Lato', 'Open Sans', 'Nimbus Sans L', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif;
margin: 2rem 0 1.6rem;
}
h1 { h1 {
border-bottom: .1rem solid rgba(0, 0, 0, 0.2); border-bottom: .1rem solid rgba(0, 0, 0, 0.2);
font-size: 3.6rem; font-size: 3.6rem;
font-style: normal; font-style: normal;
font-weight: 500; } font-weight: 500;
}
h2 { h2 {
font-size: 3rem; font-size: 3rem;
font-style: normal; font-style: normal;
font-weight: 500; } font-weight: 500;
}
h3 { h3 {
font-size: 2.4rem; font-size: 2.4rem;
font-style: normal; font-style: normal;
font-weight: 500; font-weight: 500;
margin: 1.6rem 0 0.4rem; } margin: 1.6rem 0 0.4rem;
}
h4 { h4 {
font-size: 1.8rem; font-size: 1.8rem;
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
margin: 1.6rem 0 0.4rem; } margin: 1.6rem 0 0.4rem;
}
h5 { h5 {
font-size: 1.6rem; font-size: 1.6rem;
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
margin: 1.6rem 0 0.4rem; } margin: 1.6rem 0 0.4rem;
}
h6 { h6 {
color: #777; color: #777;
font-size: 1.4rem; font-size: 1.4rem;
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
margin: 1.6rem 0 0.4rem; } margin: 1.6rem 0 0.4rem;
}
small { small {
color: #777; } color: #777;
}
pre { pre {
background: #efefef; background: #efefef;
@ -172,7 +234,8 @@ pre {
margin: 1.6rem 0; margin: 1.6rem 0;
padding: 1.6rem; padding: 1.6rem;
word-break: break-all; word-break: break-all;
word-wrap: break-word; } word-wrap: break-word;
}
code { code {
background: #efefef; background: #efefef;
@ -180,51 +243,73 @@ code {
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
font-size: 1.4rem; font-size: 1.4rem;
word-break: break-all; word-break: break-all;
word-wrap: break-word; } word-wrap: break-word;
}
a { a {
color: #1271db; color: #1271db;
-webkit-transition: .25s ease; -webkit-transition: .25s ease;
transition: .25s ease; } transition: .25s ease;
a:hover, a:focus { }
text-decoration: none; }
a:hover,
a:focus {
text-decoration: none;
}
dl { dl {
margin-bottom: 1.6rem; } margin-bottom: 1.6rem;
}
dd { dd {
margin-left: 4rem; } margin-left: 4rem;
}
ul, ol { ul,
ol {
margin-bottom: 0.8rem; margin-bottom: 0.8rem;
padding-left: 2rem; } padding-left: 2rem;
}
blockquote { blockquote {
border-left: .2rem solid #1271db; border-left: .2rem solid #1271db;
font-family: Georgia, Times, 'Times New Roman', serif; font-family: Georgia, Times, 'Times New Roman', serif;
font-style: italic; font-style: italic;
margin: 1.6rem 0; margin: 1.6rem 0;
padding-left: 1.6rem; } padding-left: 1.6rem;
}
figcaption { figcaption {
font-family: Georgia, Times, 'Times New Roman', serif; } font-family: Georgia, Times, 'Times New Roman', serif;
}
html { html {
font-size: 62.5%; } font-size: 62.5%;
}
body { body {
padding: 0; } padding: 0;
}
main, header, footer, article, section, aside, details, summary { main,
header,
footer,
article,
section,
aside,
details,
summary {
display: block; display: block;
height: auto; height: auto;
margin: 0 auto; margin: 0 auto;
width: 100%; } width: 100%;
}
main { main {
display: block; display: block;
margin: 0 auto; margin: 0 auto;
padding: 0 1.6rem 1.6rem; } padding: 0 1.6rem 1.6rem;
}
footer { footer {
border-top: .1rem solid rgba(0, 0, 0, 0.2); border-top: .1rem solid rgba(0, 0, 0, 0.2);
@ -233,33 +318,57 @@ footer {
float: left; float: left;
max-width: 100%; max-width: 100%;
padding: 1rem 0; padding: 1rem 0;
text-align: center; } text-align: center;
}
hr { hr {
border-top: .1rem solid rgba(0, 0, 0, 0.2); border-top: .1rem solid rgba(0, 0, 0, 0.2);
display: block; display: block;
margin-bottom: 1.6rem; margin-bottom: 1.6rem;
width: 100%; } width: 100%;
}
img { img {
height: auto; height: auto;
max-width: 100%; max-width: 100%;
vertical-align: baseline; } vertical-align: baseline;
}
@media screen and (max-width: 40rem) { @media screen and (max-width: 40rem) {
article, section, aside { article,
section,
aside {
clear: both; clear: both;
display: block; display: block;
max-width: 100%; } max-width: 100%;
img { }
margin-right: 1.6rem; } }
input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"], select { img {
margin-right: 1.6rem;
}
}
input[type="text"],
input[type="password"],
input[type="email"],
input[type="url"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="datetime"],
input[type="datetime-local"],
input[type="week"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="color"],
select {
border: .1rem solid #ccc; border: .1rem solid #ccc;
border-radius: 0; border-radius: 0;
display: inline-block; display: inline-block;
padding: 0.8rem; padding: 0.8rem;
vertical-align: middle; } vertical-align: middle;
}
input:not([type]) { input:not([type]) {
-webkit-appearance: none; -webkit-appearance: none;
@ -270,59 +379,113 @@ input:not([type]) {
color: #444; color: #444;
display: inline-block; display: inline-block;
padding: 0.8rem; padding: 0.8rem;
text-align: left; } text-align: left;
}
input[type="color"] { input[type="color"] {
padding: 0.8rem 1.6rem; } padding: 0.8rem 1.6rem;
}
input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, select:focus, textarea:focus { input[type="text"]:focus,
border-color: #b3d4fc; } input[type="password"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="date"]:focus,
input[type="month"]:focus,
input[type="time"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="week"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="color"]:focus,
select:focus,
textarea:focus {
border-color: #b3d4fc;
}
input:not([type]):focus { input:not([type]):focus {
border-color: #b3d4fc; } border-color: #b3d4fc;
}
input[type="radio"], input[type="checkbox"] { input[type="radio"],
vertical-align: middle; } input[type="checkbox"] {
vertical-align: middle;
}
input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { input[type="file"]:focus,
outline: .1rem solid thin #444; } input[type="radio"]:focus,
input[type="checkbox"]:focus {
outline: .1rem solid thin #444;
}
input[type="text"][disabled], input[type="password"][disabled], input[type="email"][disabled], input[type="url"][disabled], input[type="date"][disabled], input[type="month"][disabled], input[type="time"][disabled], input[type="datetime"][disabled], input[type="datetime-local"][disabled], input[type="week"][disabled], input[type="number"][disabled], input[type="search"][disabled], input[type="tel"][disabled], input[type="color"][disabled], select[disabled], textarea[disabled] { input[type="text"][disabled],
input[type="password"][disabled],
input[type="email"][disabled],
input[type="url"][disabled],
input[type="date"][disabled],
input[type="month"][disabled],
input[type="time"][disabled],
input[type="datetime"][disabled],
input[type="datetime-local"][disabled],
input[type="week"][disabled],
input[type="number"][disabled],
input[type="search"][disabled],
input[type="tel"][disabled],
input[type="color"][disabled],
select[disabled],
textarea[disabled] {
background-color: #efefef; background-color: #efefef;
color: #777; color: #777;
cursor: not-allowed; } cursor: not-allowed;
}
input:not([type])[disabled] { input:not([type])[disabled] {
background-color: #efefef; background-color: #efefef;
color: #777; color: #777;
cursor: not-allowed; } cursor: not-allowed;
}
input[readonly], select[readonly], textarea[readonly] { input[readonly],
select[readonly],
textarea[readonly] {
background-color: #efefef; background-color: #efefef;
border-color: #ccc; border-color: #ccc;
color: #777; } color: #777;
}
input:focus:invalid, textarea:focus:invalid, select:focus:invalid { input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
border-color: #e9322d; border-color: #e9322d;
color: #b94a48; } color: #b94a48;
}
input[type="file"]:focus:invalid:focus, input[type="radio"]:focus:invalid:focus, input[type="checkbox"]:focus:invalid:focus { input[type="file"]:focus:invalid:focus,
outline-color: #ff4136; } input[type="radio"]:focus:invalid:focus,
input[type="checkbox"]:focus:invalid:focus {
outline-color: #ff4136;
}
select { select {
background-color: #fff; background-color: #fff;
border: .1rem solid #ccc; } border: .1rem solid #ccc;
}
select[multiple] { select[multiple] {
height: auto; } height: auto;
}
label { label {
line-height: 2; } line-height: 2;
}
fieldset { fieldset {
border: 0; border: 0;
margin: 0; margin: 0;
padding: 0.8rem 0; } padding: 0.8rem 0;
}
legend { legend {
border-bottom: .1rem solid #ccc; border-bottom: .1rem solid #ccc;
@ -330,7 +493,8 @@ legend {
display: block; display: block;
margin-bottom: 0.8rem; margin-bottom: 0.8rem;
padding: 0.8rem 0; padding: 0.8rem 0;
width: 100%; } width: 100%;
}
textarea { textarea {
border: .1rem solid #ccc; border: .1rem solid #ccc;
@ -338,9 +502,11 @@ textarea {
display: block; display: block;
margin-bottom: 0.8rem; margin-bottom: 0.8rem;
padding: 0.8rem; padding: 0.8rem;
vertical-align: middle; } vertical-align: middle;
}
input[type=submit], button { input[type=submit],
button {
background-color: transparent; background-color: transparent;
border: .2rem solid #444; border: .2rem solid #444;
border-radius: 0; border-radius: 0;
@ -354,83 +520,119 @@ input[type=submit], button {
text-decoration: none; text-decoration: none;
text-transform: uppercase; text-transform: uppercase;
-webkit-transition: .25s ease; -webkit-transition: .25s ease;
transition: .25s ease; transition: .25s ease;
-webkit-user-drag: none; -webkit-user-drag: none;
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
user-select: none; user-select: none;
vertical-align: baseline; } vertical-align: baseline;
input[type=submit] a, button a { }
color: #444; }
input[type=submit]::-moz-focus-inner, button::-moz-focus-inner { input[type=submit] a,
padding: 0; } button a {
color: #444;
}
input[type=submit]:hover, button:hover { input[type=submit]::-moz-focus-inner,
button::-moz-focus-inner {
padding: 0;
}
input[type=submit]:hover,
button:hover {
background: #444; background: #444;
border-color: #444; border-color: #444;
color: #fff; } color: #fff;
input[type=submit]:hover a, button:hover a { }
color: #fff; }
input[type=submit]:active, button:active { input[type=submit]:hover a,
button:hover a {
color: #fff;
}
input[type=submit]:active,
button:active {
background: #6a6a6a; background: #6a6a6a;
border-color: #6a6a6a; border-color: #6a6a6a;
color: #fff; } color: #fff;
input[type=submit]:active a, button:active a { }
color: #fff; }
input[type=submit]:disabled, button:disabled { input[type=submit]:active a,
button:active a {
color: #fff;
}
input[type=submit]:disabled,
button:disabled {
box-shadow: none; box-shadow: none;
cursor: not-allowed; cursor: not-allowed;
opacity: .40; } opacity: .40;
}
nav ul { nav ul {
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
padding-top: 1.6rem; padding-top: 1.6rem;
text-align: center; } text-align: center;
nav ul li { }
display: inline; }
nav ul li {
display: inline;
}
nav a { nav a {
border-bottom: .2rem solid transparent; border-bottom: .2rem solid transparent;
color: #444; color: #444;
padding: 0.8rem 1.6rem; padding: 0.8rem 1.6rem;
text-decoration: none; text-decoration: none;
-webkit-transition: .25s ease; -webkit-transition: .25s ease;
transition: .25s ease; } transition: .25s ease;
nav a:hover, nav li.selected a { }
border-color: rgba(0, 0, 0, 0.2); }
nav a:active { nav a:hover,
border-color: rgba(0, 0, 0, 0.56); } nav li.selected a {
border-color: rgba(0, 0, 0, 0.2);
}
nav a:active {
border-color: rgba(0, 0, 0, 0.56);
}
table { table {
margin-bottom: 1.6rem; } margin-bottom: 1.6rem;
}
caption { caption {
padding: 0.8rem 0; } padding: 0.8rem 0;
}
thead th { thead th {
background: #efefef; background: #efefef;
color: #444; } color: #444;
}
tr { tr {
background: #fff; background: #fff;
margin-bottom: 0.8rem; } margin-bottom: 0.8rem;
}
th, td { th,
td {
border: .1rem solid #ccc; border: .1rem solid #ccc;
padding: 0.8rem 1.6rem; padding: 0.8rem 1.6rem;
text-align: center; text-align: center;
vertical-align: inherit; } vertical-align: inherit;
}
tfoot tr { tfoot tr {
background: none; } background: none;
}
tfoot td { tfoot td {
color: #efefef; color: #efefef;
font-size: 0.8rem; font-size: 0.8rem;
font-style: italic; font-style: italic;
padding: 1.6rem 0.4rem; } padding: 1.6rem 0.4rem;
}

437
public/css/marx.myth.css Normal file
View File

@ -0,0 +1,437 @@
:root {
--default-font-list: 'Open Sans', 'Nimbus Sans L', 'Helvetica Neue', Helvetica, 'Lucida Grande', sans-serif;
box-sizing: border-box;
cursor: default;
font-family: var(--default-font-list);
line-height: 1.4;
overflow-y: scroll;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
text-size-adjust: 100%; }
audio:not([controls]) {
display: none; }
details {
display: block; }
/*input[type="number"] {
width: auto; }*/
input[type="search"] {
-webkit-appearance: textfield; }
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none; }
main {
display: block; }
summary {
display: block; }
pre {
overflow: auto; }
progress {
display: inline-block; }
small {
font-size: 75%; }
big {
font-size: 125%; }
template {
display: none; }
textarea {
overflow: auto;
resize: vertical; }
[hidden] {
display: none; }
[unselectable] {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
*, ::before, ::after {
border-style: solid;
border-width: 0;
box-sizing: inherit; }
* {
font-size: inherit;
line-height: inherit;
margin: 0;
padding: 0; }
::before, ::after {
text-decoration: inherit;
vertical-align: inherit; }
a {
text-decoration: none; }
audio, canvas, iframe, img, svg, video {
vertical-align: middle; }
button, input, select, textarea {
/*background-color: transparent;*/
border: .1rem solid #ccc;
color: inherit;
font-family: inherit;
font-style: inherit;
font-weight: inherit;
min-height: 1.4em; }
code, kbd, pre, samp {
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace, monospace; }
table {
border-collapse: collapse;
border-spacing: 0; }
::-moz-selection {
background-color: #b3d4fc;
text-shadow: none; }
::selection {
background-color: #b3d4fc;
text-shadow: none; }
button::-moz-focus-inner {
border: 0; }
@media screen {
[hidden~="screen"] {
display: inherit; }
[hidden~="screen"]:not(:active):not(:focus):not(:target) {
clip: rect(0 0 0 0) !important;
position: absolute !important; } }
body {
color: #444;
font-family: var(--default-font-list);
font-size: 1.6rem;
font-style: normal;
font-weight: 400; }
p {
margin: 0 0 1.6rem; }
h1, h2, h3, h4, h5, h6 {
font-family: 'Lato', var(--default-font-list);
margin: 2rem 0 1.6rem; }
h1 {
border-bottom: .1rem solid rgba(0, 0, 0, 0.2);
font-size: 3.6rem;
font-style: normal;
font-weight: 500; }
h2 {
font-size: 3rem;
font-style: normal;
font-weight: 500; }
h3 {
font-size: 2.4rem;
font-style: normal;
font-weight: 500;
margin: 1.6rem 0 0.4rem; }
h4 {
font-size: 1.8rem;
font-style: normal;
font-weight: 600;
margin: 1.6rem 0 0.4rem; }
h5 {
font-size: 1.6rem;
font-style: normal;
font-weight: 600;
margin: 1.6rem 0 0.4rem; }
h6 {
color: #777;
font-size: 1.4rem;
font-style: normal;
font-weight: 600;
margin: 1.6rem 0 0.4rem; }
small {
color: #777; }
pre {
background: #efefef;
color: #444;
display: block;
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
font-size: 1.4rem;
margin: 1.6rem 0;
padding: 1.6rem;
word-break: break-all;
word-wrap: break-word; }
code {
background: #efefef;
color: #444;
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
font-size: 1.4rem;
word-break: break-all;
word-wrap: break-word; }
a {
color: #1271db;
-webkit-transition: .25s ease;
transition: .25s ease; }
a:hover, a:focus {
text-decoration: none; }
dl {
margin-bottom: 1.6rem; }
dd {
margin-left: 4rem; }
ul, ol {
margin-bottom: 0.8rem;
padding-left: 2rem; }
blockquote {
border-left: .2rem solid #1271db;
font-family: Georgia, Times, 'Times New Roman', serif;
font-style: italic;
margin: 1.6rem 0;
padding-left: 1.6rem; }
figcaption {
font-family: Georgia, Times, 'Times New Roman', serif; }
html {
font-size: 62.5%; }
body {
padding: 0; }
main, header, footer, article, section, aside, details, summary {
display: block;
height: auto;
margin: 0 auto;
width: 100%; }
main {
display: block;
margin: 0 auto;
padding: 0 1.6rem 1.6rem; }
footer {
border-top: .1rem solid rgba(0, 0, 0, 0.2);
clear: both;
display: inline-block;
float: left;
max-width: 100%;
padding: 1rem 0;
text-align: center; }
hr {
border-top: .1rem solid rgba(0, 0, 0, 0.2);
display: block;
margin-bottom: 1.6rem;
width: 100%; }
img {
height: auto;
max-width: 100%;
vertical-align: baseline; }
@media screen and (max-width: 40rem) {
article, section, aside {
clear: both;
display: block;
max-width: 100%; }
img {
margin-right: 1.6rem; } }
input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"], select {
border: .1rem solid #ccc;
border-radius: 0;
display: inline-block;
padding: 0.8rem;
vertical-align: middle; }
input:not([type]) {
-webkit-appearance: none;
background-clip: padding-box;
background-color: #fff;
border: .1rem solid #ccc;
border-radius: 0;
color: #444;
display: inline-block;
padding: 0.8rem;
text-align: left; }
input[type="color"] {
padding: 0.8rem 1.6rem; }
input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, select:focus, textarea:focus {
border-color: #b3d4fc; }
input:not([type]):focus {
border-color: #b3d4fc; }
input[type="radio"], input[type="checkbox"] {
vertical-align: middle; }
input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {
outline: .1rem solid thin #444; }
input[type="text"][disabled], input[type="password"][disabled], input[type="email"][disabled], input[type="url"][disabled], input[type="date"][disabled], input[type="month"][disabled], input[type="time"][disabled], input[type="datetime"][disabled], input[type="datetime-local"][disabled], input[type="week"][disabled], input[type="number"][disabled], input[type="search"][disabled], input[type="tel"][disabled], input[type="color"][disabled], select[disabled], textarea[disabled] {
background-color: #efefef;
color: #777;
cursor: not-allowed; }
input:not([type])[disabled] {
background-color: #efefef;
color: #777;
cursor: not-allowed; }
input[readonly], select[readonly], textarea[readonly] {
background-color: #efefef;
border-color: #ccc;
color: #777; }
input:focus:invalid, textarea:focus:invalid, select:focus:invalid {
border-color: #e9322d;
color: #b94a48; }
input[type="file"]:focus:invalid:focus, input[type="radio"]:focus:invalid:focus, input[type="checkbox"]:focus:invalid:focus {
outline-color: #ff4136; }
select {
background-color: #fff;
border: .1rem solid #ccc; }
select[multiple] {
height: auto; }
label {
line-height: 2; }
fieldset {
border: 0;
margin: 0;
padding: 0.8rem 0; }
legend {
border-bottom: .1rem solid #ccc;
color: #444;
display: block;
margin-bottom: 0.8rem;
padding: 0.8rem 0;
width: 100%; }
textarea {
border: .1rem solid #ccc;
border-radius: 0;
display: block;
margin-bottom: 0.8rem;
padding: 0.8rem;
vertical-align: middle; }
input[type=submit], button {
background-color: transparent;
border: .2rem solid #444;
border-radius: 0;
color: #444;
cursor: pointer;
display: inline-block;
margin-bottom: 0.8rem;
margin-right: 0.4rem;
padding: 0.8rem 1.6rem;
text-align: center;
text-decoration: none;
text-transform: uppercase;
-webkit-transition: .25s ease;
transition: .25s ease;
-webkit-user-drag: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: baseline; }
input[type=submit] a, button a {
color: #444; }
input[type=submit]::-moz-focus-inner, button::-moz-focus-inner {
padding: 0; }
input[type=submit]:hover, button:hover {
background: #444;
border-color: #444;
color: #fff; }
input[type=submit]:hover a, button:hover a {
color: #fff; }
input[type=submit]:active, button:active {
background: #6a6a6a;
border-color: #6a6a6a;
color: #fff; }
input[type=submit]:active a, button:active a {
color: #fff; }
input[type=submit]:disabled, button:disabled {
box-shadow: none;
cursor: not-allowed;
opacity: .40; }
nav ul {
list-style: none;
margin: 0;
padding: 0;
padding-top: 1.6rem;
text-align: center; }
nav ul li {
display: inline; }
nav a {
border-bottom: .2rem solid transparent;
color: #444;
padding: 0.8rem 1.6rem;
text-decoration: none;
-webkit-transition: .25s ease;
transition: .25s ease; }
nav a:hover, nav li.selected a {
border-color: rgba(0, 0, 0, 0.2); }
nav a:active {
border-color: rgba(0, 0, 0, 0.56); }
table {
margin-bottom: 1.6rem; }
caption {
padding: 0.8rem 0; }
thead th {
background: #efefef;
color: #444; }
tr {
background: #fff;
margin-bottom: 0.8rem; }
th, td {
border: .1rem solid #ccc;
padding: 0.8rem 1.6rem;
text-align: center;
vertical-align: inherit; }
tfoot tr {
background: none; }
tfoot td {
color: #efefef;
font-size: 0.8rem;
font-style: italic;
padding: 1.6rem 0.4rem; }

View File

@ -18,6 +18,11 @@ class AnimeClient {
use \Aviat\Ion\Di\ContainerAware; use \Aviat\Ion\Di\ContainerAware;
const SESSION_SEGMENT = 'Aviat\AnimeClient\Auth'; const SESSION_SEGMENT = 'Aviat\AnimeClient\Auth';
const DEFAULT_CONTROLLER_NAMESPACE = 'Aviat\AnimeClient\Controller';
const DEFAULT_CONTROLLER = 'Aviat\AnimeClient\Controller\Anime';
const DEFAULT_CONTROLLER_METHOD = 'index';
const NOT_FOUND_METHOD = 'not_found';
const ERROR_MESSAGE_METHOD = 'error_page';
private static $form_pages = [ private static $form_pages = [
'edit', 'edit',

View File

@ -106,7 +106,7 @@ class Controller {
*/ */
public function redirect_to_default() public function redirect_to_default()
{ {
$default_type = $this->config->get(['routing', 'default_list']); $default_type = $this->config->get(['routes', 'route_config', 'default_list']);
$this->redirect($this->urlGenerator->default_url($default_type), 303); $this->redirect($this->urlGenerator->default_url($default_type), 303);
} }
@ -309,6 +309,23 @@ class Controller {
]); ]);
} }
/**
* Display a generic error page
*
* @param string $title
* @param string $message
* @param string $long_message
* @return void
*/
public function error_page($title, $message, $long_message = "")
{
$this->outputHTML('error', [
'title' => $title,
'message' => $message,
'long_message' => $long_message
]);
}
/** /**
* Set a session flash variable to display a message on * Set a session flash variable to display a message on
* next page load * next page load

View File

@ -16,6 +16,7 @@ use Aura\Web\Request;
use Aura\Web\Response; use Aura\Web\Response;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\AnimeClient\AnimeClient;
/** /**
* Basic routing/ dispatch * Basic routing/ dispatch
@ -52,75 +53,6 @@ class Dispatcher extends RoutingBase {
$this->request = $container->get('request'); $this->request = $container->get('request');
$this->output_routes = $this->_setup_routes(); $this->output_routes = $this->_setup_routes();
$this->generate_convention_routes();
}
/**
* Generate routes based on controller methods
*
* @return void
*/
protected function generate_convention_routes()
{
$default_controller = $this->routes['convention']['default_controller'];
$this->output_routes[] = $this->router->addGet('login', '/{controller}/login')
->setValues([
'controller' => $default_controller,
'action' => 'login'
]);
$this->output_routes[] = $this->router->addPost('login_post', '/{controller}/login')
->setValues([
'controller' => $default_controller,
'action' => 'login_action'
]);
$this->output_routes[] = $this->router->addGet('logout', '/{controller}/logout')
->setValues([
'controller' => $default_controller,
'action' => 'logout'
]);
$this->output_routes[] = $this->router->addPost('update', '/{controller}/update')
->setValues([
'controller' => $default_controller,
'action' => 'update'
])->setTokens([
'controller' => '[a-z_]+'
]);
$this->output_routes[] = $this->router->addPost('update_form', '/{controller}/update_form')
->setValues([
'controller' => $default_controller,
'action' => 'form_update'
])->setTokens([
'controller' => '[a-z_]+'
]);
$this->output_routes[] = $this->router->addGet('edit', '/{controller}/edit/{id}/{status}')
->setValues([
'controller' => $default_controller,
'action' => 'edit'
])->setTokens([
'id' => '[0-9a-z_]+',
'status' => '[a-zA-z\- ]+',
]);
$this->output_routes[] = $this->router->addGet('list', '/{controller}/{type}{/view}')
->setValues([
'controller' => $default_controller,
'action' => $this->routes['convention']['default_method'],
])->setTokens([
'type' => '[a-z_]+',
'view' => '[a-z_]+'
]);
$this->output_routes[] = $this->router->addGet('index_redirect', '/')
->setValues([
'controller' => 'Aviat\\AnimeClient\\Controller',
'action' => 'redirect_to_default'
]);
} }
/** /**
@ -132,7 +64,7 @@ class Dispatcher extends RoutingBase {
{ {
$error_handler = $this->container->get('error-handler'); $error_handler = $this->container->get('error-handler');
$raw_route = $this->request->server->get('PATH_INFO'); $raw_route = $this->request->url->get(PHP_URL_PATH);
$route_path = "/" . trim($raw_route, '/'); $route_path = "/" . trim($raw_route, '/');
$error_handler->addDataTable('Route Info', [ $error_handler->addDataTable('Route Info', [
@ -162,8 +94,8 @@ class Dispatcher extends RoutingBase {
public function __invoke($route = NULL) public function __invoke($route = NULL)
{ {
$error_handler = $this->container->get('error-handler'); $error_handler = $this->container->get('error-handler');
$controller_name = $this->routes['convention']['default_controller']; $controller_name = AnimeClient::DEFAULT_CONTROLLER;
$action_method = $this->routes['convention']['404_method']; $action_method = AnimeClient::NOT_FOUND_METHOD;
$params = []; $params = [];
if (is_null($route)) if (is_null($route))
@ -176,6 +108,24 @@ class Dispatcher extends RoutingBase {
{ {
$failure = $this->router->getFailedRoute(); $failure = $this->router->getFailedRoute();
$error_handler->addDataTable('failed_route', (array)$failure); $error_handler->addDataTable('failed_route', (array)$failure);
$action_method = AnimeClient::ERROR_MESSAGE_METHOD;
switch(TRUE)
{
case $failure->failedMethod():
$params['title'] = '405 Method Not Allowed';
$params['message'] = 'Invalid HTTP Verb';
break;
case $failure->failedAccept():
$params['title'] = '406 Not Acceptable';
$params['message'] = 'Unacceptable content type';
break;
default:
$action_method = AnimeClient::NOT_FOUND_METHOD;
break;
}
} }
else else
{ {
@ -229,8 +179,7 @@ class Dispatcher extends RoutingBase {
public function get_controller() public function get_controller()
{ {
$route_type = $this->__get('default_list'); $route_type = $this->__get('default_list');
$request_uri = $this->request->server->get('PATH_INFO'); $request_uri = $this->request->url->get(PHP_URL_PATH);
$path = trim($request_uri, '/'); $path = trim($request_uri, '/');
$segments = explode('/', $path); $segments = explode('/', $path);
@ -251,8 +200,7 @@ class Dispatcher extends RoutingBase {
*/ */
public function get_controller_list() public function get_controller_list()
{ {
$convention_routing = $this->routes['convention']; $default_namespace = AnimeClient::DEFAULT_CONTROLLER_NAMESPACE;
$default_namespace = $convention_routing['default_namespace'];
$path = str_replace('\\', '/', $default_namespace); $path = str_replace('\\', '/', $default_namespace);
$path = trim($path, '/'); $path = trim($path, '/');
$actual_path = \_dir(SRC_DIR, $path); $actual_path = \_dir(SRC_DIR, $path);
@ -278,22 +226,13 @@ class Dispatcher extends RoutingBase {
* *
* @return array * @return array
*/ */
public function _setup_routes() protected function _setup_routes()
{ {
$routes = [];
$route_type = $this->get_controller(); $route_type = $this->get_controller();
// Return early if invalid route array
if ( ! array_key_exists($route_type, $this->routes))
{
return [];
}
$applied_routes = $this->routes[$route_type];
// Add routes // Add routes
foreach ($applied_routes as $name => &$route) $routes = [];
foreach ($this->routes as $name => &$route)
{ {
$path = $route['path']; $path = $route['path'];
unset($route['path']); unset($route['path']);
@ -305,7 +244,7 @@ class Dispatcher extends RoutingBase {
} }
else else
{ {
$controller_class = $this->routes['convention']['default_controller']; $controller_class = AnimeClient::DEFAULT_CONTROLLER;
} }
// Prepend the controller to the route parameters // Prepend the controller to the route parameters
@ -313,7 +252,8 @@ class Dispatcher extends RoutingBase {
// Select the appropriate router method based on the http verb // Select the appropriate router method based on the http verb
$add = (array_key_exists('verb', $route)) $add = (array_key_exists('verb', $route))
? "add" . ucfirst(strtolower($route['verb'])) : "addGet"; ? "add" . ucfirst(strtolower($route['verb']))
: "addGet";
// Add the route to the router object // Add the route to the router object
if ( ! array_key_exists('tokens', $route)) if ( ! array_key_exists('tokens', $route))

View File

@ -100,13 +100,13 @@ class AnimeListTransformer extends AbstractTransformer {
{ {
// Messy mapping of boolean values to their API string equivalents // Messy mapping of boolean values to their API string equivalents
$privacy = 'public'; $privacy = 'public';
if (array_key_exists('private', $item) && $item['private'] == TRUE) if (array_key_exists('private', $item) && $item['private'])
{ {
$privacy = 'private'; $privacy = 'private';
} }
$rewatching = 'false'; $rewatching = 'false';
if (array_key_exists('rewatching', $item) && $item['rewatching'] == TRUE) if (array_key_exists('rewatching', $item) && $item['rewatching'])
{ {
$rewatching = 'true'; $rewatching = 'true';
} }

View File

@ -67,7 +67,7 @@ class MangaListTransformer extends AbstractTransformer {
'notes' => $item['notes'], 'notes' => $item['notes'],
'rereading' => (bool)$item['rereading'], 'rereading' => (bool)$item['rereading'],
'reread' => $item['reread_count'], 'reread' => $item['reread_count'],
'user_rating' => $rating 'user_rating' => $rating,
]; ];
if (array_key_exists('english_title', $manga)) if (array_key_exists('english_title', $manga))
@ -92,13 +92,7 @@ class MangaListTransformer extends AbstractTransformer {
*/ */
public function untransform($item) public function untransform($item)
{ {
$private = (array_key_exists('private', $item)) $rereading = (array_key_exists('rereading', $item)) && (bool)$item['rereading'];
? (bool)$item['private']
: FALSE;
$rereading = (array_key_exists('rereading', $item))
? (bool)$item['rereading']
: FALSE;
$map = [ $map = [
'id' => $item['id'], 'id' => $item['id'],
@ -108,7 +102,6 @@ class MangaListTransformer extends AbstractTransformer {
'volumes_read' => (int)$item['volumes_read'], 'volumes_read' => (int)$item['volumes_read'],
'rereading' => $rereading, 'rereading' => $rereading,
'reread_count' => (int)$item['reread_count'], 'reread_count' => (int)$item['reread_count'],
'private' => $private,
'notes' => $item['notes'], 'notes' => $item['notes'],
]; ];

View File

@ -67,12 +67,10 @@ class Anime extends API {
'form_params' => $data 'form_params' => $data
]); ]);
$output = [ return [
'statusCode' => $response->getStatusCode(), 'statusCode' => $response->getStatusCode(),
'body' => json_decode($response->getBody(), TRUE) 'body' => json_decode($response->getBody(), TRUE)
]; ];
return $output;
} }
/** /**

View File

@ -48,7 +48,8 @@ class RoutingBase {
{ {
$this->container = $container; $this->container = $container;
$this->config = $container->get('config'); $this->config = $container->get('config');
$this->routes = $this->config->get('routes'); $this->base_routes = $this->config->get('routes');
$this->routes = $this->base_routes['routes'];
} }
/** /**
@ -59,7 +60,7 @@ class RoutingBase {
*/ */
public function __get($key) public function __get($key)
{ {
$routing_config = $this->config->get('routing'); $routing_config = $this->base_routes['route_config'];
if (array_key_exists($key, $routing_config)) if (array_key_exists($key, $routing_config))
{ {

View File

@ -66,19 +66,12 @@ class DispatcherTest extends AnimeClient_TestCase {
{ {
$default_config = array( $default_config = array(
'routes' => [ 'routes' => [
'convention' => [ 'routes' => [
'default_namespace' => '\\Aviat\\AnimeClient\\Controller',
'default_controller' => '\\Aviat\\AnimeClient\\Controller\\Anime',
'default_method' => 'index'
],
'common' => [
'login_form' => [ 'login_form' => [
'path' => '/login', 'path' => '/login',
'action' => 'login', 'action' => 'login',
'verb' => 'get' 'verb' => 'get'
], ],
],
'anime' => [
'watching' => [ 'watching' => [
'path' => '/anime/watching{/view}', 'path' => '/anime/watching{/view}',
'action' => 'anime_list', 'action' => 'anime_list',
@ -89,8 +82,6 @@ class DispatcherTest extends AnimeClient_TestCase {
'view' => '[a-z_]+' 'view' => '[a-z_]+'
] ]
], ],
],
'manga' => [
'plan_to_read' => [ 'plan_to_read' => [
'path' => '/manga/plan_to_read{/view}', 'path' => '/manga/plan_to_read{/view}',
'action' => 'manga_list', 'action' => 'manga_list',
@ -101,13 +92,13 @@ class DispatcherTest extends AnimeClient_TestCase {
'view' => '[a-z_]+' 'view' => '[a-z_]+'
] ]
], ],
],
'route_config' => [
'anime_path' => 'anime',
'manga_path' => 'manga',
'default_list' => 'anime'
] ]
], ],
'routing' => [
'anime_path' => 'anime',
'manga_path' => 'manga',
'default_list' => 'anime'
]
); );
$data = [ $data = [
@ -174,27 +165,20 @@ class DispatcherTest extends AnimeClient_TestCase {
public function testDefaultRoute() public function testDefaultRoute()
{ {
$config = [ $config = [
'routing' => [
'anime_path' => 'anime',
'manga_path' => 'manga',
'default_anime_list_path' => "watching",
'default_manga_list_path' => 'all',
'default_list' => 'manga'
],
'routes' => [ 'routes' => [
'convention' => [ 'route_config' => [
'default_namespace' => '\\Aviat\\AnimeClient\\Controller', 'anime_path' => 'anime',
'default_controller' => '\\Aviat\\AnimeClient\\Controller\\Anime', 'manga_path' => 'manga',
'default_method' => 'index' 'default_anime_list_path' => "watching",
'default_manga_list_path' => 'all',
'default_list' => 'manga'
], ],
'common' => [ 'routes' => [
'login_form' => [ 'login_form' => [
'path' => '/login', 'path' => '/login',
'action' => ['login'], 'action' => ['login'],
'verb' => 'get' 'verb' => 'get'
], ],
],
'anime' => [
'index' => [ 'index' => [
'path' => '/', 'path' => '/',
'action' => ['redirect'], 'action' => ['redirect'],
@ -203,8 +187,6 @@ class DispatcherTest extends AnimeClient_TestCase {
'code' => '301' 'code' => '301'
] ]
], ],
],
'manga' => [
'index' => [ 'index' => [
'path' => '/', 'path' => '/',
'action' => ['redirect'], 'action' => ['redirect'],
@ -213,7 +195,7 @@ class DispatcherTest extends AnimeClient_TestCase {
'code' => '301', 'code' => '301',
'type' => 'manga' 'type' => 'manga'
] ]
], ]
] ]
] ]
]; ];
@ -231,19 +213,17 @@ class DispatcherTest extends AnimeClient_TestCase {
return array( return array(
'controller_list_sanity_check' => [ 'controller_list_sanity_check' => [
'config' => [ 'config' => [
'routing' => [
'anime_path' => 'anime',
'manga_path' => 'manga',
'default_anime_list_path' => "watching",
'default_manga_list_path' => 'all',
'default_list' => 'manga'
],
'routes' => [ 'routes' => [
'convention' => [ 'routes' => [
'default_namespace' => '\\Aviat\\AnimeClient\\Controller',
'default_controller' => '\\Aviat\\AnimeClient\\Controller\\Anime', ],
'default_method' => 'index' 'route_config' => [
] 'anime_path' => 'anime',
'manga_path' => 'manga',
'default_anime_list_path' => "watching",
'default_manga_list_path' => 'all',
'default_list' => 'manga'
],
] ]
], ],
'expected' => [ 'expected' => [
@ -254,22 +234,24 @@ class DispatcherTest extends AnimeClient_TestCase {
], ],
'empty_controller_list' => [ 'empty_controller_list' => [
'config' => [ 'config' => [
'routing' => [
'anime_path' => 'anime',
'manga_path' => 'manga',
'default_anime_path' => "/anime/watching",
'default_manga_path' => '/manga/all',
'default_list' => 'manga'
],
'routes' => [ 'routes' => [
'convention' => [ 'routes' => [
'default_namespace' => '\\Aviat\\Ion\\Controller',
'default_controller' => '\\Aviat\\Ion\\Controller\\Anime', ],
'default_method' => 'index' 'route_config' => [
] 'anime_path' => 'anime',
'manga_path' => 'manga',
'default_anime_path' => "/anime/watching",
'default_manga_path' => '/manga/all',
'default_list' => 'manga'
],
] ]
], ],
'expected' => [] 'expected' => [
'anime' => 'Aviat\AnimeClient\Controller\Anime',
'manga' => 'Aviat\AnimeClient\Controller\Manga',
'collection' => 'Aviat\AnimeClient\Controller\Collection',
]
] ]
); );
} }

View File

@ -33,7 +33,7 @@ class RoutingBaseTest extends AnimeClient_TestCase {
*/ */
public function testSegments($request_uri, $path, $segments, $last_segment) public function testSegments($request_uri, $path, $segments, $last_segment)
{ {
$this->markTestSkipped(); $this->markTestSkipped();
$this->setSuperGlobals([ $this->setSuperGlobals([
'_SERVER' => [ '_SERVER' => [
'REQUEST_URI' => $request_uri 'REQUEST_URI' => $request_uri

View File

@ -41,13 +41,16 @@ class UrlGeneratorTest extends AnimeClient_TestCase {
return [ return [
'default_view' => [ 'default_view' => [
'config' => [ 'config' => [
'routing' => [ 'routes' => [
'anime_path' => 'anime', 'routes' => [],
'manga_path' => 'manga', 'route_config' => [
'default_list' => 'manga', 'anime_path' => 'anime',
'default_anime_path' => '/anime/watching', 'manga_path' => 'manga',
'default_manga_path' => '/manga/all', 'default_list' => 'manga',
'default_to_list_view' => FALSE, 'default_anime_path' => '/anime/watching',
'default_manga_path' => '/manga/all',
'default_to_list_view' => FALSE,
]
], ],
], ],
'path' => '', 'path' => '',
@ -56,13 +59,16 @@ class UrlGeneratorTest extends AnimeClient_TestCase {
], ],
'default_view_list' => [ 'default_view_list' => [
'config' => [ 'config' => [
'routing' => [ 'routes' => [
'anime_path' => 'anime', 'routes' => [],
'manga_path' => 'manga', 'route_config' => [
'default_list' => 'manga', 'anime_path' => 'anime',
'default_anime_path' => '/anime/watching', 'manga_path' => 'manga',
'default_manga_path' => '/manga/all', 'default_list' => 'manga',
'default_to_list_view' => TRUE, 'default_anime_path' => '/anime/watching',
'default_manga_path' => '/manga/all',
'default_to_list_view' => TRUE,
]
], ],
], ],
'path' => '', 'path' => '',
@ -89,14 +95,17 @@ class UrlGeneratorTest extends AnimeClient_TestCase {
public function dataBaseUrl() public function dataBaseUrl()
{ {
$config = [ $config = [
'routing' => [ 'routes' => [
'anime_path' => 'anime', 'routes' => [],
'manga_path' => 'manga', 'route_config' => [
'default_list' => 'manga', 'anime_path' => 'anime',
'default_anime_path' => '/watching', 'manga_path' => 'manga',
'default_manga_path' => '/all', 'default_list' => 'manga',
'default_to_list_view' => TRUE, 'default_anime_path' => '/watching',
], 'default_manga_path' => '/all',
'default_to_list_view' => TRUE,
],
]
]; ];
return [ return [

View File

@ -48,17 +48,13 @@ class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
'file' => ':memory:', 'file' => ':memory:',
] ]
], ],
'routing' => [
'asset_path' => '/assets'
],
'routes' => [ 'routes' => [
'convention' => [ 'route_config' => [
'default_controller' => '', 'asset_path' => '/assets'
'default_method' => '',
], ],
'common' => [], 'routes' => [
'anime' => [],
'manga' => [] ]
] ]
]; ];