Skip to content

Commit 94dc4cf

Browse files
committed
Add bulk interaction to set the category id for articles
1 parent 03de244 commit 94dc4cf

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?php
2+
3+
namespace wcf\acp\action;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use Psr\Http\Server\RequestHandlerInterface;
9+
use wcf\data\category\CategoryNodeTree;
10+
use wcf\http\Helper;
11+
use wcf\system\exception\IllegalLinkException;
12+
use wcf\system\exception\PermissionDeniedException;
13+
use wcf\system\form\builder\field\SingleSelectionFormField;
14+
use wcf\system\form\builder\Psr15DialogForm;
15+
use wcf\system\WCF;
16+
17+
/**
18+
* Handles setting the category for articles.
19+
*
20+
* @author Olaf Braun
21+
* @copyright 2001-2025 WoltLab GmbH
22+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
23+
* @since 6.2
24+
*/
25+
final class ArticleCategoryAction implements RequestHandlerInterface
26+
{
27+
public function handle(ServerRequestInterface $request): ResponseInterface
28+
{
29+
if (!WCF::getSession()->getPermission("admin.content.article.canManageArticle")) {
30+
throw new PermissionDeniedException();
31+
}
32+
33+
$parameters = Helper::mapQueryParameters(
34+
$request->getQueryParams(),
35+
<<<'EOT'
36+
array {
37+
objectIDs: positive-int[]
38+
}
39+
EOT
40+
);
41+
42+
if ($parameters['objectIDs'] === []) {
43+
throw new IllegalLinkException();
44+
}
45+
46+
$form = $this->getForm();
47+
48+
if ($request->getMethod() === 'GET') {
49+
return $form->toResponse();
50+
} elseif ($request->getMethod() === 'POST') {
51+
$response = $form->validateRequest($request);
52+
if ($response !== null) {
53+
return $response;
54+
}
55+
56+
$data = $form->getData()['data'];
57+
58+
WCF::getDB()->beginTransaction();
59+
60+
$sql = "UPDATE wcf1_article
61+
SET categoryID = ?
62+
WHERE articleID = ?";
63+
$statement = WCF::getDB()->prepare($sql);
64+
65+
foreach ($parameters['objectIDs'] as $articleID) {
66+
$statement->execute([$data['categoryID'], $articleID]);
67+
}
68+
69+
WCF::getDB()->commitTransaction();
70+
71+
return new JsonResponse([]);
72+
} else {
73+
throw new \LogicException('Unreachable');
74+
}
75+
}
76+
77+
private function getForm(): Psr15DialogForm
78+
{
79+
$form = new Psr15DialogForm(
80+
static::class,
81+
WCF::getLanguage()->get('wcf.article.button.setCategory')
82+
);
83+
$form->appendChildren([
84+
SingleSelectionFormField::create('categoryID')
85+
->label('wcf.acp.article.category')
86+
->options((new CategoryNodeTree('com.woltlab.wcf.article.category'))->getIterator(), true)
87+
->required()
88+
]);
89+
90+
$form->markRequiredFields(false);
91+
$form->build();
92+
93+
return $form;
94+
}
95+
}

wcfsetup/install/files/lib/system/interaction/bulk/admin/ArticleBulkInteractions.class.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
namespace wcf\system\interaction\bulk\admin;
44

5+
use wcf\acp\action\ArticleCategoryAction;
56
use wcf\data\article\AccessibleArticleList;
67
use wcf\data\article\Article;
78
use wcf\data\article\ViewableArticle;
89
use wcf\event\interaction\bulk\admin\ArticleBulkInteractionCollecting;
910
use wcf\system\event\EventHandler;
1011
use wcf\system\interaction\bulk\AbstractBulkInteractionProvider;
1112
use wcf\system\interaction\bulk\BulkDeleteInteraction;
13+
use wcf\system\interaction\bulk\BulkFormBuilderDialogInteraction;
1214
use wcf\system\interaction\bulk\BulkRestoreInteraction;
1315
use wcf\system\interaction\bulk\BulkRpcInteraction;
1416
use wcf\system\interaction\bulk\BulkTrashInteraction;
@@ -76,6 +78,11 @@ function (ViewableArticle $article): bool {
7678
return $article->publicationStatus === Article::PUBLISHED;
7779
}
7880
),
81+
new BulkFormBuilderDialogInteraction(
82+
'setCategory',
83+
ArticleCategoryAction::class,
84+
'wcf.article.button.setCategory'
85+
)
7986
]);
8087

8188
EventHandler::getInstance()->fire(

wcfsetup/install/lang/de.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3338,6 +3338,7 @@ freigeschaltet. {if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if
33383338
<item name="wcf.article.category.delete.sure"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Willst du{else}Wollen Sie{/if} diese Kategorie wirklich löschen? Alle sich in dieser Kategorie befindlichen Unterkategorien werden in die Elternkategorie dieser Kategorie verschoben und Artikel, die sich in dieser Kategorie befinden, werden gelöscht.]]></item>
33393339
<item name="wcf.article.button.publish"><![CDATA[Veröffentlichen]]></item>
33403340
<item name="wcf.article.button.unpublish"><![CDATA[Veröffentlichung zurückziehen]]></item>
3341+
<item name="wcf.article.button.setCategory"><![CDATA[Kategorie ändern]]></item>
33413342
</category>
33423343
<category name="wcf.attachment">
33433344
<item name="wcf.attachment.file.info"><![CDATA[{@$attachment->filesize|filesize} – {plural value=$attachment->downloads 1="1 Download" other="# Downloads"}]]></item>

wcfsetup/install/lang/en.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3263,6 +3263,7 @@ Your account on {@PAGE_TITLE|phrase} [URL:{link isEmail=true}{/link}] has been a
32633263
<item name="wcf.article.category.delete.sure"><![CDATA[Do you really want to delete this category? All child categories of this category will be moved to this category’s parent category. Articles in this category will be deleted.]]></item>
32643264
<item name="wcf.article.button.publish"><![CDATA[Publish]]></item>
32653265
<item name="wcf.article.button.unpublish"><![CDATA[Withdraw Publication]]></item>
3266+
<item name="wcf.article.button.setCategory"><![CDATA[Set category]]></item>
32663267
</category>
32673268
<category name="wcf.attachment">
32683269
<item name="wcf.attachment.file.info"><![CDATA[{@$attachment->filesize|filesize} – {plural value=$attachment->downloads 1="1 Download" other="# Downloads"}]]></item>

0 commit comments

Comments
 (0)