<?php
/**
* Pimcore
*
* This source file is available under following license:
* - Pimcore Commercial License (PCL)
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license PCL
*/
namespace Pimcore\Bundle\PortalEngineBundle\EventSubscriber;
use Pimcore\Bundle\AdminBundle\Event\AdminEvents;
use Pimcore\Bundle\AdminBundle\Event\IndexActionSettingsEvent;
use Pimcore\Bundle\PortalEngineBundle\Service\Collection\AdminCollectionService;
use Pimcore\Bundle\PortalEngineBundle\Service\SearchIndex\IndexUpdateService;
use Pimcore\Bundle\PortalEngineBundle\Service\SearchIndex\LanguageService;
use Pimcore\Localization\LocaleServiceInterface;
use Pimcore\Security\User\TokenStorageUserResolver;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class AdminSettingsSubscriber implements EventSubscriberInterface
{
/**
* @var array
*/
protected $possiblePortalDomains = [];
protected IndexUpdateService $indexUpdateService;
protected LanguageService $languageService;
protected LocaleServiceInterface $localeService;
protected AdminCollectionService $adminCollectionService;
protected TokenStorageUserResolver $userResolver;
public function __construct(
array $possiblePortalDomains,
IndexUpdateService $indexUpdateService,
LanguageService $languageService,
LocaleServiceInterface $localeService,
AdminCollectionService $adminCollectionService,
TokenStorageUserResolver $userResolver
) {
$explodedDomains = [];
foreach ($possiblePortalDomains as $domain) {
$explodedDomains = array_merge($explodedDomains, explode(',', $domain));
}
$this->possiblePortalDomains = $explodedDomains;
$this->indexUpdateService = $indexUpdateService;
$this->languageService = $languageService;
$this->localeService = $localeService;
$this->adminCollectionService = $adminCollectionService;
$this->userResolver = $userResolver;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
//TODO replace with AdminEvents constant when support for Pimcore 10.6 will be finished
'pimcore.system.settings.saveAction' => 'updateSearchIndex',
AdminEvents::INDEX_ACTION_SETTINGS => [['getSettings'], ['checkAdminUserAssignment']]
];
}
public function getSettings(IndexActionSettingsEvent $event)
{
if (!empty($this->possiblePortalDomains)) {
$event->addSetting('portalEngine', ['possiblePortalDomains' => $this->possiblePortalDomains]);
}
}
public function updateSearchIndex(GenericEvent $event)
{
$arguments = $event->getArguments();
$currentLanguages = $arguments['existingValues']['general']['valid_languages'];
$newLanguageValues = explode(',', $arguments['values']['general.validLanguages']);
$newLanguages = [];
foreach ($newLanguageValues as $language) {
if ($this->localeService->isLocale($language)) {
$newLanguages[] = $language;
}
}
if (empty($currentLanguages) && !empty($newLanguages)) {
$this->languageService->setValidLanguages($newLanguages);
$this->indexUpdateService->updateAll();
return;
}
sort($currentLanguages);
sort($newLanguages);
if ($currentLanguages !== $newLanguages) {
$this->languageService->setValidLanguages($newLanguages);
$this->indexUpdateService->updateAll();
}
}
public function checkAdminUserAssignment(IndexActionSettingsEvent $event)
{
$settings = $event->getSettings()['portalEngine'] ?? [];
try {
$this->adminCollectionService->applyPortalUserToSecurityService($this->userResolver->getUserProxy()->getUser());
$settings['canAddNewCollection'] = true;
} catch (\Exception $e) {
if ($this->userResolver->getUser()->isAdmin()) {
$settings['canAddNewCollection'] = false;
}
}
$event->addSetting('portalEngine', $settings);
}
}