From ed01d085fbb9043103e55da64a4b43bbc64fade3 Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 3 Sep 2025 17:14:13 +0200 Subject: [PATCH 1/2] Allow a single object type handler to serve multiple types --- .../lib/acp/form/LabelGroupAddForm.class.php | 15 ++++++++++----- .../type/AbstractLabelObjectTypeHandler.class.php | 9 +++++++++ .../object/type/ILabelObjectTypeHandler.class.php | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php b/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php index 32df844522b..f0d2d0bd194 100644 --- a/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php @@ -129,12 +129,17 @@ public function readData() // get label object type handlers $objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.label.objectType'); foreach ($objectTypes as $objectType) { - $this->labelObjectTypes[$objectType->objectTypeID] = $objectType->getProcessor(); - $this->labelObjectTypes[$objectType->objectTypeID]->setObjectTypeID($objectType->objectTypeID); - } + $handler = $objectType->getProcessor(); + \assert($handler instanceof ILabelObjectTypeHandler); + + $container = $handler->getContainerForObjectType($objectType); + if ($container === null) { + $handler->setObjectTypeID($objectType->objectTypeID); + $container = $handler->getContainer(); + } - foreach ($this->labelObjectTypes as $objectTypeID => $labelObjectType) { - $this->labelObjectTypeContainers[$objectTypeID] = $labelObjectType->getContainer(); + $this->labelObjectTypes[$objectType->objectTypeID] = $handler; + $this->labelObjectTypeContainers[$objectType->objectTypeID] = $container; } parent::readData(); diff --git a/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php b/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php index 79310cbd7eb..f126fecd9c7 100644 --- a/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php +++ b/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php @@ -2,6 +2,7 @@ namespace wcf\system\label\object\type; +use wcf\data\object\type\ObjectType; use wcf\system\SingletonFactory; /** @@ -48,4 +49,12 @@ public function getContainer() { return $this->container; } + + #[\Override] + public function getContainerForObjectType(ObjectType $objectType): ?LabelObjectTypeContainer + { + // This exists for backwards-compatibility only; Implementations are + // expected to implement this method themselves. + return null; + } } diff --git a/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php b/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php index 7fc04855d81..7c51b84fe89 100644 --- a/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php +++ b/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php @@ -2,6 +2,8 @@ namespace wcf\system\label\object\type; +use wcf\data\object\type\ObjectType; + /** * Every label object type handler has to implement this interface. * @@ -11,11 +13,22 @@ */ interface ILabelObjectTypeHandler { + /** + * Provides a container object that groups all objects that can be assigned + * a label group. + * + * Implementations must not rely on any state provided by `getObjectTypeID()`. + * + * @since 6.2 + */ + public function getContainerForObjectType(ObjectType $objectType): ?LabelObjectTypeContainer; + /** * Sets object type id. * * @param int $objectTypeID * @return void + * @deprecated 6.2 Use `getContainerForObjectType()` instead. */ public function setObjectTypeID($objectTypeID); @@ -23,6 +36,7 @@ public function setObjectTypeID($objectTypeID); * Returns object type id. * * @return int + * @deprecated 6.2 Use `getContainerForObjectType()` instead. */ public function getObjectTypeID(); @@ -30,6 +44,7 @@ public function getObjectTypeID(); * Returns a label object type container. * * @return LabelObjectTypeContainer + * @deprecated 6.2 Use `getContainerForObjectType()` instead. */ public function getContainer(); From 4b6c09baac06c798a744c81010025567fb4cab2b Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 3 Sep 2025 17:31:06 +0200 Subject: [PATCH 2/2] Implicitly forward the calls to the legacy API This simplifies the code by avoiding the nullable parameter that would otherwise stuck around forever. --- .../lib/acp/form/LabelGroupAddForm.class.php | 4 ---- .../AbstractLabelObjectTypeHandler.class.php | 19 ++++++++----------- .../type/ILabelObjectTypeHandler.class.php | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php b/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php index f0d2d0bd194..f0f12ee1b4d 100644 --- a/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/LabelGroupAddForm.class.php @@ -133,10 +133,6 @@ public function readData() \assert($handler instanceof ILabelObjectTypeHandler); $container = $handler->getContainerForObjectType($objectType); - if ($container === null) { - $handler->setObjectTypeID($objectType->objectTypeID); - $container = $handler->getContainer(); - } $this->labelObjectTypes[$objectType->objectTypeID] = $handler; $this->labelObjectTypeContainers[$objectType->objectTypeID] = $container; diff --git a/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php b/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php index f126fecd9c7..380b44ba6fe 100644 --- a/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php +++ b/wcfsetup/install/files/lib/system/label/object/type/AbstractLabelObjectTypeHandler.class.php @@ -17,44 +17,41 @@ abstract class AbstractLabelObjectTypeHandler extends SingletonFactory implement /** * label object type container * @var LabelObjectTypeContainer + * @deprecated 6.2 Use `getContainerForObjectType()` instead. */ public $container; /** * object type id * @var int + * @deprecated 6.2 Use `getContainerForObjectType()` instead. */ public $objectTypeID = 0; - /** - * @inheritDoc - */ + #[\Override] public function setObjectTypeID($objectTypeID) { $this->objectTypeID = $objectTypeID; } - /** - * @inheritDoc - */ + #[\Override] public function getObjectTypeID() { return $this->objectTypeID; } - /** - * @inheritDoc - */ + #[\Override] public function getContainer() { return $this->container; } #[\Override] - public function getContainerForObjectType(ObjectType $objectType): ?LabelObjectTypeContainer + public function getContainerForObjectType(ObjectType $objectType): LabelObjectTypeContainer { // This exists for backwards-compatibility only; Implementations are // expected to implement this method themselves. - return null; + $this->setObjectTypeID($objectType->objectTypeID); + return $this->getContainer(); } } diff --git a/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php b/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php index 7c51b84fe89..133a06e15cf 100644 --- a/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php +++ b/wcfsetup/install/files/lib/system/label/object/type/ILabelObjectTypeHandler.class.php @@ -21,7 +21,7 @@ interface ILabelObjectTypeHandler * * @since 6.2 */ - public function getContainerForObjectType(ObjectType $objectType): ?LabelObjectTypeContainer; + public function getContainerForObjectType(ObjectType $objectType): LabelObjectTypeContainer; /** * Sets object type id.