Skip to content

Commit 57fc873

Browse files
authored
Merge pull request #6334 from WoltLab/6.2-deleted-content-list-view
Migrate deleted content list to list view
2 parents bfa788e + 342fa90 commit 57fc873

12 files changed

Lines changed: 404 additions & 83 deletions

com.woltlab.wcf/page.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,21 @@
366366
<page identifier="com.woltlab.wcf.DeletedContentList">
367367
<pageType>system</pageType>
368368
<controller>wcf\page\DeletedContentListPage</controller>
369+
<name language="de">Gelöschte Inhalte (veraltet)</name>
370+
<name language="en">Deleted Content (deprecated)</name>
371+
<hasFixedParent>1</hasFixedParent>
372+
<parent>com.woltlab.wcf.ModerationList</parent>
373+
<permissions>mod.general.canUseModeration</permissions>
374+
<content language="en">
375+
<title>Deleted Content</title>
376+
</content>
377+
<content language="de">
378+
<title>Gelöschte Inhalte</title>
379+
</content>
380+
</page>
381+
<page identifier="com.woltlab.wcf.DeletedContentListView">
382+
<pageType>system</pageType>
383+
<controller>wcf\page\DeletedContentListViewPage</controller>
369384
<name language="de">Gelöschte Inhalte</name>
370385
<name language="en">Deleted Content</name>
371386
<hasFixedParent>1</hasFixedParent>

com.woltlab.wcf/templates/deletedContentList.tpl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
{capture assign='pageTitle'}{lang}wcf.moderation.deletedContent.{@$objectType}{/lang}{/capture}
22

33
{capture assign='sidebarRight'}
4-
{unsafe:$deletedItemsBox->render()}
4+
<section class="box" data-static-box-identifier="com.woltlab.wcf.DeletedContentListMenu">
5+
<h2 class="boxTitle">{lang}wcf.moderation.deletedContent.objectTypes{/lang}</h2>
6+
7+
<div class="boxContent">
8+
<ul class="boxMenu">
9+
{foreach from=$providerLinks item=providerLink}
10+
<li{if $objectType === $providerLink[identifier]} class="active"{/if}>
11+
<a class="boxMenuLink" href="{$providerLink[link]}">
12+
<span class="boxMenuLinkTitle">{$providerLink[title]}</span>
13+
</a>
14+
</li>
15+
{/foreach}
16+
</ul>
17+
</div>
18+
</section>
519
{/capture}
620

721
{capture assign='contentTitle'}{lang}wcf.moderation.deletedContent.{@$objectType}{/lang}{/capture}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{capture assign='pageTitle'}{$contentTitle}{/capture}
2+
3+
{capture assign='contentHeader'}
4+
<header class="contentHeader">
5+
<div class="contentHeaderTitle">
6+
<h1 class="contentTitle">{$contentTitle}</h1>
7+
</div>
8+
</header>
9+
{/capture}
10+
11+
{capture assign='sidebarRight'}
12+
<section class="box" data-static-box-identifier="com.woltlab.wcf.DeletedContentListMenu">
13+
<h2 class="boxTitle">{lang}wcf.moderation.deletedContent.objectTypes{/lang}</h2>
14+
15+
<div class="boxContent">
16+
<ul class="boxMenu">
17+
{foreach from=$providerLinks item=providerLink}
18+
<li{if $provider === $providerLink[identifier]} class="active"{/if}>
19+
<a class="boxMenuLink" href="{$providerLink[link]}">
20+
<span class="boxMenuLinkTitle">{$providerLink[title]}</span>
21+
</a>
22+
</li>
23+
{/foreach}
24+
</ul>
25+
</div>
26+
</section>
27+
{/capture}
28+
29+
{include file='header'}
30+
31+
<div class="section {$containerCssClassName}">
32+
{unsafe:$listView->render()}
33+
</div>
34+
35+
{include file='footer'}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace wcf\event\moderation;
4+
5+
use wcf\data\object\type\ObjectTypeCache;
6+
use wcf\event\IPsr14Event;
7+
use wcf\system\moderation\IDeletedContentListViewProvider;
8+
use wcf\system\moderation\IDeletedContentProvider;
9+
10+
/**
11+
* Requests the collection of deleted content providers.
12+
*
13+
* @author Marcel Werk
14+
* @copyright 2001-2025 WoltLab GmbH
15+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16+
* @since 6.2
17+
*/
18+
final class DeletedContentProvidersCollecting implements IPsr14Event
19+
{
20+
/**
21+
* @var list<IDeletedContentProvider | IDeletedContentListViewProvider>
22+
*/
23+
private array $providers = [];
24+
25+
public function __construct()
26+
{
27+
$this->loadLegacyProviders();
28+
}
29+
30+
public function register(IDeletedContentListViewProvider $provider): void
31+
{
32+
$this->providers[$provider->getIdentifier()] = $provider;
33+
}
34+
35+
/**
36+
* @return list<IDeletedContentProvider | IDeletedContentListViewProvider>
37+
*/
38+
public function getProviders(): array
39+
{
40+
return $this->providers;
41+
}
42+
43+
/**
44+
* @deprecated 6.2
45+
*/
46+
private function loadLegacyProviders(): void
47+
{
48+
$objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.deletedContent');
49+
foreach ($objectTypes as $objectType) {
50+
$this->providers[$objectType->objectType] = $objectType->getProcessor();
51+
}
52+
}
53+
}

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

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
use wcf\data\DatabaseObject;
77
use wcf\data\DatabaseObjectList;
88
use wcf\data\object\type\ObjectTypeCache;
9-
use wcf\event\moderation\DeletedItemsCollecting;
9+
use wcf\event\moderation\DeletedContentProvidersCollecting;
1010
use wcf\system\event\EventHandler;
1111
use wcf\system\exception\IllegalLinkException;
12-
use wcf\system\moderation\DeletedItemsBoxComponent;
12+
use wcf\system\moderation\IDeletedContentListViewProvider;
13+
use wcf\system\request\LinkHandler;
1314
use wcf\system\WCF;
1415

