Skip to content

Commit 590cd0c

Browse files
authored
Merge pull request #6291 from WoltLab/6.2-tagged-list-view
Allow the use of list views in tagging results
2 parents 8ca4589 + 2a88802 commit 590cd0c

19 files changed

+557
-49
lines changed

com.woltlab.wcf/objectTypeDefinition.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@
8484
</definition>
8585
<definition>
8686
<name>com.woltlab.wcf.tagging.taggableObject</name>
87-
<interfacename>wcf\system\tagging\ITaggable</interfacename>
8887
</definition>
8988
<definition>
9089
<name>com.woltlab.wcf.deletedContent</name>

com.woltlab.wcf/page.xml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,8 @@
457457
<page identifier="com.woltlab.wcf.Tagged">
458458
<pageType>system</pageType>
459459
<controller>wcf\page\TaggedPage</controller>
460-
<name language="de">Inhalte mit bestimmtem Tag</name>
461-
<name language="en">Content with Particular Tag</name>
460+
<name language="de">Inhalte mit bestimmtem Tag (veraltet)</name>
461+
<name language="en">Content with Particular Tag (deprecated)</name>
462462
<permissions>user.tag.canViewTag</permissions>
463463
<requireObjectID>1</requireObjectID>
464464
<content language="en">
@@ -471,6 +471,20 @@
471471
<page identifier="com.woltlab.wcf.CombinedTagged">
472472
<pageType>system</pageType>
473473
<controller>wcf\page\CombinedTaggedPage</controller>
474+
<name language="de">Inhalte mit bestimmten Tags (veraltet)</name>
475+
<name language="en">Content with Particular Tags (deprecated)</name>
476+
<permissions>user.tag.canViewTag</permissions>
477+
<requireObjectID>1</requireObjectID>
478+
<content language="en">
479+
<title>Content with Particular Tags</title>
480+
</content>
481+
<content language="de">
482+
<title>Inhalte mit bestimmten Tags</title>
483+
</content>
484+
</page>
485+
<page identifier="com.woltlab.wcf.TaggedListView">
486+
<pageType>system</pageType>
487+
<controller>wcf\page\TaggedListViewPage</controller>
474488
<name language="de">Inhalte mit bestimmten Tags</name>
475489
<name language="en">Content with Particular Tags</name>
476490
<permissions>user.tag.canViewTag</permissions>

com.woltlab.wcf/templates/combinedTagged.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626

