mirror of
https://github.com/flarum/core.git
synced 2025-08-08 09:26:34 +02:00
Keep tag discussions_count up-to-date
This commit is contained in:
49
extensions/tags/src/Handlers/TagMetadataUpdater.php
Executable file
49
extensions/tags/src/Handlers/TagMetadataUpdater.php
Executable file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php namespace Flarum\Tags\Handlers;
|
||||||
|
|
||||||
|
use Flarum\Tags\Tag;
|
||||||
|
use Flarum\Tags\Events\DiscussionWasTagged;
|
||||||
|
use Flarum\Core\Events\DiscussionWasStarted;
|
||||||
|
use Flarum\Core\Events\DiscussionWasDeleted;
|
||||||
|
use Flarum\Core\Models\Discussion;
|
||||||
|
|
||||||
|
class TagMetadataUpdater
|
||||||
|
{
|
||||||
|
public function subscribe($events)
|
||||||
|
{
|
||||||
|
$events->listen('Flarum\Core\Events\DiscussionWasStarted', __CLASS__.'@whenDiscussionWasStarted');
|
||||||
|
$events->listen('Flarum\Tags\Events\DiscussionWasTagged', __CLASS__.'@whenDiscussionWasTagged');
|
||||||
|
$events->listen('Flarum\Core\Events\DiscussionWasDeleted', __CLASS__.'@whenDiscussionWasDeleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function whenDiscussionWasStarted(DiscussionWasStarted $event)
|
||||||
|
{
|
||||||
|
$tags = $event->discussion->tags();
|
||||||
|
|
||||||
|
$this->updateTagCounts($tags, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function whenDiscussionWasTagged(DiscussionWasTagged $event)
|
||||||
|
{
|
||||||
|
$oldTags = Tag::whereIn('id', array_pluck($event->oldTags, 'id'));
|
||||||
|
|
||||||
|
$this->updateTagCounts($oldTags, -1);
|
||||||
|
|
||||||
|
$newTags = $event->discussion->tags();
|
||||||
|
|
||||||
|
$this->updateTagCounts($newTags, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function whenDiscussionWasDeleted(DiscussionWasDeleted $event)
|
||||||
|
{
|
||||||
|
$tags = $event->discussion->tags();
|
||||||
|
|
||||||
|
$this->updateTagCounts($tags, -1);
|
||||||
|
|
||||||
|
$tags->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function updateTagCounts($query, $delta)
|
||||||
|
{
|
||||||
|
$query->update(['discussions_count' => app('db')->raw('discussions_count + '.$delta)]);
|
||||||
|
}
|
||||||
|
}
|
@@ -3,7 +3,6 @@
|
|||||||
use Flarum\Tags\Tag;
|
use Flarum\Tags\Tag;
|
||||||
use Flarum\Tags\Events\DiscussionWasTagged;
|
use Flarum\Tags\Events\DiscussionWasTagged;
|
||||||
use Flarum\Core\Events\DiscussionWillBeSaved;
|
use Flarum\Core\Events\DiscussionWillBeSaved;
|
||||||
use Flarum\Core\Events\DiscussionWasDeleted;
|
|
||||||
use Flarum\Core\Models\Discussion;
|
use Flarum\Core\Models\Discussion;
|
||||||
use Flarum\Core\Exceptions\PermissionDeniedException;
|
use Flarum\Core\Exceptions\PermissionDeniedException;
|
||||||
|
|
||||||
@@ -12,7 +11,6 @@ class TagSaver
|
|||||||
public function subscribe($events)
|
public function subscribe($events)
|
||||||
{
|
{
|
||||||
$events->listen('Flarum\Core\Events\DiscussionWillBeSaved', __CLASS__.'@whenDiscussionWillBeSaved');
|
$events->listen('Flarum\Core\Events\DiscussionWillBeSaved', __CLASS__.'@whenDiscussionWillBeSaved');
|
||||||
$events->listen('Flarum\Core\Events\DiscussionWasDeleted', __CLASS__.'@whenDiscussionWasDeleted');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function whenDiscussionWillBeSaved(DiscussionWillBeSaved $event)
|
public function whenDiscussionWillBeSaved(DiscussionWillBeSaved $event)
|
||||||
@@ -57,9 +55,4 @@ class TagSaver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function whenDiscussionWasDeleted(DiscussionWasDeleted $event)
|
|
||||||
{
|
|
||||||
$event->discussion->tags()->sync([]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -124,6 +124,7 @@ class TagsServiceProvider extends ServiceProvider
|
|||||||
// Add an event subscriber so that tags data is persisted when
|
// Add an event subscriber so that tags data is persisted when
|
||||||
// saving a discussion.
|
// saving a discussion.
|
||||||
new Extend\EventSubscriber('Flarum\Tags\Handlers\TagSaver'),
|
new Extend\EventSubscriber('Flarum\Tags\Handlers\TagSaver'),
|
||||||
|
new Extend\EventSubscriber('Flarum\Tags\Handlers\TagMetadataUpdater'),
|
||||||
|
|
||||||
// Add a gambit that allows filtering discussions by tag(s).
|
// Add a gambit that allows filtering discussions by tag(s).
|
||||||
new Extend\DiscussionGambit('Flarum\Tags\TagGambit'),
|
new Extend\DiscussionGambit('Flarum\Tags\TagGambit'),
|
||||||
|
Reference in New Issue
Block a user