Merge branch 'feature/24-google-sitemap-xml' of aheathershaw/blue-twilight into master

This commit is contained in:
Andy Heathershaw 2017-09-05 22:17:35 +01:00 committed by Gogs
commit 9d3a95917c
2 changed files with 105 additions and 0 deletions

View File

@ -7,6 +7,7 @@ use App\Facade\Theme;
use App\Facade\UserConfig;
use App\Helpers\DbHelper;
use App\Http\Controllers\Controller;
use App\Photo;
use App\VisitorHit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@ -34,4 +35,107 @@ class DefaultController extends Controller
'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');
// Add each album URL
$albums = Album::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.9');
}
});
// Add each photo URL
$photos = Photo::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.8',
$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', $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;
}
}

View File

@ -68,6 +68,7 @@ Route::get('/', 'Gallery\DefaultController@index')->name('home');
Route::get('/activate/{token}', 'Auth\ActivateController@activate')->name('auth.activate');
Route::get('/password/change', 'Auth\ChangePasswordController@showChangePasswordForm')->name('auth.changePassword');
Route::post('/password/change', 'Auth\ChangePasswordController@processChangePassword')->name('auth.processChangePassword');
Route::get('/sitemap.xml', 'Gallery\DefaultController@sitemapXml');
Route::get('a/{albumUrlAlias}', 'Gallery\AlbumController@index')
->name('viewAlbum')
->where('albumUrlAlias', '.*');