2727
<nav class="boxContent">
2828
<ul class="boxMenu">
29-
{foreach from=$availableObjectTypes item=availableObjectType}
30-
<li{if $objectType == $availableObjectType->objectType} class="active"{/if}>
31-
<a class="boxMenuLink" href="{link controller='CombinedTagged'}{@$linkParameters}&objectType={@$availableObjectType->objectType}{/link}">
32-
<span class="boxMenuLinkTitle">{lang}wcf.tagging.objectType.{@$availableObjectType->objectType}{/lang}</span>
33-
<span class="badge">{#$itemsPerType[$availableObjectType->objectType]}</span>
29+
{foreach from=$objectTypeLinks item=objectTypeLink}
30+
<li{if $objectType == $objectTypeLink[objectType]} class="active"{/if}>
31+
<a class="boxMenuLink" href="{$objectTypeLink[link]}">
32+
<span class="boxMenuLinkTitle">{$objectTypeLink[title]}</span>
33+
<span class="badge">{$objectTypeLink[items]}</span>
3434
</a>
3535
</li>
3636
{/foreach}

com.woltlab.wcf/templates/tagged.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
<nav class="boxContent">
2020
<ul class="boxMenu">
21-
{foreach from=$availableObjectTypes item=availableObjectType}
22-
<li{if $objectType == $availableObjectType->objectType} class="active"{/if}>
23-
<a class="boxMenuLink" href="{link controller='Tagged' object=$tag}objectType={@$availableObjectType->objectType}{/link}">
24-
<span class="boxMenuLinkTitle">{lang}wcf.tagging.objectType.{@$availableObjectType->objectType}{/lang}</span>
25-
<span class="badge">{#$itemsPerType[$availableObjectType->objectType]}</span>
21+
{foreach from=$objectTypeLinks item=objectTypeLink}
22+
<li{if $objectType == $objectTypeLink[objectType]} class="active"{/if}>
23+
<a class="boxMenuLink" href="{$objectTypeLink[link]}">
24+
<span class="boxMenuLinkTitle">{$objectTypeLink[title]}</span>
25+
<span class="badge">{$objectTypeLink[items]}</span>
2626
</a>
2727
</li>
2828
{/foreach}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{capture assign='pageTitle'}{$contentTitle} {lang}wcf.tagging.combinedTaggedObjects{/lang}{/capture}
2+
3+
{capture assign='contentHeader'}
4+
<header class="contentHeader">
5+
<div class="contentHeaderTitle">
6+
<h1 class="contentTitle">{$contentTitle} {lang}wcf.tagging.combinedTaggedObjects{/lang}</h1>
7+
</div>
8+
</header>
9+
{/capture}
10+
11+
{capture assign='sidebarRight'}
12+
<section class="box" data-static-box-identifier="com.woltlab.wcf.TaggedMenu">
13+
<h2 class="boxTitle">{lang}wcf.tagging.objectTypes{/lang}</h2>
14+
15+
<nav class="boxContent">
16+
<ul class="boxMenu">
17+
{foreach from=$objectTypeLinks item=objectTypeLink}
18+
<li{if $objectType == $objectTypeLink[objectType]} class="active"{/if}>
19+
<a class="boxMenuLink" href="{$objectTypeLink[link]}">
20+
<span class="boxMenuLinkTitle">{$objectTypeLink[title]}</span>
21+
<span class="badge">{$objectTypeLink[items]}</span>
22+
</a>
23+
</li>
24+
{/foreach}
25+
</ul>
26+
</nav>
27+
</section>
28+
29+
<section class="box" data-static-box-identifier="com.woltlab.wcf.TaggedTagCloud">
30+
<h2 class="boxTitle">{lang}wcf.tagging.tags{/lang}</h2>
31+
32+
<div class="boxContent">
33+
{include file='tagCloudBox' taggableObjectType=$objectType}
34+
</div>
35+
</section>
36+
{/capture}
37+
38+
{capture assign='contentInteractionButtons'}
39+
<a href="{link controller='TagSearch'}{/link}" class="contentInteractionButton button small">{icon name='magnifying-glass'} <span>{lang}wcf.search.type.tags{/lang}</span></a>
40+
{/capture}
41+
42+
{include file='header'}
43+
44+
<div class="section">
45+
{unsafe:$listView->render()}
46+
</div>
47+
48+
{include file='footer'}

wcfsetup/install/files/lib/data/article/TaggedArticleList.class.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* @copyright 2001-2019 WoltLab GmbH
1313
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1414
* @since 3.0
15+
* @deprecated 6.2
1516
*/
1617
class TaggedArticleList extends AccessibleArticleList
1718
{

wcfsetup/install/files/lib/page/CombinedTaggedPage.class.php

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace wcf\page;
44

5+
use Laminas\Diactoros\Response\RedirectResponse;
56
use wcf\data\DatabaseObject;
67
use wcf\data\DatabaseObjectList;
78
use wcf\data\object\type\ObjectType;
@@ -10,7 +11,9 @@
1011
use wcf\data\tag\TagList;
1112
use wcf\system\exception\IllegalLinkException;
1213
use wcf\system\exception\PermissionDeniedException;
14+
use wcf\system\request\LinkHandler;
1315
use wcf\system\tagging\ICombinedTaggable;
16+
use wcf\system\tagging\ITaggedListViewProvider;
1417
use wcf\system\tagging\TypedTagCloud;
1518
use wcf\system\WCF;
1619
use wcf\util\ArrayUtil;
@@ -23,6 +26,7 @@
2326
* @copyright 2001-2019 WoltLab GmbH
2427
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
2528
* @since 5.2
29+
* @deprecated 6.2 Use `TaggedListViewPage` instead.
2630
*
2731
* @extends MultipleLinkPage<DatabaseObjectList<DatabaseObject>>
2832
*/
@@ -104,10 +108,6 @@ public function readParameters()
104108
if (!$objectType->validateOptions() || !$objectType->validatePermissions()) {
105109
unset($this->availableObjectTypes[$key]);
106110
}
107-
108-
if (!($objectType->getProcessor() instanceof ICombinedTaggable)) {
109-
unset($this->availableObjectTypes[$key]);
110-
}
111111
}
112112

113113
if (empty($this->availableObjectTypes)) {
@@ -135,7 +135,16 @@ public function readParameters()
135135
}
136136
}
137137

138-
$this->processor = $this->objectType->getProcessor();
138+
if ($this->objectType->getProcessor() instanceof ITaggedListViewProvider) {
139+
return new RedirectResponse(
140+
LinkHandler::getInstance()->getControllerLink(TaggedListViewPage::class, [
141+
'objectType' => $this->objectType->objectType,
142+
'tagIDs' => $this->tagIDs,
143+
]),
144+
);
145+
} else {
146+
$this->processor = $this->objectType->getProcessor();
147+
}
139148
}
140149