1516
/**
@@ -18,6 +19,7 @@
1819
* @author Marcel Werk
1920
* @copyright 2001-2019 WoltLab GmbH
2021
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
22+
* @deprecated 6.2 Use `DeletedContentListViewPage` instead.
2123
*
2224
* @extends MultipleLinkPage<DatabaseObjectList<DatabaseObject>>
2325
*/
@@ -39,13 +41,20 @@ class DeletedContentListPage extends MultipleLinkPage
3941
*/
4042
public $objectType;
4143

44+
/**
45+
* @var array<string, IDeletedContentProvider | IDeletedContentListViewProvider>
46+
*/
47+
private array $providers = [];
48+
4249
/**
4350
* @inheritDoc
4451
*/
4552
public function readParameters()
4653
{
4754
parent::readParameters();
4855

56+
$this->loadProviders();
57+
4958
if (isset($_REQUEST['objectType'])) {
5059
$this->objectType = ObjectTypeCache::getInstance()->getObjectTypeByName(
5160
'com.woltlab.wcf.deletedContent',
@@ -56,26 +65,30 @@ public function readParameters()
5665
throw new IllegalLinkException();
5766
}
5867
} else {
59-
$link = $this->getFirstTypeLink();
60-
if ($link === null) {
68+
if ($this->providers === []) {
6169
throw new IllegalLinkException();
6270
}
6371

64-
return new RedirectResponse($link);
72+
$provider = \reset($this->providers);
73+
if ($provider instanceof IDeletedContentListViewProvider) {
74+
return new RedirectResponse(LinkHandler::getInstance()->getControllerLink(
75+
DeletedContentListViewPage::class,
76+
['provider' => $provider->getIdentifier()]
77+
));
78+
}
79+
80+
$this->objectType = ObjectTypeCache::getInstance()->getObjectTypeByName(
81+
'com.woltlab.wcf.deletedContent',
82+
\array_key_first($this->providers)
83+
);
6584
}
6685
}
6786

68-
private function getFirstTypeLink(): ?string
87+
private function loadProviders(): void
6988
{
70-
$event = new DeletedItemsCollecting();
89+
$event = new DeletedContentProvidersCollecting();
7190
EventHandler::getInstance()->fire($event);
72-
$types = $event->getTypes();
73-
74-
if ($types === []) {
75-
return null;
76-
}
77-
78-
return reset($types)->link;
91+
$this->providers = $event->getProviders();
7992
}
8093

8194
/**
@@ -94,10 +107,36 @@ public function assignVariables()
94107
parent::assignVariables();
95108

96109
WCF::getTPL()->assign([
97-
'deletedItemsBox' => new DeletedItemsBoxComponent($this->objectType->objectType),
110+
'providerLinks' => $this->getProviderLinks(),
98111
'objectType' => $this->objectType->objectType,
99112
'resultListTemplateName' => $this->objectType->getProcessor()->getTemplateName(),
100113
'resultListApplication' => $this->objectType->getProcessor()->getApplication(),
101114
]);
102115
}
116+
117+
private function getProviderLinks(): array
118+
{
119+
$links = [];
120+
foreach ($this->providers as $identifier => $provider) {
121+
if ($provider instanceof IDeletedContentListViewProvider) {
122+
$title = $provider->getObjectTypeTitle();
123+
$link = LinkHandler::getInstance()->getControllerLink(DeletedContentListViewPage::class, [
124+
'provider' => $identifier,
125+
]);
126+
} else {
127+
$title = WCF::getLanguage()->getDynamicVariable('wcf.moderation.deletedContent.objectType.' . $identifier);
128+
$link = LinkHandler::getInstance()->getControllerLink(self::class, [
129+
'objectType' => $identifier,
130+
]);
131+
}
132+
133+
$links[] = [
134+
'identifier' => $identifier,
135+
'title' => $title,
136+
'link' => $link,
137+
];
138+
}
139+
140+
return $links;
141+
}
103142
}

0 commit comments

Comments
 (0)