children_count = DbHelper::getChildAlbumsCount($album); } $resetStatus = $request->session()->get('status'); // Record the visit to the index (no album or photo to record a hit against though) if (UserConfig::get('enable_visitor_hits')) { DB::transaction(function () use ($request) { VisitorHit::fromRequest($request); }); } return Theme::render('gallery.index', [ 'albums' => $albums, 'info' => $request->session()->get('info'), 'success' => $resetStatus ]); } public function sitemapXml() { $xml = new \DOMDocument('1.0', 'UTF-8'); $xml->preserveWhiteSpace = true; $xml->formatOutput = true; $root = $xml->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset'); $root->appendChild($xml->createAttribute('xmlns:image')) ->appendChild($xml->createTextNode('http://www.google.com/schemas/sitemap-image/1.1')); $xml->appendChild($root); // Root URL (get last modified photo to create the lastmod date for this URL) $lastModifiedPhoto = Photo::orderBy('updated_at', 'desc')->first(); $this->createSitemapNode($xml, $root, route('home'), (is_null($lastModifiedPhoto) ? '' : $lastModifiedPhoto->updated_at), '1.0'); // Albums the current user is allowed to access $albumIDs = DbHelper::getAlbumIDsForCurrentUser(); // Add each label $labels = Label::orderBy('name'); $labels->chunk(100, function($labelsChunk) use ($xml, $root) { /** @var Label $label */ foreach ($labelsChunk as $label) { $lastModifiedPhoto = $label->photos()->orderBy('updated_at', 'desc')->first(); $this->createSitemapNode($xml, $root, $label->url(), (is_null($lastModifiedPhoto) ? $label->updated_at : $lastModifiedPhoto->updated_at), '0.9'); } }); // Add each album URL $albums = Album::whereIn('id', $albumIDs)->orderBy('name'); $albums->chunk(100, function($albumsChunk) use ($xml, $root) { /** @var Album $album */ foreach ($albumsChunk as $album) { $lastModifiedPhoto = Photo::where('album_id', $album->id)->orderBy('updated_at', 'desc')->first(); $this->createSitemapNode($xml, $root, $album->url(), (is_null($lastModifiedPhoto) ? $album->updated_at : $lastModifiedPhoto->updated_at), '0.8'); } }); // Add each photo URL $photos = Photo::whereIn('album_id', $albumIDs)->orderBy('name'); $photos->chunk(100, function($tempPhotos) use ($xml, $root) { /** @var Photo $photo */ foreach ($tempPhotos as $photo) { $photoMeta = [$photo->name]; if (strlen($photo->description) > 0) { $photoMeta[] = $photo->description; } $this->createSitemapNode( $xml, $root, $photo->url(), $photo->updated_at, '0.7', $photo->thumbnailUrl('fullsize', false), join(' - ', $photoMeta) ); } }); return response($xml->saveXML(), 200, ['Content-Type' => 'text/xml']); } private function createSitemapNode( \DOMDocument $document, \DOMElement $parentElement, $url, $lastModifiedDate = '', $priority = '', $imageUrl = '', $imageCaption = '' ) { $urlElement = $document->createElement('url'); $urlLocElement = $document->createElement('loc', htmlentities($url)); $urlElement->appendChild($urlLocElement); $changeFreqElement = $document->createElement('changefreq', 'weekly'); $urlElement->appendChild($changeFreqElement); if (strlen($lastModifiedDate) > 0) { $lastModElement = $document->createElement('lastmod', date('Y-m-d\TH:i:s+00:00', strtotime($lastModifiedDate))); $urlElement->appendChild($lastModElement); } if (strlen($priority) > 0) { $priorityElement = $document->createElement('priority', $priority); $urlElement->appendChild($priorityElement); } if (strlen($imageUrl) > 0) { $imageElement = $document->createElement('image:image'); $imageLocElement = $document->createElement('image:loc', htmlentities($imageUrl)); $imageElement->appendChild($imageLocElement); $imageCaptionElement = $document->createElement('image:caption', htmlentities($imageCaption)); $imageElement->appendChild($imageCaptionElement); $urlElement->appendChild($imageElement); } $parentElement->appendChild($urlElement); return $urlElement; } }