<?phpnamespace App\EventListener;use Pimcore\Event\DataObjectEvents;use Pimcore\Event\Model\DataObjectEvent;use Pimcore\Model\DataObject\AbstractObject;use Pimcore\Model\Element\ValidationException;use Pimcore\Model\Translation;use Symfony\Component\EventDispatcher\EventSubscriberInterface;/** * Class ValidationListener * * @package App\EventListener */class ValidationListener implements EventSubscriberInterface{ /** * @{inheritDoc} */ public static function getSubscribedEvents() { return [ DataObjectEvents::PRE_UPDATE => 'onObjectPreUpdate' ]; } /** * @param DataObjectEvent $event * @throws ValidationException */ public function onObjectPreUpdate(DataObjectEvent $event) { $object = $event->getObject(); // Nur validieren, wenn Objekt gespeichert und veröffentlicht wird if ( ($event->hasArgument('saveVersionOnly') && $event->getArgument('saveVersionOnly') === true) || $object === null || $object->getType() !== 'object' ) { return; } if ($object->getClassName() == 'kikProduct') { $this->validateProduct($object); } // Validierungsmethode für Objektklasse finden if ($object->getClassName() == 'Fair') { $this->validateFair($object); } elseif ($object->getClassName() == 'OtherClass') { $this->validateOtherClass($object); } return; } /** * @param AbstractObject $object * @throws ValidationException */ public function validateFair(AbstractObject $object) { // Beispiel-Validierung eines Messezeitraumes $availabilityTimeStart = $object->getAvailabilityTimeStart()->getTimestamp(); $availabilityTimeEnd = $object->getAvailabilityTimeEnd()->getTimestamp(); $fairTimeStart = $object->getFairTimeStart()->getTimestamp(); $fairTimeEnd = $object->getFairTimeEnd()->getTimestamp(); if ($availabilityTimeStart > $availabilityTimeEnd) { throw new ValidationException(Admin::getByKeyLocalized('app.exception_fair_begin', true)); } elseif ($fairTimeStart > $fairTimeEnd) { throw new ValidationException(Admin::getByKeyLocalized('app.exception_fair_end', true)); } elseif ($availabilityTimeStart > $fairTimeStart) { throw new ValidationException(Admin::getByKeyLocalized('app.exception_fair_from', true)); } } /** * @param AbstractObject $object * @throws ValidationException */ public function validateProduct(AbstractObject $object) { $materials = $object->getMaterial(); $percentage = 0; foreach ($materials as $material) { $percentage += $material->getPercentage(); } if ($percentage !== 100 && $percentage !== 0) { throw new ValidationException('Die Anteile des Materials ergeben nicht 100%.'); } } /** * @param AbstractObject $object * @throws ValidationException */ public function validateOtherClass(AbstractObject $object) { // benutzerdefinierte Validierung throw new ValidationException(Admin::getByKeyLocalized('app.validation_failed', true)); }}