DEPRECATION WARNING

This documentation is not using the current rendering mechanism and is probably outdated. The extension maintainer should switch to the new system. Details on how to use the rendering mechanism can be found here.

Custom event configuration

An event can be enhanced with configuration that is used during runtime to customize its behaviour.

Note

In this example, we add a startTime and endTime properties to configure when the event is dispatched.

This can be used for example to only trigger a Slack notification during business hours.

The configuration is done using a FlexForm:

my_extension/Configuration/FlexForm/Event/Contact/ContactFormSentEventFlexForm.xml
<T3DataStructure>
    <meta>
        <langDisable>1</langDisable>
    </meta>
    <sheets>
        <sDEF>
            <ROOT>
                <TCEforms>
                    <sheetTitle>Contact form: activation period</sheetTitle>
                </TCEforms>
                <type>array</type>
                <el>
                    <startTime>
                        <TCEforms>
                            <label>LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:flex_form.start_time</label>
                            <config>
                                <type>input</type>
                                <eval>time</eval>
                            </config>
                        </TCEforms>
                    </startTime>
                    <endTime>
                        <TCEforms>
                            <label>LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:flex_form.end_time</label>
                            <config>
                                <type>input</type>
                                <eval>time</eval>
                            </config>
                        </TCEforms>
                    </endTime>
                </el>
            </ROOT>
        </sDEF>
    </sheets>
</T3DataStructure>

This FlexForm must be saved into a file and configured in the definition at the path notiz.eventGroups.contactEvents.events.messageSent.configuration.flexForm.

For example in TypoScript:

my_extension/Configuration/TypoScript/NotiZ.typoscript
notiz {
    eventGroups {
        contactEvents {
            label = Events related to contact forms

            events {
                messageSent {
                    label = Contact form sent

                    className = Acme\MyExtension\Domain\Event\ContactFormSentEvent

                    # Configure your file like this:
                    configuration {
                        flexForm {
                            file = EXT:my_extension/Configuration/FlexForm/Event/Contact/ContactFormSentEventFlexForm.xml
                        }
                    }

                    connection {
                        type = signal

                        className = Acme\MyExtension\Controller\ContactController
                        name = sendMessage
                    }
                }
            }
        }
    }
}

You can then access the extra configuration inside the event via the $this->configuration class property.

my_extension/Classes/Domain/Event/ContactFormSentEvent.php
namespace Acme\MyExtension\Domain\Event;

use CuyZ\Notiz\Core\Event\AbstractEvent;
use Acme\MyExtension\Form\ContactForm;
use CuyZ\Notiz\Core\Event\Exception\CancelEventDispatch;
use DateTime;

class ContactFormSentEvent extends AbstractEvent
{
    /**
     * @label The message sent by the user
     * @marker
     *
     * @var string
     */
    private $message;

    /**
     * @label LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:name
     * @marker
     *
     * @var string
     */
    private $name;

    /**
     * @label The email of the user
     * @email
     *
     * @var string
     */
    private $email;

    /**
     * @param ContactForm $contactForm
     */
    public function run(ContactForm $contactForm)
    {
        $this->shouldRun();

        $this->message = $contactForm->getMessage();
        $this->name = $contactForm->getName();
        $this->email = $contactForm->getEmail();
    }

    /**
     * Checks if this event has a start and end time. If so, it will cancel
     * the dispatching if the current time is not between the start and end.
     *
     * @throws CancelEventDispatch
     */
    private function shouldRun()
    {
        $startTime = $this->getTime('startTime');
        $endTime = $this->getTime('endTime');

        if (null === $startTime || null === $endTime) {
            return;
        }

        $now = new DateTime();

        if ($now < $startTime || $now > $endTime) {
            $this->cancelDispatch();
        }
    }

    /**
     * @param string $key
     * @return DateTime|null
     */
    private function getTime(string $key): ?DateTime
    {
        // We access the FlexForm values here
        if (!isset($this->configuration[$key])) {
            return null;
        }

        return DateTime::createFromFormat('!H:i', $this->configuration[$key]) ?: null;
    }
}