Zum Inhalt

Events und Hooks

Events sind definierte Ereignisse, die im Workflow des Contentfly CMS auftreten bzw. auftreten können. Für jedes Event kann ein Eventhandler (oder auch mehrere) reqistriert werden, der automatisch beim Auftreten des Events vom Contentfly CMS aufgerufen wird.

Eventhandler

Registrieren

in custom/app.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

$app->extend('dispatcher', function (EventDispatcherInterface $dispatcher, $app) {

  $dispatcher->addListener('EVENT1', function ($event) {
    //Event-Handling
    $response = $event->getParam('response');
  });

  $dispatcher->addListener('EVENT2', function ($event) {
    //Event-Handling
    $response = $event->getParam('response');
  });

  return $dispatcher;

});

Jedes Event wird vom Contentfly CMS mit unterschiedlichen Parametern aufgerufen. Diese können über $event->getParam(NAME) abgefragt werden. Die zum jeweiligen Event verfügbaren Parameter finden Sie in den folgenden Abschnitten.

Parameter anpassen

Die vom Event übergebenen Paramater können angepasst werden, um den weitergehende Programmausführung des Contentfly CMS zu beeinflussen. Beispielsweise kann bei der Auflistung der Objekte über die Schnittstelle /api/list die Limitierung auf 2 Objekte gesetzt werden.

Objekte

Parameter die einen Objekttyp, z.B. \Symfony\Component\HttpFoundation\Response haben, können direkt angepasst werden.

1
2
3
4
5
<?php
$dispatcher->addListener(EVENT_NAME, function (\Areanet\PIM\Classes\Event $event) {
  $response = $event->getParam('response'); // \Symfony\Component\HttpFoundation\Response
  $response->headers->set('Content-Type', 'text/html');
});

Arrays und Strings

Parameter, die vom Typ Array oder String sind, müssen nach der Anpassung wieder an die Eventklasse zurückgeschrieben werden.

1
2
3
4
5
6
<?php
$dispatcher->addListener(EVENT_NAME, function (\Areanet\PIM\Classes\Event $event) {
  $paramName = $event->getParam('paramName'); // String
  $paramName = 'foo';
  $event->setParam('paramName', $paramName);
});

Ausführung abbrechen

Sie können eine komplette Ausführung des Contentfly CMS in einem Eventhandler abbrechen, um z.B. den Upload von Dateien für bestimmte Benutzer(gruppen) backend-seitig zu deaktivieren.

