Events
NumberNine dispatches lots of events to let you hook into the default behavior and modify it to your needs.
Events are objects containing data that you can change.
To intercept these events, simply create a service implementing Symfony's EventSubscriberInterface.
As an example:
namespace App\EventSubscriber;
use NumberNine\Event\HeadEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class HeadEventSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            HeadEvent::class => 'alterHeadEvent',
        ];
    }
    public function alterHeadEvent(HeadEvent $event): void
    {
        // do what you need here
    }
}
Theme events
HeadEvent
HeadEvent is dispatched when the theme calls the Twig function N9_head().
Although you could directly modify base.html.twig to your needs, it defeats extensibility. Thanks to this event, plugins or themes can add whatever they need in the head section of the page.
NumberNine itself hooks into HeadEvent and dispatches other events, as seen below.
HeadTitleEvent
HeadTitleEvent contains the title of the page.
HeadStylesheetsEvent
HeadStylesheetsEvent contains a list of rendered HTML style tags.
HeadThemeCustomStylesEvent
HeadThemeCustomStylesEvent contains a CSS dynamic sheet that is rendered after all included sheets. This is useful to let the user override some properties.
HeaderScriptsEvent
HeadThemeCustomStylesEvent contains a list of rendered HTML script tags.
FooterEvent
FooterEvent is dispatched when the theme calls the Twig function N9_footer().
Form events
LoginPathsEvent
LoginPathsEvent contains the list of pages that host a login form. This is used by the login authenticator to know if it's supposed to handle login on your page.
RegistrationFormBuilderEvent
RegistrationFormBuilderEvent contains the registration form builder so you can modify the registration behavior.
RegistrationFormSuccessEvent
RegistrationFormSuccessEvent is dispatched when the registration is successful and the user logged in. NumberNine's default behavior is to listen to this even then notify the user by email.
HiddenCustomFieldsEvent
HiddenCustomFieldsEvent allows you to hide custom fields in the content entity edition form. It's useful if you store some data in custom fields that you don't want the user to know about, or if these custom fields have a dedicated panel or card. As an example, a page template is stored as page_template custom field, but shown to the user as a card with a select form element. As the user should not have access to this custom field to modify it freely, it's hidden using this event.
Registration events
AreasRegistrationEvent
AreasRegistrationEvent lets you add areas to your theme. If you want to know more about areas, please read this page.
CapabilitiesListEvent
CapabilitiesListEvent contains the full list of capabilities. To add a new capability, follow this guide.
ContentTypeRegistrationEvent
ContentTypeRegistrationEvent contains content types that will be used in your app. To register new content types, follow this guide.
ImageSizesEvent
ImageSizesEvent contains the list of the thumbnails sizes that need to be generated. You can add new sizes and they will be automatically generated when you regenerate the thumbnails.
RouteRegistrationEvent
RouteRegistrationEvent contains the list of registered routes. Listening to this event enables you to create dynamic routes.
General events
ComponentProcessParametersEvent
ComponentProcessParametersEvent is useful if you need to alter the content of a component's parameters just before it's get rendered with Twig.
ContentEntityShowForwardEvent
ContentEntityShowForwardEvent contains the response that should render the current entity. You can alter this response by forwarding it to another controller. Use ForwardRequestTrait to ease forwarding.
CurrentContentEntityEvent
CurrentContentEntityEvent is dispatched before the rendering of the page. In a service or shortcode, listen to this event to know what you're dealing with.
CurrentRequestTermEvent
CurrentRequestTermEvent is dispatched on term index pages before the rendering of the page. In a service or shortcode, listen to this event to know what you're dealing with.
MainLoopQueryEvent
MainLoopQueryEvent contains the query builder of the current page query for a given content type. Listen to this event if you need to add or alter criterias.
PaginatorEvent
PaginatorEvent contains the paginator of the current page. Useful if you need it, for example in a shortcode.
ShortcodeProcessParametersEvent
ShortcodeProcessParametersEvent is useful if you need to alter the content of a shortcode's parameters just before it's get rendered with Twig.
TemplateToRenderEvent
TemplateToRenderEvent contains the current Twig template about to be rendered. You can change the template to render depending on your needs. As an example, NumberNine alters the template if it detects that the My account is about to be rendered.
UpdateContentEntityEvent
UpdateContentEntityEvent is dispatched just before a content entity is about to be saved in database from the admin panel. Use it to apply extra modifications.