141150
/**
@@ -171,19 +180,58 @@ public function assignVariables()
171180
'resultListTemplateName' => $this->processor->getTemplateName(),
172181
'resultListApplication' => $this->processor->getApplication(),
173182
'itemsPerType' => $this->itemsPerType,
183+
'objectTypeLinks' => $this->getObjectTypeLinks(),
174184
]);
175185

176186
if (\count($this->objectList) === 0) {
177187
@\header('HTTP/1.1 404 Not Found');
178188
}
179189
}
180190

181-
private function readItemsPerType(): void
191+
protected function getObjectTypeLinks(): array
192+
{
193+
$links = [];
194+
foreach ($this->availableObjectTypes as $objectType) {
195+
if ($objectType->getProcessor() instanceof ITaggedListViewProvider) {
196+
$processor = $objectType->getProcessor();
197+
\assert($processor instanceof ITaggedListViewProvider);
198+
199+
$title = $processor->getObjectTypeTitle();
200+
$controller = TaggedListViewPage::class;
201+
} else {
202+
$title = WCF::getLanguage()->get('wcf.tagging.objectType.' . $objectType->objectType);
203+
$controller = CombinedTaggedPage::class;
204+
}
205+
206+
$links[] = [
207+
'objectType' => $objectType->objectType,
208+
'title' => $title,
209+
'link' => LinkHandler::getInstance()->getControllerLink(
210+
$controller,
211+
[
212+
'objectType' => $objectType->objectType,
213+
'tagIDs' => $this->tagIDs
214+
]
215+
),
216+
'items' => $this->itemsPerType[$objectType->objectType] ?? 0,
217+
];
218+
}
219+
220+
return $links;
221+
}
222+
223+
protected function readItemsPerType(): void
182224
{
183225
foreach ($this->availableObjectTypes as $key => $objectType) {
184-
$objectList = $objectType->getProcessor()->getObjectListFor($this->tags);
185-
\assert($objectList instanceof DatabaseObjectList);
186-
$this->itemsPerType[$key] = $objectList->countObjects();
226+
if ($objectType->getProcessor() instanceof ITaggedListViewProvider) {
227+
$processor = $objectType->getProcessor();
228+
\assert($processor instanceof ITaggedListViewProvider);
229+
$this->itemsPerType[$key] = $processor->getListView($this->tagIDs)->countItems();
230+
} else {
231+
$objectList = $objectType->getProcessor()->getObjectListFor($this->tags);
232+
\assert($objectList instanceof DatabaseObjectList);
233+
$this->itemsPerType[$key] = $objectList->countObjects();
234+
}
187235
}
188236
}
189237
}

0 commit comments

Comments
 (0)