From 548abde9b47a209428b59f23d4ae8ca8d74ae7e6 Mon Sep 17 00:00:00 2001 From: "johannes.pichler" Date: Mon, 7 May 2018 13:09:56 +0200 Subject: [PATCH 1/8] Add RSS Feed for forum add spatie/laravel-feed for RSS feed generation fixes #339 --- app/Models/Thread.php | 37 ++++++++++++++++++--- composer.json | 3 +- composer.lock | 2 +- config/feed.php | 24 +++++++++++++ resources/views/layouts/base.blade.php | 1 + resources/views/vendor/feed/feed.blade.php | 29 ++++++++++++++++ resources/views/vendor/feed/links.blade.php | 3 ++ routes/web.php | 2 ++ 8 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 config/feed.php create mode 100644 resources/views/vendor/feed/feed.blade.php create mode 100644 resources/views/vendor/feed/links.blade.php diff --git a/app/Models/Thread.php b/app/Models/Thread.php index 4158e1215..a9e3afbb0 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -3,13 +3,16 @@ namespace App\Models; use App\Exceptions\CouldNotMarkReplyAsSolution; -use App\Helpers\HasAuthor; use App\Helpers\HasSlug; use App\Helpers\HasTags; -use App\Helpers\HasTimestamps; +use Spatie\Feed\Feedable; +use Spatie\Feed\FeedItem; +use App\Helpers\HasAuthor; use App\Helpers\ModelHelpers; -use App\Helpers\ProvidesSubscriptions; +use App\Helpers\HasTimestamps; +use Illuminate\Support\Carbon; use App\Helpers\ReceivesReplies; +use App\Helpers\ProvidesSubscriptions; use DB; use Exception; use Illuminate\Contracts\Pagination\Paginator; @@ -19,12 +22,14 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Str; -final class Thread extends Model implements ReplyAble, SubscriptionAble +final class Thread extends Model implements ReplyAble, SubscriptionAble, Feedable { use HasAuthor, HasSlug, HasTimestamps, ModelHelpers, ProvidesSubscriptions, ReceivesReplies, HasTags; const TABLE = 'threads'; + const FEED_PAGE_SIZE = 20; + /** * {@inheritdoc} */ @@ -109,6 +114,19 @@ public function delete() parent::delete(); } + public function toFeedItem() + { + $updatedAt = Carbon::parse($this->latest_creation); + + return FeedItem::create() + ->id($this->id) + ->title($this->subject) + ->summary($this->body) + ->updated($updatedAt) + ->link(route('thread', $this->slug)) + ->author($this->author()->name); + } + /** * @return \App\Models\Thread[] */ @@ -173,4 +191,15 @@ public static function resolutionTime() return false; } } + + /** + * retrieve 20 feed items with use of page parameter. + */ + public static function getFeedItems() + { + $page = intval(request('page', 1)); + $query = static::feedQuery(); + + return $query->skip(($page - 1) * static::FEED_PAGE_SIZE)->take(static::FEED_PAGE_SIZE)->get(); + } } diff --git a/composer.json b/composer.json index c261367d7..caa5fdbf8 100644 --- a/composer.json +++ b/composer.json @@ -21,6 +21,7 @@ "ramsey/uuid": "^3.7", "roave/security-advisories": "dev-master", "spatie/laravel-backup": "^6.4", + "spatie/laravel-feed": "^2.0", "spatie/laravel-robots-middleware": "^1.0" }, "require-dev": { @@ -82,4 +83,4 @@ }, "minimum-stability": "dev", "prefer-stable": true -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 33487c624..477bd24ef 100644 --- a/composer.lock +++ b/composer.lock @@ -7177,4 +7177,4 @@ "php": "^7.3" }, "platform-dev": [] -} +} \ No newline at end of file diff --git a/config/feed.php b/config/feed.php new file mode 100644 index 000000000..b697591db --- /dev/null +++ b/config/feed.php @@ -0,0 +1,24 @@ + [ + 'forum' => [ + /* + * 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\Models\Thread@getFeedItems'], + + /* + * The feed will be available on this url. + */ + 'url' => '/forum/rss', + + 'title' => 'laravel.io Forum RSS Feed', + ], + ], +]; diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index 8859ac413..eff8c8f49 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -17,6 +17,7 @@ window.Laravel = {!! json_encode(['csrfToken' => csrf_token()]) !!}; + @include('feed::links') @include('layouts._favicons') @include('layouts._cookie_consent') @include('layouts._google_analytics') diff --git a/resources/views/vendor/feed/feed.blade.php b/resources/views/vendor/feed/feed.blade.php new file mode 100644 index 000000000..0e057fd65 --- /dev/null +++ b/resources/views/vendor/feed/feed.blade.php @@ -0,0 +1,29 @@ +` 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 !!}]]> + + {{ $item->updated->toAtomString() }} + + @endforeach + diff --git a/resources/views/vendor/feed/links.blade.php b/resources/views/vendor/feed/links.blade.php new file mode 100644 index 000000000..d0998c712 --- /dev/null +++ b/resources/views/vendor/feed/links.blade.php @@ -0,0 +1,3 @@ +@foreach($feeds as $name => $title) + +@endforeach diff --git a/routes/web.php b/routes/web.php index 34d327de8..5864ec6f5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,5 +1,7 @@ name('home'); Route::get('rules', 'HomeController@rules')->name('rules'); From 814af105ad88d9e3c05fa92307227cbc0e13ba5e Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Mon, 18 Nov 2019 20:29:40 +0000 Subject: [PATCH 2/8] Remove published views --- resources/views/vendor/feed/feed.blade.php | 29 --------------------- resources/views/vendor/feed/links.blade.php | 3 --- 2 files changed, 32 deletions(-) delete mode 100644 resources/views/vendor/feed/feed.blade.php delete mode 100644 resources/views/vendor/feed/links.blade.php diff --git a/resources/views/vendor/feed/feed.blade.php b/resources/views/vendor/feed/feed.blade.php deleted file mode 100644 index 0e057fd65..000000000 --- a/resources/views/vendor/feed/feed.blade.php +++ /dev/null @@ -1,29 +0,0 @@ -` 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 !!}]]> - - {{ $item->updated->toAtomString() }} - - @endforeach - diff --git a/resources/views/vendor/feed/links.blade.php b/resources/views/vendor/feed/links.blade.php deleted file mode 100644 index d0998c712..000000000 --- a/resources/views/vendor/feed/links.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -@foreach($feeds as $name => $title) - -@endforeach From fa46c0a050e3459747d9784423a71cfe0ee8691f Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Mon, 18 Nov 2019 20:42:18 +0000 Subject: [PATCH 3/8] Bump spatie/laravel-feed --- composer.lock | 101 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index 477bd24ef..791701e2c 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": "4fab6d98a10722817670581505029cc5", + "content-hash": "d2a2a90bd126aed9f3b95a590fd5f9be", "packages": [ { "name": "aws/aws-sdk-php", @@ -3160,6 +3160,17 @@ { "name": "roave/security-advisories", "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "3a9ab646603efdccb4f7c4acbb3b36974ef257d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/3a9ab646603efdccb4f7c4acbb3b36974ef257d8", + "reference": "3a9ab646603efdccb4f7c4acbb3b36974ef257d8", + "shasum": "" + }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", @@ -3360,7 +3371,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2019-10-09T14:04:58+00:00" + "time": "2019-09-26T17:56:56+00:00" }, { "name": "scrivo/highlight.php", @@ -3405,18 +3416,18 @@ "authors": [ { "name": "Geert Bergman", - "role": "Project Author", - "homepage": "http://www.scrivo.org/" + "homepage": "http://www.scrivo.org/", + "role": "Project Author" }, { "name": "Vladimir Jimenez", - "role": "Contributor", - "homepage": "https://allejo.io" + "homepage": "https://allejo.io", + "role": "Contributor" }, { "name": "Martin Folkers", - "role": "Contributor", - "homepage": "https://twobrain.io" + "homepage": "https://twobrain.io", + "role": "Contributor" } ], "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", @@ -3554,6 +3565,78 @@ ], "time": "2019-10-16T14:55:55+00:00" }, + { + "name": "spatie/laravel-feed", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-feed.git", + "reference": "b8a824fc4452a0b901db2dd4f94c48f7826597b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/b8a824fc4452a0b901db2dd4f94c48f7826597b8", + "reference": "b8a824fc4452a0b901db2dd4f94c48f7826597b8", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.8.0|^6.0", + "illuminate/http": "~5.8.0|^6.0", + "illuminate/support": "~5.8.0|^6.0", + "php": "^7.2" + }, + "require-dev": { + "orchestra/testbench": "~3.8.0|^4.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" + ], + "time": "2019-11-08T15:10:51+00:00" + }, { "name": "spatie/laravel-robots-middleware", "version": "1.1.0", @@ -7177,4 +7260,4 @@ "php": "^7.3" }, "platform-dev": [] -} \ No newline at end of file +} From ecdd7ab5900189e0c7e45e5f034ddbd65b83fadb Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Mon, 18 Nov 2019 20:49:46 +0000 Subject: [PATCH 4/8] Apply StyleCI fixes --- app/Models/Thread.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Models/Thread.php b/app/Models/Thread.php index a9e3afbb0..c7c0a7119 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -3,16 +3,13 @@ namespace App\Models; use App\Exceptions\CouldNotMarkReplyAsSolution; +use App\Helpers\HasAuthor; use App\Helpers\HasSlug; use App\Helpers\HasTags; -use Spatie\Feed\Feedable; -use Spatie\Feed\FeedItem; -use App\Helpers\HasAuthor; -use App\Helpers\ModelHelpers; use App\Helpers\HasTimestamps; -use Illuminate\Support\Carbon; -use App\Helpers\ReceivesReplies; +use App\Helpers\ModelHelpers; use App\Helpers\ProvidesSubscriptions; +use App\Helpers\ReceivesReplies; use DB; use Exception; use Illuminate\Contracts\Pagination\Paginator; @@ -20,7 +17,10 @@ use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; use Illuminate\Support\Str; +use Spatie\Feed\Feedable; +use Spatie\Feed\FeedItem; final class Thread extends Model implements ReplyAble, SubscriptionAble, Feedable { From 1e4485f550c5ba1235bb7064b83864d4fc91ced4 Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Tue, 19 Nov 2019 20:48:21 +0000 Subject: [PATCH 5/8] Use pagination --- app/Models/Thread.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/Models/Thread.php b/app/Models/Thread.php index c7c0a7119..b0185a75a 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -197,9 +197,8 @@ public static function resolutionTime() */ public static function getFeedItems() { - $page = intval(request('page', 1)); - $query = static::feedQuery(); - - return $query->skip(($page - 1) * static::FEED_PAGE_SIZE)->take(static::FEED_PAGE_SIZE)->get(); + return static::feedQuery() + ->paginate(static::FEED_PAGE_SIZE) + ->getCollection(); } } From fee15d1f4d34fbe2b163b6ada7a9fe0106d9daf9 Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Thu, 21 Nov 2019 21:33:58 +0000 Subject: [PATCH 6/8] Tweak formatting --- app/Models/Thread.php | 8 +++----- config/feed.php | 8 +++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/Models/Thread.php b/app/Models/Thread.php index b0185a75a..d0c02de6b 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -18,6 +18,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Carbon; +use Illuminate\Support\Collection as SupportCollection; use Illuminate\Support\Str; use Spatie\Feed\Feedable; use Spatie\Feed\FeedItem; @@ -114,7 +115,7 @@ public function delete() parent::delete(); } - public function toFeedItem() + public function toFeedItem(): FeedItem { $updatedAt = Carbon::parse($this->latest_creation); @@ -192,10 +193,7 @@ public static function resolutionTime() } } - /** - * retrieve 20 feed items with use of page parameter. - */ - public static function getFeedItems() + public static function getFeedItems(): SupportCollection { return static::feedQuery() ->paginate(static::FEED_PAGE_SIZE) diff --git a/config/feed.php b/config/feed.php index b697591db..4d69f43af 100644 --- a/config/feed.php +++ b/config/feed.php @@ -1,5 +1,7 @@ [ 'forum' => [ @@ -11,14 +13,14 @@ * You can also pass an argument to that method: * ['App\Model@getAllFeedItems', 'argument'] */ - 'items' => ['App\Models\Thread@getFeedItems'], + 'items' => [Thread::class.'@getFeedItems'], /* * The feed will be available on this url. */ - 'url' => '/forum/rss', + 'url' => '/forum/feed', - 'title' => 'laravel.io Forum RSS Feed', + 'title' => 'Laravel.io Forum RSS Feed', ], ], ]; From f4608306866941b5fcbdf57514223f149b06fcc8 Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Thu, 21 Nov 2019 21:40:17 +0000 Subject: [PATCH 7/8] Add feed link --- resources/views/forum/overview.blade.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/resources/views/forum/overview.blade.php b/resources/views/forum/overview.blade.php index 29f6cdb5e..17ca8ee54 100644 --- a/resources/views/forum/overview.blade.php +++ b/resources/views/forum/overview.blade.php @@ -82,9 +82,17 @@ class="button button-primary">
- - Create Thread + + Create Thread + + + + Feed @include('layouts._ads._forum_sidebar') From 530e762924bdde88f4c6ed6097a7de6f29f84c14 Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Fri, 22 Nov 2019 11:00:14 +0100 Subject: [PATCH 8/8] Update overview.blade.php --- resources/views/forum/overview.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/forum/overview.blade.php b/resources/views/forum/overview.blade.php index 17ca8ee54..e3ac3d91e 100644 --- a/resources/views/forum/overview.blade.php +++ b/resources/views/forum/overview.blade.php @@ -92,7 +92,7 @@ class="button button-primary button-full mb-4"> class="button button-muted button-full mb-4" target="_blank"> - Feed + RSS Feed @include('layouts._ads._forum_sidebar')