pics/controllers/ViewPhotoAlbum.php

131 lines
3.6 KiB
PHP

<?php
/*****************************************************************************
* ViewPhotoAlbum.php
* Contains the photo album index controller
*
* Kabuki CMS (C) 2013-2015, Aaron van Geffen
*****************************************************************************/
class ViewPhotoAlbum extends HTMLController
{
protected $iterator;
protected $total_count;
protected $base_url;
const PER_PAGE = 24;
public function __construct($title = 'Photos - ' . SITE_TITLE)
{
// Viewing an album?
if (isset($_GET['tag']))
{
$tag = Tag::fromSlug($_GET['tag']);
$id_tag = $tag->id_tag;
$title = $tag->tag;
$description = !empty($tag->description) ? '<p>' . $tag->description . '</p>' : '';
// Can we go up a level?
if ($tag->id_parent != 0)
{
$ptag = Tag::fromId($tag->id_parent);
$description .= '<p><a href="' . BASEURL . '/' . (!empty($ptag->slug) ? $ptag->slug . '/' : '') . '">&laquo; Go back to &quot;' . $ptag->tag . '&quot;</a></p>';
}
elseif ($tag->kind === 'Person')
$description .= '<p><a href="' . BASEURL . '/people/">&laquo; Go back to &quot;People&quot;</a></p>';
}
// View the album root.
else
{
$id_tag = 1;
$title = 'Albums';
$description = '';
}
// What page are we at?
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
parent::__construct($title . ' - Page ' . $page . ' - ' . SITE_TITLE);
if ($id_tag !== 1)
$this->page->adopt(new DummyBox($title, $description, 'page_title_box'));
// Fetch subalbums, but only if we're on the first page.
if ($page === 1)
{
$albums = $this->getAlbums($id_tag);
$index = new AlbumIndex($albums);
$this->page->adopt($index);
}
// Load a photo mosaic for the current tag.
list($mosaic, $total_count) = $this->getPhotoMosaic($id_tag, $page);
if (isset($mosaic))
$this->page->adopt(new PhotosIndex($mosaic, Registry::get('user')->isAdmin()));
// Make a page index as needed, while we're at it.
if ($total_count > self::PER_PAGE)
{
$index = new PageIndex([
'recordCount' => $total_count,
'items_per_page' => self::PER_PAGE,
'start' => (isset($_GET['page']) ? $_GET['page'] - 1 : 0) * self::PER_PAGE,
'base_url' => BASEURL . '/' . (isset($_GET['tag']) ? $_GET['tag'] . '/' : ''),
'page_slug' => 'page/%PAGE%/',
]);
$this->page->adopt(new Pagination($index));
}
// Set the canonical url.
$this->page->setCanonicalUrl(BASEURL . '/' . (isset($_GET['tag']) ? $_GET['tag'] . '/' : ''));
}
public function getPhotoMosaic($id_tag, $page)
{
// Create an iterator.
list($this->iterator, $total_count) = AssetIterator::getByOptions([
'id_tag' => $id_tag,
'order' => 'date_captured',
'direction' => 'desc',
'limit' => self::PER_PAGE,
'page' => $page,
], true);
$mosaic = $total_count > 0 ? new PhotoMosaic($this->iterator) : null;
return [$mosaic, $total_count];
}
private function getAlbums($id_tag)
{
// Fetch subalbums.
$subalbums = Tag::getAlbums($id_tag);
// What assets are we using?
$id_assets = array_map(function($album) {
return (int) $album['id_asset_thumb'];
}, $subalbums);
// Fetch assets for thumbnails.
$assets = Asset::fromIds($id_assets, 'object');
// Build album list.
$albums = [];
foreach ($subalbums as $album)
{
$albums[$album['id_tag']] = [
'id_tag' => $album['id_tag'],
'caption' => $album['tag'],
'link' => BASEURL . '/' . $album['slug'] . '/',
'thumbnail' => !empty($album['id_asset_thumb']) ? $assets[$album['id_asset_thumb']]->getImage() : null,
];
}
return $albums;
}
public function __destruct()
{
if (isset($this->iterator))
$this->iterator->clean();
}
}