#85: Changed the way next/previous buttons work, and introduced a more consistent ordering when large numbers of photos were uploaded at the same time

This commit is contained in:
Andy Heathershaw 2018-07-28 08:59:51 +01:00
parent eedfd5abdd
commit aa2998ac70
2 changed files with 36 additions and 10 deletions

View File

@ -71,14 +71,14 @@ class AlbumController extends Controller
else if ($requestedView != 'slideshow') else if ($requestedView != 'slideshow')
{ {
$photos = $album->photos() $photos = $album->photos()
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id'))
->paginate(UserConfig::get('items_per_page')); ->paginate(UserConfig::get('items_per_page'));
} }
else else
{ {
// The slideshow view needs access to all photos, not paged // The slideshow view needs access to all photos, not paged
$photos = $album->photos() $photos = $album->photos()
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id'))
->get(); ->get();
} }

View File

@ -105,14 +105,40 @@ class PhotoController extends Controller
// Load the Next/Previous buttons // Load the Next/Previous buttons
$thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at; $thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at;
$previousPhoto = $album->photos() // I don't like the idea of using a totally raw SQL query, but it's the only sure-fire way to number the rows
->where(DB::raw('COALESCE(taken_at, created_at)'), '<', $thisPhotoDate) // so we can get the previous/next photos accurately - and we don't have to load all data for the photo objects
->orderBy(DB::raw('COALESCE(taken_at, created_at)'), 'desc') $previousPhoto = null;
->first(); $nextPhoto = null;
$nextPhoto = $album->photos()
->where(DB::raw('COALESCE(taken_at, created_at)'), '>', $thisPhotoDate) $allAlbumPhotos = DB::select(
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) DB::raw(
->first(); 'SELECT p.id, (@row_number:=@row_number + 1) AS row_number
FROM photos p, (SELECT @row_number:=0) AS t
WHERE p.album_id = :album_id
ORDER BY COALESCE(p.taken_at, p.created_at), p.name, p.id;'
),
[
'album_id' => $album->id
]
);
for ($i = 0; $i < count($allAlbumPhotos); $i++)
{
if ($allAlbumPhotos[$i]->id === $photo->id)
{
if ($i > 0)
{
$previousPhoto = Photo::where('id', $allAlbumPhotos[$i - 1]->id)->first();
}
if ($i + 1 < count($allAlbumPhotos))
{
$nextPhoto = Photo::where('id', $allAlbumPhotos[$i + 1]->id)->first();
}
break;
}
}
// Record the visit to the photo // Record the visit to the photo
if (UserConfig::get('enable_visitor_hits')) if (UserConfig::get('enable_visitor_hits'))