<?phpnamespace App\EventListener\DataObject;use Pimcore\Event\DataObjectEvents;use Pimcore\Event\Model\DataObjectEvent;use Pimcore\Model\DataObject;use Pimcore\Model\Element\ValidationException;use Symfony\Component\EventDispatcher\EventSubscriberInterface;class WorkoutEventListener implements EventSubscriberInterface{ /** * @inheritDoc */ public static function getSubscribedEvents() { return [ DataObjectEvents::PRE_ADD => 'onPreAdd', DataObjectEvents::PRE_UPDATE => 'onPreUpdate', ]; } public function onPreAdd(DataObjectEvent $event) { $workout = $event->getObject(); if (!$workout instanceof DataObject\Workout) { return; } $workout->setName($this->filterName($workout)); if (!isset($_REQUEST['key'])) { //do not validate if user creates object from Pimcore UI. $this->validate($workout); } } public function onPreUpdate(DataObjectEvent $event) { $workout = $event->getObject(); if (!$workout instanceof DataObject\Workout) { return; } $workout->setName($this->filterName($workout)); $this->validate($workout); } private function validate(DataObject\Workout $workout) { if (!in_array($workout->getMonth(), range(1, 100))) { throw new ValidationException("Invalid month. It should be 1-100. Given is '{$workout->getMonth()}'."); } $this->validateDuplication($workout); if (!$workout->getPublished()) { return; } if (empty($exerciseBlock = $workout->getExerciseBlock())) { throw new ValidationException('Please select some exercises.'); } foreach ($exerciseBlock as $exerciseBlockItem) { $exercise = $exerciseBlockItem['exercise']->getData(); if (!$exercise instanceof DataObject\Exercise) { throw new ValidationException('All items should have exercise. It seems you forgot to select exercise for some items.'); } if (!$exercise->getPublished()) { throw new ValidationException("The selected exercise '{$exercise->getName()}' should be published. All the selected exercises should be published."); } } } private function validateDuplication(DataObject\Workout $workout) { $existingWorkoutByName = DataObject\Workout::getByName($workout->getName(), ['unpublished' => true, 'limit' => 1]); if ($workout->getId()) { if ($existingWorkoutByName instanceof DataObject\Workout && $workout->getId() != $existingWorkoutByName->getId()) { throw new ValidationException("Update failed. Duplicate workout name = '{$existingWorkoutByName->getName()}'"); } } else { if ($existingWorkoutByName instanceof DataObject\Workout) { throw new ValidationException("Create failed. Duplicate workout name = '{$existingWorkoutByName->getName()}'"); } } } private function filterName(DataObject\Workout $workout) { $name = $workout->getName(); if ($name && strpos(strtolower($name), 'rest') === false) { $parts = explode('-', $name); $type = isset($parts[2]) ? $parts[2] : 'home'; $newName = $parts[0] . '-' . $workout->getMonth().'-'.$type; return strtolower($newName); } return $name; }}