1
2
3
4
5
6
7
8
<?php
$dispatcher->addListener(EVENT_NAME, function (\Areanet\PIM\Classes\Event $event) {
  $user = $event->getParam('user'); // Areanet\Entity/User

  if($user->getAlias() == 'Peter Pan'){
    throw new Exception(''Upload für Peter Pan leider nicht erlaubt.');
  }
});

Controller-Events

Die Controller Events sind, wie der Name schon sagt, an die Contentfly CMS-Controller gebunden.

Hinweis

Die Controller und entsprechenden Methoden finden Sie im Ordner appcms/areanet/PIM/Controller.

pim.controller.before

Wird vor der eigentlichen Code-Ausführung von jedem Controller ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.controller.before', function(\Areanet\PIM\Classes\Event $event){});

pim.controller.before.CONTROLLER

Wird vor der eigentlichen Code-Ausführung von jedem Controller mit dem Name CONTROLLER ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.controller.before.api', function(\Areanet\PIM\Classes\Event $event){});

pim.controller.before.CONTROLLER.METHOD

Wird vor der eigentlichen Code-Ausführung von jedem Controller mit dem Name CONTROLLER und der Methode METHOD ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.controller.before.api.list', function(\Areanet\PIM\Classes\Event $event){});

pim.controller.after

Wird nach der eigentlichen Code-Ausführung von jedem Controller ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
response \Symfony\Component\HttpFoundation\Response
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.controller.after', function(\Areanet\PIM\Classes\Event $event){});

pim.controller.after.CONTROLLER

Wird nach der eigentlichen Code-Ausführung von jedem Controller mit dem Name CONTROLLER ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
response \Symfony\Component\HttpFoundation\Response
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.controller.after.api', function(\Areanet\PIM\Classes\Event $event){});

pim.controller.after.CONTROLLER.METHOD

Wird vor der eigentlichen Code-Ausführung von jedem Controller mit dem Name CONTROLLER und der Methode METHOD ausgeführt.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
response \Symfony\Component\HttpFoundation\Response
app Silex\Application

Beispiel

1
2
3
4
5
6
7
8
<?php
//JSON-Response nach /api/schema verändern
$dispatcher->addListener('pim.controller.after.api.schema', function (\Areanet\PIM\Classes\Event $event) {
    $response         = $event->getParam('response');
    $content          = json_decode($response->getContent());
    $content->message = "mySchemaAction";
    $response->setContent(json_encode($content));
});

Entity-Events

Die Entity-Events sind, wie der Name schon sagt, an Statusupdates der Doctrine-Entities im Contentfly CMS gebunden. Die folgenden Entity-Events werden sowohl für die Standard-Entities, als auch für die benutzerdefinierten Entities aufgerufen.

pim.entity.before.list

Wird vor der Auflistung einer Entität in der list-Methode im Api-Controller aufgerufen. Hier ist beispielsweise die Manipulation der Doctrine-Abfrage über den QueryBuilder möglich.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
queryBuilder Doctrine\DBAL\QueryBuilder
entity String Name der Entität

Beispiel

1
2
3
4
5
<?php
$dispatcher->addListener('pim.entity.before.list', function(\Areanet\PIM\Classes\Event $event){
   $queryBuilder = $event->getParam('queryBuilder');
   $queryBuilder->setMaxResults(2); //MySQL LIMIT
});

pim.entity.before.insert

Wird vor dem Hinzufügen (Neu Speichern) einer Entität in der insert-Methode im Api-Controller aufgerufen. Hier können beispielsweise die zu speichernden Daten/Eigenschaften über den Parameter data manipuliert werden.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
data Array zu speicherende Daten
entity String Name der Entität

Beispiel

1
2
3
4
5
<?php
$dispatcher->addListener('pim.entity.before.insert', function(\Areanet\PIM\Classes\Event $event){
   $data = $event->getParam('data');
   $data['title'] = 'Test';
});

pim.entity.after.insert

Wird nach dem Hinzufügen (Neu Speichern) einer Entität in der insert-Methode im Api-Controller aufgerufen.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
object Areanet\PIM\Entity Neue angelegtes Objekt der entsprechenden Entität
entity String Name der Entität

Beispiel

1
2
3
4
5
<?php
$dispatcher->addListener('pim.entity.after.insert', function(\Areanet\PIM\Classes\Event $event){
   $object = $event->getParam('object');
   $object->getTitle();
});

pim.entity.before.insert

Wird vor dem Aktualisieren (Speichern) einer Entität in der update-Methode im Api-Controller aufgerufen. Hier können beispielsweise die zu speichernden Daten/Eigenschaften über den Parameter data manipuliert werden.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
data Array zu speicherende Daten
id String Objekt-ID
entity String Name der Entität

Beispiel

1
2
3
4
5
<?php
$dispatcher->addListener('pim.entity.before.update', function(\Areanet\PIM\Classes\Event $event){
   $data = $event->getParam('data');
   $data['title'] = 'Test';
});

pim.entity.after.update

Wird nach dem Aktualisieren (Speichern) einer Entität in der update-Methode im Api-Controller aufgerufen.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
data Array zu speicherende Daten
id String Objekt-ID
entity String Name der Entität

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.after.update', function(\Areanet\PIM\Classes\Event $event){ });

pim.entity.before.delete

Wird vor dem Aktualisieren (Speichern) einer Entität in der delete-Methode im Api-Controller aufgerufen.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
id String Objekt-ID
entity String Name der Entität

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.before.delete', function(\Areanet\PIM\Classes\Event $event){});

pim.entity.after.delete

Wird nach dem Löschen einer Entität in der delete-Methode im Api-Controller aufgerufen.

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
id String Objekt-ID
entity String Name der Entität

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.after.delete', function(\Areanet\PIM\Classes\Event $event){ });

File-Events

Die File-Events sind, wie der Name schon sagt, an Dateifunktionen wie z.B. Uploads gebunden.

pim.file.before.upload

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.before.upload', function(\Areanet\PIM\Classes\Event $event){ });

pim.file.after.upload

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
fileObject Areanet\PIM\Entity\File

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.after.upload', function(\Areanet\PIM\Classes\Event $event){ });

pim.file.before.get

Wird vor

Parameter Typ
request \Symfony\Component\HttpFoundation\Request
user Areanet\PIM\Entity\User
app Silex\Application
fileObject Areanet\PIM\Entity\File

Beispiel

1
2
<?php
$dispatcher->addListener('pim.entity.after.upload', function(\Areanet\PIM\Classes\Event $event){ });

Schema-Events

Wird aufgerufen, nachdem eine Klassen-Annotation verarbeitet wurde. Kann genutzt werden, um benutzerdefinierte Annotationen in das Schema aufzunehmen.

pim.schema.after.classAnnotation

Wird nach jeder Verarbeitung einer Klassen-Annotation geworfen.

Parameter Typ
classAnnotation Doctrine\Common\Annotations\Annotation
settings Bisherige Schema-Eigenschaften der Entität als Array, wird wieder zurückgeschrieben (muss dafür im Eventhandler mit $event->setProperty('settings', $settings) gesetzt werden)
Beispiel
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
$dispatcher->addListener('pim.schema.after.classAnnotation', function(\Areanet\PIM\Classes\Event $event){
    $settings          = $event->getParam('settings');
    $classAnnotation   = $event->getParam('classAnnotation');

    if ($classAnnotation instanceof \Custom\Classes\Annotations\Test) {
        $settings['test'] = true;
        $event->setParam('settings', $settings);
    }

});

pim.schema.after.propertyAnnotation

Wird aufgerufen, nachdem eine Property-Annotation verarbeitet wurde. Kann genutzt werden, um benutzerdefinierte Annotationen in das Schema aufzunehmen.

Parameter Typ
propertyAnnotation Doctrine\Common\Annotations\Annotation
properties Bisherige benutzerdefinierte Schema-Eigenschaften zur Property als Array, wird wieder zurückgeschrieben (muss dafür im Eventhandler mit $event->setProperty('properties', $properties) gesetzt werden)
Beispiel
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
$dispatcher->addListener('pim.schema.after.propertyAnnotation', function(\Areanet\PIM\Classes\Event $event){
    $properties         = $event->getParam('properties');
    $propertyAnnotation = $event->getParam('propertyAnnotation');

    if ($propertyAnnotation instanceof \Custom\Classes\Annotations\Map) {
        $properties['googleMap'] = true;
        $event->setParam('properties', $properties);
    }

});