diff --git a/controllers/ViewPhoto.php b/controllers/ViewPhoto.php
index ab53c0ff..fb151a03 100644
--- a/controllers/ViewPhoto.php
+++ b/controllers/ViewPhoto.php
@@ -46,6 +46,19 @@ class ViewPhoto extends HTMLController
if (isset($tag))
$page->setTag($tag);
+ // Keeping tabs on a filter?
+ if (isset($_GET['by']))
+ {
+ // Let's first verify that the filter is valid
+ $contributors = array_filter($tag->getContributorList(), fn($el) => $el['slug'] === $_GET['by']);
+ if (count($contributors) !== 1)
+ throw new UnexpectedValueException('Invalid filter for this album or tag.');
+
+ // Alright, let's run with it then
+ $filter = reset($contributors);
+ $page->setActiveFilter($filter['slug']);
+ }
+
$this->page->adopt($page);
$this->page->setCanonicalUrl($this->photo->getPageUrl());
}
diff --git a/controllers/ViewPhotoAlbum.php b/controllers/ViewPhotoAlbum.php
index c15175e6..55c72b7d 100644
--- a/controllers/ViewPhotoAlbum.php
+++ b/controllers/ViewPhotoAlbum.php
@@ -94,8 +94,15 @@ class ViewPhotoAlbum extends HTMLController
{
$index = new PhotosIndex($mosaic, Registry::get('user')->isAdmin());
$this->page->adopt($index);
- if ($id_tag > 1)
- $index->setUrlSuffix('?in=' . $id_tag);
+
+ $url_params = [];
+ if (isset($tag) && $tag->id_parent != 0)
+ $url_params['in'] = $tag->id_tag;
+ if (!empty($active_filter))
+ $url_params['by'] = $active_filter;
+
+ if (!empty($url_params))
+ $index->setUrlSuffix('?' . http_build_query($url_params));
}
// Make a page index as needed, while we're at it.
diff --git a/models/Asset.php b/models/Asset.php
index 45f8c1b6..9510735d 100644
--- a/models/Asset.php
+++ b/models/Asset.php
@@ -697,7 +697,7 @@ class Asset
$params);
}
- protected function getUrlForAdjacentInSet($prevNext, ?Tag $tag)
+ protected function getUrlForAdjacentInSet($prevNext, ?Tag $tag, $activeFilter)
{
$next = $prevNext === 'next';
$previous = !$next;
@@ -722,6 +722,14 @@ class Asset
$params['order_dir'] = $previous ? 'ASC' : 'DESC';
}
+ // Take active filter into account as well
+ if (!empty($activeFilter))
+ {
+ $user = Member::fromSlug($activeFilter);
+ $where[] = 'id_user_uploaded = {int:id_user_uploaded}';
+ $params['id_user_uploaded'] = $user->getUserId();
+ }
+
// Use complete ordering when sorting the set
$where[] = '(a.date_captured, a.id_asset) {raw:where_op} ' .
'({datetime:date_captured}, {int:id_asset})';
@@ -740,22 +748,29 @@ class Asset
LIMIT 1',
$params);
- if ($row)
- {
- $obj = self::byRow($row, 'object');
- return $obj->getPageUrl() . ($tag ? '?in=' . $tag->id_tag : '');
- }
- else
+ if (!$row)
return false;
+
+ $obj = self::byRow($row, 'object');
+
+ $urlParams = [];
+ if (isset($tag))
+ $urlParams['in'] = $tag->id_tag;
+ if (!empty($activeFilter))
+ $urlParams['by'] = $activeFilter;
+
+ $queryString = !empty($urlParams) ? '?' . http_build_query($urlParams) : '';
+
+ return $obj->getPageUrl() . $queryString;
}
- public function getUrlForPreviousInSet(?Tag $tag)
+ public function getUrlForPreviousInSet(?Tag $tag, $activeFilter)
{
- return $this->getUrlForAdjacentInSet('previous', $tag);
+ return $this->getUrlForAdjacentInSet('previous', $tag, $activeFilter);
}
- public function getUrlForNextInSet(?Tag $tag)
+ public function getUrlForNextInSet(?Tag $tag, $activeFilter)
{
- return $this->getUrlForAdjacentInSet('next', $tag);
+ return $this->getUrlForAdjacentInSet('next', $tag, $activeFilter);
}
}
diff --git a/templates/PhotoPage.php b/templates/PhotoPage.php
index b74e4201..0b309543 100644
--- a/templates/PhotoPage.php
+++ b/templates/PhotoPage.php
@@ -8,6 +8,7 @@
class PhotoPage extends Template
{
+ private $activeFilter;
private $photo;
private $metaData;
private $tag;
@@ -78,6 +79,11 @@ class PhotoPage extends Template
';
}
+ public function setActiveFilter($filter)
+ {
+ $this->activeFilter = $filter;
+ }
+
public function setTag(Tag $tag)
{
$this->tag = $tag;
@@ -85,14 +91,14 @@ class PhotoPage extends Template
private function photoNav()
{
- if ($previousUrl = $this->photo->getUrlForPreviousInSet($this->tag))
+ if ($previousUrl = $this->photo->getUrlForPreviousInSet($this->tag, $this->activeFilter))
echo '
';
else
echo '
';
- if ($nextUrl = $this->photo->getUrlForNextInSet($this->tag))
+ if ($nextUrl = $this->photo->getUrlForNextInSet($this->tag, $this->activeFilter))
echo '
';
else