Redirect ebook searches for only one tag to the /subjects/<TAG endpoint

This commit is contained in:
Alex Cabal 2025-01-05 13:52:09 -06:00
parent 99508cc490
commit 1cb4cbfe24
2 changed files with 42 additions and 23 deletions

View file

@ -11,13 +11,13 @@ RewriteRule ^/images/covers/(.+?)\-[a-z0-9]{8}\-(cover|hero)(@2x)?\.(jpg|avif)$
RewriteRule ^/ebooks/(.+?)/download$ /ebooks/download.php?url-path=$1 [QSA]
# Misc ebook rewrites.
RewriteRule ^/subjects/([^\./]+?)$ /ebooks/index.php?tags[]=$1 [QSA]
RewriteRule ^/ebooks/([^\./]+?)$ /authors/get.php?url-path=$1 [QSA]
RewriteRule ^/ebooks/([^\./]+?)/downloads$ /bulk-downloads/get.php?author=$1 [QSA]
RewriteRule ^/ebooks/([^\./]+?)/feeds$ /feeds/get.php?author=$1 [QSA]
RewriteRule ^/collections/([^\./]+?)$ /collections/get.php?collection=$1 [QSA]
RewriteRule ^/collections/([^/]+?)/downloads$ /bulk-downloads/get.php?collection=$1
RewriteRule ^/collections/([^/]+?)/feeds$ /feeds/get.php?collection=$1
RewriteRule ^/subjects/([^\./]+?)$ /ebooks/index.php?tags[]=$1 [B,QSA]
RewriteRule ^/ebooks/([^\./]+?)$ /authors/get.php?url-path=$1 [B,QSA]
RewriteRule ^/ebooks/([^\./]+?)/downloads$ /bulk-downloads/get.php?author=$1 [B,QSA]
RewriteRule ^/ebooks/([^\./]+?)/feeds$ /feeds/get.php?author=$1 [B,QSA]
RewriteRule ^/collections/([^\./]+?)$ /collections/get.php?collection=$1 [B,QSA]
RewriteRule ^/collections/([^/]+?)/downloads$ /bulk-downloads/get.php?collection=$1 [B]
RewriteRule ^/collections/([^/]+?)/feeds$ /feeds/get.php?collection=$1 [B]
RewriteRule ^/ebooks/(.+?)/edit$ /ebooks/edit.php?url-path=$1 [L]
RewriteRule ^/ebooks/(.+?)/delete$ /ebooks/delete.php?url-path=$1 [L]

View file

@ -11,6 +11,7 @@ $sort = Enums\EbookSortType::tryFrom(HttpInput::Str(GET, 'sort') ?? '');
$queryString = '';
$queryStringParams = [];
$queryStringWithoutPage = '';
$pageUrl = '/ebooks';
try{
if($page <= 0){
@ -34,17 +35,6 @@ try{
$tags = [];
}
$result = Ebook::GetAllByFilter($query != '' ? $query : null, $tags, $sort, $page, $perPage, Enums\EbookReleaseStatusFilter::All);
$ebooks = $result['ebooks'];
$totalEbooks = $result['ebooksCount'];
$pageTitle = 'Browse Standard Ebooks';
$pageHeader = 'Browse Ebooks';
$pages = ceil($totalEbooks / $perPage);
if($page > 1){
$pageTitle .= ', page ' . $page;
}
$pageDescription = 'Page ' . $page . ' of the Standard Ebooks free ebook library';
if($query != ''){
@ -73,17 +63,46 @@ try{
ksort($queryStringParams);
// If all we did was select one tag, redirect the user to `/subjects/<TAG>` instead of `/ebooks?tag[0]=<TAG>`.
if(sizeof($tags) == 1 && $query == '' && preg_match('|^/ebooks|iu', $_SERVER['REQUEST_URI'] ?? '')){
unset($queryStringParams['tags']);
$queryStringWithoutTags = http_build_query($queryStringParams);
$url = '/subjects/' . $tags[0];
if($queryStringWithoutTags != ''){
$url .= '?' . $queryStringWithoutTags;
}
header('Location: ' . $url);
exit();
}
// We only have one tag, change the page URL used for back/next links to `/subjects/<TAG>`.
if(sizeof($tags) == 1 && $query == ''){
$pageUrl = '/subjects/' . $tags[0];
unset($queryStringParams['tags']);
}
$queryString = http_build_query($queryStringParams);
unset($queryStringParams['page']);
$queryStringWithoutPage = http_build_query($queryStringParams);
$canonicalUrl = SITE_URL . '/ebooks';
$canonicalUrl = SITE_URL . $pageUrl;
if($queryString != ''){
$canonicalUrl .= '?' . $queryString;
}
$result = Ebook::GetAllByFilter($query != '' ? $query : null, $tags, $sort, $page, $perPage, Enums\EbookReleaseStatusFilter::All);
$ebooks = $result['ebooks'];
$totalEbooks = $result['ebooksCount'];
$pageTitle = 'Browse Standard Ebooks';
$pageHeader = 'Browse Ebooks';
$pages = ceil($totalEbooks / $perPage);
if($page > 1){
$pageTitle .= ', page ' . $page;
}
if($pages > 0 && $page > $pages){
throw new Exceptions\PageOutOfBoundsException();
}
@ -119,15 +138,15 @@ catch(Exceptions\AppException $ex){
<? } ?>
<? if(sizeof($ebooks) > 0){ ?>
<nav class="pagination">
<a<? if($page > 1){ ?> href="/ebooks?page=<?= $page - 1 ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>" rel="prev"<? }else{ ?> aria-disabled="true"<? } ?>>Back</a>
<a<? if($page > 1){ ?> href="<?= $pageUrl ?>?page=<?= $page - 1 ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>" rel="prev"<? }else{ ?> aria-disabled="true"<? } ?>>Back</a>
<ol>
<? for($i = 1; $i < $pages + 1; $i++){ ?>
<li<? if($page == $i){ ?> class="highlighted"<? } ?>>
<a href="/ebooks?page=<?= $i ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>"><?= $i ?></a>
<a href="<?= $pageUrl ?>?page=<?= $i ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>"><?= $i ?></a>
</li>
<? } ?>
</ol>
<a<? if($page < ceil($totalEbooks / $perPage)){ ?> href="/ebooks?page=<?= $page + 1 ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>" rel="next"<? }else{ ?> aria-disabled="true"<? } ?>>Next</a>
<a<? if($page < ceil($totalEbooks / $perPage)){ ?> href="<?= $pageUrl ?>?page=<?= $page + 1 ?><? if($queryStringWithoutPage != ''){ ?>&amp;<?= Formatter::EscapeHtml($queryStringWithoutPage) ?><? } ?>" rel="next"<? }else{ ?> aria-disabled="true"<? } ?>>Next</a>
</nav>
<? } ?>