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;
->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')
<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>
<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>