vendor/dachcom-digital/members/src/MembersBundle/EventListener/MembersCompletenessListener.php line 89

Open in your IDE?
  1. <?php
  2. namespace MembersBundle\EventListener;
  3. use MembersBundle\Adapter\Group\GroupInterface;
  4. use MembersBundle\Adapter\User\UserInterface;
  5. use MembersBundle\Configuration\Configuration;
  6. use MembersBundle\Manager\ClassManagerInterface;
  7. use Pimcore\Event\DataObjectEvents;
  8. use Pimcore\Event\Model\DataObjectEvent;
  9. use Pimcore\Model\DataObject\Concrete;
  10. use Pimcore\Model\Element\ValidationException;
  11. use Pimcore\Model\User;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Pimcore\Bundle\AdminBundle\Security\User\TokenStorageUserResolver;
  14. class MembersCompletenessListener implements EventSubscriberInterface
  15. {
  16.     protected int $memberStorageId;
  17.     protected ClassManagerInterface $classManager;
  18.     protected Configuration $configuration;
  19.     protected TokenStorageUserResolver $userResolver;
  20.     public function __construct(
  21.         ClassManagerInterface $classManager,
  22.         Configuration $configuration,
  23.         TokenStorageUserResolver $tokenStorageUserResolver
  24.     ) {
  25.         $this->classManager $classManager;
  26.         $this->configuration $configuration;
  27.         $this->userResolver $tokenStorageUserResolver;
  28.     }
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             DataObjectEvents::PRE_UPDATE => [
  33.                 ['checkUniqueness'20],
  34.                 ['checkProperties'10]
  35.             ]
  36.         ];
  37.     }
  38.     /**
  39.      * @throws \Exception
  40.      */
  41.     public function checkUniqueness(DataObjectEvent $e): void
  42.     {
  43.         $object $e->getObject();
  44.         if (!$this->userResolver->getUser() instanceof User) {
  45.             return;
  46.         }
  47.         if ($object instanceof UserInterface) {
  48.             $memberListing $this->classManager->getUserListing();
  49.             $memberListing->setUnpublished(true);
  50.             $memberListing->setCondition('(email = ? OR userName = ?) AND oo_id != ?', [
  51.                 $object->getEmail(),
  52.                 $object->getUsername(),
  53.                 (int) $object->getId()
  54.             ]);
  55.             $elements $memberListing->getObjects();
  56.             if (count($elements) > 0) {
  57.                 /** @var UserInterface $foundObject */
  58.                 $foundObject $elements[0];
  59.                 $artifact 'email address';
  60.                 if ($foundObject->getUsername() === $object->getUsername()) {
  61.                     $artifact 'username';
  62.                 }
  63.                 throw new ValidationException(sprintf('The %s is already used.'$artifact));
  64.             }
  65.         } elseif ($object instanceof GroupInterface) {
  66.             $groupListing $this->classManager->getGroupListing();
  67.             $groupListing->setCondition('name = ? AND oo_id != ?', [$object->getName(), (int) $object->getId()]);
  68.             $groupListing->setUnpublished(true);
  69.             if (count($groupListing->getObjects()) > 0) {
  70.                 throw new ValidationException('The group name is already used.');
  71.             }
  72.         }
  73.     }
  74.     /**
  75.      * @throws \Exception
  76.      */
  77.     public function checkProperties(DataObjectEvent $e): void
  78.     {
  79.         $messageBlock = [];
  80.         /** @var Concrete $object */
  81.         $object $e->getObject();
  82.         if (!$this->userResolver->getUser() instanceof User) {
  83.             return;
  84.         }
  85.         if (!$object instanceof UserInterface) {
  86.             return;
  87.         }
  88.         if ($object->isPublished() === false) {
  89.             return;
  90.         }
  91.         $emailTemplates $this->configuration->getConfig('emails');
  92.         //check for locale
  93.         $needLocale false;
  94.         foreach ($emailTemplates['default'] as $template) {
  95.             if (str_contains($template'{_locale}')) {
  96.                 $needLocale true;
  97.                 break;
  98.             }
  99.         }
  100.         //check for site request
  101.         $needSite false;
  102.         if (isset($emailTemplates['sites']) && count($emailTemplates['sites']) > 0) {
  103.             $needSite true;
  104.         }
  105.         $userLocale $object->getProperty('_user_locale');
  106.         $userSite $object->getProperty('_site_domain');
  107.         if (($needLocale && empty($userLocale)) || ($needSite && empty($userSite))) {
  108.             $messageBlock[] = '<h3>This member object needs some additional properties!</h3>';
  109.             $messageBlock[] = 'Since you have enabled localized mail templates you need to add some additional properties (If you want to disable this message, remove the localized parameters from your members mail configuration).';
  110.             $messageBlock[] = '<ul>';
  111.             if ($needLocale && empty($userLocale)) {
  112.                 $messageBlock[] = '<li>Define a <code>_user_locale</code> (text) property with a valid locale (like "de" or "en_US") before publishing the user object.</li>';
  113.             }
  114.             if ($needSite && empty($userSite)) {
  115.                 $messageBlock[] = '<li>Define a <code>_site_domain</code> (text) property with a valid main domain (like "your-page.com") before publishing the user object.</li>';
  116.             }
  117.             $messageBlock[] = '</ul>';
  118.             throw new ValidationException(implode(''$messageBlock));
  119.         }
  120.     }
  121. }