Update event listener GUI validation to consider new `IEvent` interface
authorMatthias Schmidt <gravatronics@live.com>
Thu, 17 Jun 2021 05:39:26 +0000 (07:39 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Thu, 17 Jun 2021 05:39:26 +0000 (07:39 +0200)
wcfsetup/install/files/lib/system/package/plugin/EventListenerPackageInstallationPlugin.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 5506fb61cb5ec3b5f2c8586360effc6002d1641d..c16611495ee6b0ab89f08f9c30154dd9b76bd6d2 100644 (file)
@@ -10,6 +10,7 @@ use wcf\system\devtools\pip\IDevtoolsPipEntryList;
 use wcf\system\devtools\pip\IGuiPackageInstallationPlugin;
 use wcf\system\devtools\pip\TXmlGuiPackageInstallationPlugin;
 use wcf\system\event\EventHandler;
+use wcf\system\event\IEvent;
 use wcf\system\event\listener\IParameterizedEventListener;
 use wcf\system\form\builder\container\FormContainer;
 use wcf\system\form\builder\field\BooleanFormField;
@@ -264,7 +265,36 @@ class EventListenerPackageInstallationPlugin extends AbstractXMLPackageInstallat
                 ->objectProperty('listenerclassname')
                 ->label('wcf.acp.pip.eventListener.listenerClassName')
                 ->required()
-                ->implementedInterface(IParameterizedEventListener::class),
+                ->addValidator(new FormFieldValidator('callable', function (ClassNameFormField $formField) {
+                    $listenerClassName = $formField->getValue();
+                    /** @var TextFormField $eventClassNameField */
+                    $eventClassNameField = $formField->getDocument()->getNodeById('eventClassName');
+                    $eventClassName = $eventClassNameField->getValue();
+                    
+                    if (\is_subclass_of($eventClassName, IEvent::class)) {
+                        if (!is_callable(new $listenerClassName)) {
+                            $formField->addValidationError(
+                                new FormFieldValidationError(
+                                    'noCallable',
+                                    'wcf.acp.pip.eventListener.listenerClassName.error.noCallable',
+                                    [
+                                        'listenerClassName' => $listenerClassName,
+                                    ]
+                                )
+                            );
+                        }
+                    } elseif (!\is_subclass_of($listenerClassName, IParameterizedEventListener::class)) {
+                        $formField->addValidationError(
+                            new FormFieldValidationError(
+                                'interface',
+                                'wcf.form.field.className.error.interface',
+                                [
+                                    'interface' => IParameterizedEventListener::class,
+                                ]
+                            )
+                        );
+                    }
+                })),
 
             SingleSelectionFormField::create('environment')
                 ->label('wcf.acp.pip.eventListener.environment')
index 1bd69fa451a68581ad047f46fd45ba6fe2bd43b2..0f0eb033075ab7160f76b1639612a329fcefb705 100644 (file)
@@ -2372,6 +2372,7 @@ Die Datenbestände werden sorgfältig gepflegt, aber es ist nicht ausgeschlossen
                <item name="wcf.acp.pip.eventListener.inherit"><![CDATA[Vererbung unterstützen]]></item>
                <item name="wcf.acp.pip.eventListener.inherit.description"><![CDATA[Wird Vererbung unterstützt, reagiert der Event-Listener nicht nur, wenn das Event von der oben angegebenen Klasse ausgelöst wird, sondern auch wenn es von Kindklassen der angegebenen Klasse ausgelöst wird.]]></item>
                <item name="wcf.acp.pip.eventListener.listenerClassName"><![CDATA[PHP-Event-Listener-Klasse]]></item>
+               <item name="wcf.acp.pip.eventListener.listenerClassName.error.noCallable"><![CDATA[Die Klasse <kbd>{$listenerClassName}</kbd> hat keine <kbd>__invoke()</kbd>-Methode.]]></item>
                <item name="wcf.acp.pip.eventListener.listenerName"><![CDATA[Bezeichner des Event-Listeners]]></item>
                <item name="wcf.acp.pip.eventListener.listenerName.description"><![CDATA[Eindeutiger Bezeichner des Event-Listeners, der nur Buchstaben enthalten darf und mit einem Kleinbuchstaben beginnen muss.]]></item>
                <item name="wcf.acp.pip.eventListener.listenerName.error.format"><![CDATA[Der angegebene Bezeichner ist ungültig.]]></item>
index 658b49c14c52fc029a5b56bbc1ad1ae954144c4b..502e959642640f84e055b46e62d740a5c054a0c6 100644 (file)
@@ -2358,6 +2358,7 @@ If you have <strong>already bought the licenses for the listed apps</strong>, th
                <item name="wcf.acp.pip.eventListener.eventName"><![CDATA[Event Names]]></item>
                <item name="wcf.acp.pip.eventListener.eventName.description"><![CDATA[Names of the event of the relevant class the event listener is listening to. Default value: <kbd>:default</kbd>]]></item>
                <item name="wcf.acp.pip.eventListener.listenerClassName"><![CDATA[PHP Event Listener Class]]></item>
+               <item name="wcf.acp.pip.eventListener.listenerClassName.error.noCallable"><![CDATA[The class <kbd>{$listenerClassName}</kbd> does not have a <kbd>__invoke()</kbd> method.]]></item>
                <item name="wcf.acp.pip.eventListener.environment"><![CDATA[Environment]]></item>
                <item name="wcf.acp.pip.eventListener.environment.description"><![CDATA[The environment determines whether the event listener is executed in the frontend (<kbd>user</kbd>), the ACP (<kbd>admin</kbd>), or in both (<kbd>all</kbd>).]]></item>
                <item name="wcf.acp.pip.eventListener.inherit"><![CDATA[Support Inheritance]]></item>