eventDispatcher = $dispatcher; $this->storage = $storage; $this->voter = $voter; } /** * @return array */ public static function getSubscribedEvents(): array { return [ PrepareUserEvent::PREPARE => ['loadUserPreferences', 200] ]; } /** * @param User $user * @return UserPreference[] */ public function getDefaultPreferences(User $user) { $enableHourlyRate = false; if ($this->voter->isGranted('hourly-rate', $user)) { $enableHourlyRate = true; } return [ (new UserPreference()) ->setName(UserPreference::HOURLY_RATE) ->setValue(0) ->setType(MoneyType::class) ->setEnabled($enableHourlyRate) ->addConstraint(new Range(['min' => 0])), (new UserPreference()) ->setName(UserPreference::TIMEZONE) ->setValue(date_default_timezone_get()) ->setType(TimezoneType::class), (new UserPreference()) ->setName(UserPreference::LOCALE) ->setValue(User::DEFAULT_LANGUAGE) ->setType(LanguageType::class), (new UserPreference()) ->setName(UserPreference::SKIN) ->setType(SkinType::class), (new UserPreference()) ->setName('theme.collapsed_sidebar') ->setValue(false) ->setType(CheckboxType::class), (new UserPreference()) ->setName('calendar.initial_view') ->setValue(CalendarViewType::DEFAULT_VIEW) ->setType(CalendarViewType::class), (new UserPreference()) ->setName('login.initial_view') ->setValue(InitialViewType::DEFAULT_VIEW) ->setType(InitialViewType::class), (new UserPreference()) ->setName('timesheet.daily_stats') ->setValue(false) ->setType(CheckboxType::class), ]; } /** * @param PrepareUserEvent $event */ public function loadUserPreferences(PrepareUserEvent $event) { if (!$this->canHandleEvent($event)) { return; } $user = $event->getUser(); $prefs = []; foreach ($user->getPreferences() as $preference) { $prefs[$preference->getName()] = $preference; } $event = new UserPreferenceEvent($user, $this->getDefaultPreferences($user)); $this->eventDispatcher->dispatch(UserPreferenceEvent::CONFIGURE, $event); foreach ($event->getPreferences() as $preference) { /* @var UserPreference[] $prefs */ if (isset($prefs[$preference->getName()])) { /* @var UserPreference $pref */ $prefs[$preference->getName()] ->setType($preference->getType()) ->setConstraints($preference->getConstraints()) ->setEnabled($preference->isEnabled()) ; } else { $prefs[$preference->getName()] = $preference; } } $user->setPreferences(array_values($prefs)); } /** * @param PrepareUserEvent $event * @return bool */ protected function canHandleEvent(PrepareUserEvent $event): bool { if (null === ($user = $event->getUser())) { return false; } return ($user instanceof User); } }