mirror of
https://github.com/flarum/framework.git
synced 2025-02-21 08:39:25 +08:00
Update for beta 16
This commit is contained in:
parent
80efe35b16
commit
85de81627d
@ -12,6 +12,8 @@ use Flarum\Api\Serializer\DiscussionSerializer;
|
||||
use Flarum\Api\Serializer\ForumSerializer;
|
||||
use Flarum\Discussion\Discussion;
|
||||
use Flarum\Discussion\Event\Saving;
|
||||
use Flarum\Discussion\Filter\DiscussionFilterer;
|
||||
use Flarum\Discussion\Search\DiscussionSearcher;
|
||||
use Flarum\Extend;
|
||||
use Flarum\Flags\Flag;
|
||||
use Flarum\Tags\Access;
|
||||
@ -19,11 +21,13 @@ use Flarum\Tags\Api\Controller;
|
||||
use Flarum\Tags\Api\Serializer\TagSerializer;
|
||||
use Flarum\Tags\Content;
|
||||
use Flarum\Tags\Event\DiscussionWasTagged;
|
||||
use Flarum\Tags\Filter\HideHiddenTagsFromAllDiscussionsPage;
|
||||
use Flarum\Tags\Filter\PostTagFilter;
|
||||
use Flarum\Tags\Listener;
|
||||
use Flarum\Tags\LoadForumTagsRelationship;
|
||||
use Flarum\Tags\Post\DiscussionTaggedPost;
|
||||
use Flarum\Tags\Query\TagFilterGambit;
|
||||
use Flarum\Tags\Tag;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
|
||||
return [
|
||||
(new Extend\Frontend('forum'))
|
||||
@ -102,11 +106,16 @@ return [
|
||||
|
||||
(new Extend\Event())
|
||||
->listen(Saving::class, Listener\SaveTagsToDatabase::class)
|
||||
->listen(DiscussionWasTagged::class, Listener\CreatePostWhenTagsAreChanged::class),
|
||||
->listen(DiscussionWasTagged::class, Listener\CreatePostWhenTagsAreChanged::class)
|
||||
->subscribe(Listener\UpdateTagMetadata::class),
|
||||
|
||||
function (Dispatcher $events) {
|
||||
$events->subscribe(Listener\FilterDiscussionListByTags::class);
|
||||
$events->subscribe(Listener\FilterPostsQueryByTag::class);
|
||||
$events->subscribe(Listener\UpdateTagMetadata::class);
|
||||
},
|
||||
(new Extend\Filter(PostFilterer::class))
|
||||
->addFilter(PostTagFilter::class),
|
||||
|
||||
(new Extend\Filter(DiscussionFilterer::class))
|
||||
->addFilter(TagFilterGambit::class)
|
||||
->addFilterMutator(HideHiddenTagsFromAllDiscussionsPage::class),
|
||||
|
||||
(new Extend\SimpleFlarumSearch(DiscussionSearcher::class))
|
||||
->addGambit(TagFilterGambit::class),
|
||||
];
|
||||
|
@ -64,7 +64,7 @@ export default function() {
|
||||
params.include.push('tags');
|
||||
|
||||
if (this.params.tags) {
|
||||
params.filter.q = (params.filter.q || '') + ' tag:' + this.params.tags;
|
||||
params.filter.tag = this.params.tags;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Flarum\Tags\Filter;
|
||||
|
||||
use Flarum\Filter\FilterState;
|
||||
use Flarum\Query\QueryCriteria;
|
||||
use Flarum\Tags\Tag;
|
||||
|
||||
class HideHiddenTagsFromAllDiscussionsPage
|
||||
{
|
||||
public function __invoke(FilterState $filter, QueryCriteria $queryCriteria)
|
||||
{
|
||||
if (count($filter->getActiveFilters()) > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$filter->getQuery()->whereNotIn('discussions.id', function ($query) {
|
||||
return $query->select('discussion_id')
|
||||
->from('discussion_tag')
|
||||
->whereIn('tag_id', Tag::where('is_hidden', 1)->pluck('id'));
|
||||
});
|
||||
}
|
||||
}
|
28
extensions/tags/src/Filter/PostTagFilter.php
Normal file
28
extensions/tags/src/Filter/PostTagFilter.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Tags\Filter;
|
||||
|
||||
use Flarum\Filter\FilterInterface;
|
||||
use Flarum\Filter\FilterState;
|
||||
|
||||
class PostTagFilter implements FilterInterface
|
||||
{
|
||||
public function getFilterKey(): string
|
||||
{
|
||||
return 'tag';
|
||||
}
|
||||
|
||||
public function filter(FilterState $filterState, string $filterValue, bool $negate)
|
||||
{
|
||||
$filterState->getQuery()
|
||||
->join('discussion_tag', 'discussion_tag.discussion_id', '=', 'posts.discussion_id')
|
||||
->where('discussion_tag.tag_id', $filterValue);
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Tags\Listener;
|
||||
|
||||
use Flarum\Discussion\Event\Searching;
|
||||
use Flarum\Event\ConfigureDiscussionGambits;
|
||||
use Flarum\Tags\Gambit\TagGambit;
|
||||
use Flarum\Tags\Tag;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
|
||||
class FilterDiscussionListByTags
|
||||
{
|
||||
/**
|
||||
* @param Dispatcher $events
|
||||
*/
|
||||
public function subscribe(Dispatcher $events)
|
||||
{
|
||||
$events->listen(ConfigureDiscussionGambits::class, [$this, 'addTagGambit']);
|
||||
$events->listen(Searching::class, [$this, 'hideTagsFromDiscussionList']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ConfigureDiscussionGambits $event
|
||||
*/
|
||||
public function addTagGambit(ConfigureDiscussionGambits $event)
|
||||
{
|
||||
$event->gambits->add(TagGambit::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Searching $event
|
||||
*/
|
||||
public function hideTagsFromDiscussionList(Searching $event)
|
||||
{
|
||||
$query = $event->search->getQuery();
|
||||
|
||||
if (count($event->search->getActiveGambits()) > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$query->whereNotIn('discussions.id', function ($query) {
|
||||
return $query->select('discussion_id')
|
||||
->from('discussion_tag')
|
||||
->whereIn('tag_id', Tag::where('is_hidden', 1)->pluck('id'));
|
||||
});
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Tags\Listener;
|
||||
|
||||
use Flarum\Event\ConfigurePostsQuery;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class FilterPostsQueryByTag
|
||||
{
|
||||
/**
|
||||
* @param Dispatcher $events
|
||||
*/
|
||||
public function subscribe(Dispatcher $events)
|
||||
{
|
||||
$events->listen(ConfigurePostsQuery::class, [$this, 'filterQuery']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ConfigurePostsQuery $event
|
||||
*/
|
||||
public function filterQuery(ConfigurePostsQuery $event)
|
||||
{
|
||||
if ($tagId = Arr::get($event->filter, 'tag')) {
|
||||
$event->query
|
||||
->join('discussion_tag', 'discussion_tag.discussion_id', '=', 'posts.discussion_id')
|
||||
->where('discussion_tag.tag_id', $tagId);
|
||||
}
|
||||
}
|
||||
}
|
@ -7,20 +7,17 @@
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Tags\Gambit;
|
||||
namespace Flarum\Tags\Query;
|
||||
|
||||
use Flarum\Filter\FilterInterface;
|
||||
use Flarum\Filter\FilterState;
|
||||
use Flarum\Search\AbstractRegexGambit;
|
||||
use Flarum\Search\AbstractSearch;
|
||||
use Flarum\Search\SearchState;
|
||||
use Flarum\Tags\TagRepository;
|
||||
use Illuminate\Database\Query\Builder;
|
||||
|
||||
class TagGambit extends AbstractRegexGambit
|
||||
class TagFilterGambit extends AbstractRegexGambit implements FilterInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected $pattern = 'tag:(.+)';
|
||||
|
||||
/**
|
||||
* @var TagRepository
|
||||
*/
|
||||
@ -34,14 +31,30 @@ class TagGambit extends AbstractRegexGambit
|
||||
$this->tags = $tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function conditions(AbstractSearch $search, array $matches, $negate)
|
||||
{
|
||||
$slugs = explode(',', trim($matches[1], '"'));
|
||||
protected function getGambitPattern() {
|
||||
return 'tag:(.+)';
|
||||
}
|
||||
|
||||
$search->getQuery()->where(function (Builder $query) use ($slugs, $negate) {
|
||||
protected function conditions(SearchState $search, array $matches, $negate)
|
||||
{
|
||||
$this->constrain($search->getQuery(), $matches[1], $negate);
|
||||
}
|
||||
|
||||
public function getFilterKey(): string
|
||||
{
|
||||
return 'tag';
|
||||
}
|
||||
|
||||
public function filter(FilterState $filterState, string $filterValue, bool $negate)
|
||||
{
|
||||
$this->constrain($filterState->getQuery(), $filterValue, $negate);
|
||||
}
|
||||
|
||||
protected function constrain(Builder $query, $rawSlugs, $negate)
|
||||
{
|
||||
$slugs = explode(',', trim($rawSlugs, '"'));
|
||||
|
||||
$query->where(function (Builder $query) use ($slugs, $negate) {
|
||||
foreach ($slugs as $slug) {
|
||||
if ($slug === 'untagged') {
|
||||
$query->whereIn('discussions.id', function (Builder $query) {
|
Loading…
x
Reference in New Issue
Block a user