diff --git a/app/Home.php b/app/Home.php index 8864e2b..00099d2 100644 --- a/app/Home.php +++ b/app/Home.php @@ -4,10 +4,13 @@ namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; +use Spatie\Feed\Feedable; +use Spatie\Feed\FeedItem; use Spatie\QueryBuilder\QueryBuilder; -class Home extends Model +class Home extends Model implements Feedable { protected $fillable = [ 'title', 'price', 'surface', 'garden_surface', 'rooms', 'energy', @@ -66,4 +69,24 @@ class Home extends Model Artisan::call('app:downloadimage ' . $home->id); }); } + + /** + * @inheritDoc + */ + public function toFeedItem() + { + return FeedItem::create() + ->id($this->id) + ->title($this->title) + ->summary($this->excerpt()) + ->author('Shikiryu') + ->updated($this->created_at) + ->link(\route('public.view', ['slug' => $this->slug])) + ; + } + + public static function getFeedItems() + { + return self::where('slug', '!=', null)->limit(20)->get(); + } } diff --git a/app/Http/Controllers/PublicController.php b/app/Http/Controllers/PublicController.php index 13269ff..f176bfe 100644 --- a/app/Http/Controllers/PublicController.php +++ b/app/Http/Controllers/PublicController.php @@ -26,4 +26,14 @@ class PublicController extends Controller return view('public.view', ['home' => $home]); } + + public function list() + { + $homes = Home::where('slug', '!=', null)->paginate(12); + $this->seo() + ->setTitle('Liste des maisons rêvées') + ->setDescription('La sélection'); + + return view('public.list', ['homes' => $homes]); + } } diff --git a/composer.json b/composer.json index 9cc9013..a63b4bf 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "laravel/framework": "^7.0", "laravel/tinker": "^2.0", "laravel/ui": "^2.1", + "spatie/laravel-feed": "^2.7", "spatie/laravel-query-builder": "^2.8" }, "require-dev": { diff --git a/composer.lock b/composer.lock index ccf10df..09aed2d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b1bb2469deb87a0a1452b8b376e64e1a", + "content-hash": "f2c45183934d3f7aaed61cff5cbff385", "packages": [ { "name": "absmoca/leboncoin", @@ -2301,6 +2301,84 @@ ], "time": "2020-03-29T20:13:32+00:00" }, + { + "name": "spatie/laravel-feed", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-feed.git", + "reference": "287991a339b98274df56098fa4249afa3ac26211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/287991a339b98274df56098fa4249afa3ac26211", + "reference": "287991a339b98274df56098fa4249afa3ac26211", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.8.0|^6.0|^7.0", + "illuminate/http": "~5.8.0|^6.0|^7.0", + "illuminate/support": "~5.8.0|^6.0|^7.0", + "php": "^7.2" + }, + "require-dev": { + "orchestra/testbench": "~3.8.0|^4.0|^5.0", + "phpunit/phpunit": "^8.0", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Feed\\FeedServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Feed\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jolita Grazyte", + "email": "jolita@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Generates rss feed", + "homepage": "https://github.com/spatie/laravel-feed", + "keywords": [ + "laravel", + "laravel-feed", + "rss", + "spatie" + ], + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2020-06-11T22:56:36+00:00" + }, { "name": "spatie/laravel-query-builder", "version": "2.8.2", diff --git a/config/feed.php b/config/feed.php new file mode 100644 index 0000000..d3234ea --- /dev/null +++ b/config/feed.php @@ -0,0 +1,36 @@ + [ + 'main' => [ + /* + * Here you can specify which class and method will return + * the items that should appear in the feed. For example: + * 'App\Model@getAllFeedItems' + * + * You can also pass an argument to that method: + * ['App\Model@getAllFeedItems', 'argument'] + */ + 'items' => 'App\Home@getFeedItems', + + /* + * The feed will be available on this url. + */ + 'url' => '/feed', + + 'title' => 'Les maisons de Bretagne', + 'description' => 'La sélection', + 'language' => 'fr-FR', + + /* + * The view that will render the feed. + */ + 'view' => 'feed::atom', + + /* + * The type to be used in the tag + */ + 'type' => 'application/atom+xml', + ], + ], +]; diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ef24308..e73ba46 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -6,6 +6,7 @@ @if(Auth::guest()) {!! SEO::generate() !!} + @include('feed::links') @endif diff --git a/resources/views/public/list.blade.php b/resources/views/public/list.blade.php new file mode 100644 index 0000000..e4d482d --- /dev/null +++ b/resources/views/public/list.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('List') }}
+
+
+ @if(count($homes) > 0) + @foreach($homes as $home) +
+
+ +
+
+ {{ $home->title }} + {{ Str::currency($home->price) }} +
+

{{ $home->excerpt() }}

+ Voir la maison +
+
+
+ @endforeach +
+ {{ $homes->links() }} +
+ @else + Aucune maison publique :( + @endif +
+
+
+
+
+
+@endsection diff --git a/resources/views/vendor/feed/atom.blade.php b/resources/views/vendor/feed/atom.blade.php new file mode 100644 index 0000000..5d5d3ae --- /dev/null +++ b/resources/views/vendor/feed/atom.blade.php @@ -0,0 +1,37 @@ +` won't get parsed as short tags */ + ''.PHP_EOL +?> + + @foreach($meta as $key => $metaItem) + @if($key === 'link') + <{{ $key }} href="{{ url($metaItem) }}"> + @elseif($key === 'title') + <{{ $key }}> + @else + <{{ $key }}>{{ $metaItem }} + @endif + @endforeach + @foreach($items as $item) + + <![CDATA[{{ $item->title }}]]> + + {{ url($item->id) }} + + author }}]]> + + + summary !!}]]> + + @if($item->__isset('enclosure')) + + @endif + @foreach($item->category as $category) + + + + @endforeach + {{ $item->updated->toRssString() }} + + @endforeach + diff --git a/resources/views/vendor/feed/feed.blade.php b/resources/views/vendor/feed/feed.blade.php new file mode 100644 index 0000000..7a5e3a1 --- /dev/null +++ b/resources/views/vendor/feed/feed.blade.php @@ -0,0 +1 @@ +@include('feed::atom') diff --git a/resources/views/vendor/feed/links.blade.php b/resources/views/vendor/feed/links.blade.php new file mode 100644 index 0000000..5e7189b --- /dev/null +++ b/resources/views/vendor/feed/links.blade.php @@ -0,0 +1,3 @@ +@foreach($feeds as $name => $feed) + +@endforeach diff --git a/resources/views/vendor/feed/rss.blade.php b/resources/views/vendor/feed/rss.blade.php new file mode 100644 index 0000000..e0a080f --- /dev/null +++ b/resources/views/vendor/feed/rss.blade.php @@ -0,0 +1,27 @@ +` won't get parsed as short tags */ +''.PHP_EOL +?> + + + <![CDATA[{{ $meta['title'] }}]]> + + + {{ $meta['language'] }} + {{ $meta['updated'] }} + + @foreach($items as $item) + + <![CDATA[{{ $item->title }}]]> + {{ url($item->link) }} + summary !!}]]> + author }}]]> + {{ url($item->id) }} + {{ $item->updated->toRssString() }} + @foreach($item->category as $category) + {{ $category }} + @endforeach + + @endforeach + + diff --git a/routes/web.php b/routes/web.php index 7c3090c..1b3b702 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,11 +22,13 @@ Route::get('/', static function () { }); Auth::routes(['register' => false]); +Route::feeds(); Route::get('/home', static function () { if (Auth::guest()) { return redirect(\route('login')); } }); +Route::get('/list', 'PublicController@list')->name('public.list'); Route::get('/{slug}', 'PublicController@show')->name('public.view');