<?php
namespace 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 ExerciseEventListener implements EventSubscriberInterface
{
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
DataObjectEvents::PRE_ADD => 'onPreAdd',
DataObjectEvents::PRE_UPDATE => 'onPreUpdate',
];
}
public function onPreAdd(DataObjectEvent $event)
{
$exercise = $event->getObject();
if (!$exercise instanceof DataObject\Exercise) {
return;
}
$this->validate($exercise);
}
public function onPreUpdate(DataObjectEvent $event)
{
$exercise = $event->getObject();
if (!$exercise instanceof DataObject\Exercise) {
return;
}
$this->validate($exercise);
}
private function validateDuplication(DataObject\Exercise $exercise)
{
$existingExerciseByExerciseName = DataObject\Exercise::getByName($exercise->getName(), ['unpublished' => true, 'limit' => 1]);
$messageForName = 'Duplicate entry for Exercise Name. Please change its value and then try again.';
if ($exercise->getId()) {
if ($existingExerciseByExerciseName instanceof DataObject\Exercise && $exercise->getId() != $existingExerciseByExerciseName->getId()) {
throw new ValidationException($messageForName);
}
} else {
if ($existingExerciseByExerciseName instanceof DataObject\Exercise) {
throw new ValidationException($messageForName);
}
}
}
private function validate(DataObject\Exercise $exercise)
{
$this->validateDuplication($exercise);
if (!$exercise->getPublished()) {
return;
}
$primaryMuscleGroup = $exercise->getPrimaryMuscleGroup();
if ($primaryMuscleGroup instanceof DataObject\MuscleGroup) {
if (!$primaryMuscleGroup->getPublished()) {
throw new ValidationException("The selected 'Primary Muscle Group' is not published.");
}
}
$secondaryMuscleGroup = $exercise->getSecondaryMuscleGroup();
if ($secondaryMuscleGroup instanceof DataObject\MuscleGroup) {
if (!$secondaryMuscleGroup->getPublished()) {
throw new ValidationException("The selected 'Secondary Muscle Group' is not published.");
}
}
}
}