@@ -379,7 +379,7 @@ class User implements UserInterface, AdvancedUserInterface
|
||||
*/
|
||||
public function isAccountNonExpired()
|
||||
{
|
||||
return $this->isEnabled();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -387,7 +387,7 @@ class User implements UserInterface, AdvancedUserInterface
|
||||
*/
|
||||
public function isAccountNonLocked()
|
||||
{
|
||||
return $this->isEnabled();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -395,7 +395,7 @@ class User implements UserInterface, AdvancedUserInterface
|
||||
*/
|
||||
public function isCredentialsNonExpired()
|
||||
{
|
||||
return $this->isEnabled();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
namespace App\Entity;
|
||||
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
|
||||
use Symfony\Component\Validator\Constraint;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
@@ -59,7 +60,7 @@ class UserPreference
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $type = TextType::class;
|
||||
protected $type;
|
||||
|
||||
/**
|
||||
* @var Constraint[]
|
||||
@@ -121,18 +122,25 @@ class UserPreference
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @return string|int|bool
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
switch ($this->type) {
|
||||
case CheckboxType::class:
|
||||
return (bool) $this->value;
|
||||
case IntegerType::class:
|
||||
return (int) $this->value;
|
||||
}
|
||||
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
* @param string|int|bool $value
|
||||
* @return UserPreference
|
||||
*/
|
||||
public function setValue(string $value): UserPreference
|
||||
public function setValue($value): UserPreference
|
||||
{
|
||||
$this->value = $value;
|
||||
return $this;
|
||||
|
||||
111
src/EventSubscriber/ThemeOptionsSubscriber.php
Normal file
111
src/EventSubscriber/ThemeOptionsSubscriber.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\EventSubscriber;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Entity\UserPreference;
|
||||
use Avanzu\AdminThemeBundle\Helper\ContextHelper;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\HttpKernel\Event\KernelEvent;
|
||||
use Symfony\Component\HttpKernel\KernelEvents;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||
|
||||
/**
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class ThemeOptionsSubscriber implements EventSubscriberInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var TokenStorageInterface
|
||||
*/
|
||||
protected $storage;
|
||||
|
||||
/**
|
||||
* @var ContextHelper
|
||||
*/
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* ThemeOptionsSubscriber constructor.
|
||||
* @param TokenStorageInterface $storage
|
||||
* @param ContextHelper $helper
|
||||
*/
|
||||
public function __construct(TokenStorageInterface $storage, ContextHelper $helper)
|
||||
{
|
||||
$this->storage = $storage;
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getSubscribedEvents(): array
|
||||
{
|
||||
return [
|
||||
KernelEvents::CONTROLLER => ['setThemeOptions', 100]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param KernelEvent $event
|
||||
*/
|
||||
public function setThemeOptions(KernelEvent $event)
|
||||
{
|
||||
if (!$this->canHandleEvent($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->storage->getToken()->getUser();
|
||||
|
||||
$skin = '';
|
||||
foreach ($user->getPreferences() as $ref) {
|
||||
$name = $ref->getName();
|
||||
if ($name === UserPreference::SKIN) {
|
||||
$skin = 'skin-' . $ref->getValue();
|
||||
}
|
||||
|
||||
if (strpos($name, 'theme.') !== false) {
|
||||
$this->helper->setOption(str_replace('theme.', '', $name), $ref->getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($skin)) {
|
||||
$skin = 'skin-green';
|
||||
}
|
||||
|
||||
$this->helper->setOption('skin', $skin);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param KernelEvent $event
|
||||
* @return bool
|
||||
*/
|
||||
protected function canHandleEvent(KernelEvent $event): bool
|
||||
{
|
||||
// Ignore sub-requests
|
||||
if (!$event->isMasterRequest()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// ignore events like the toolbar where we do not have a token
|
||||
if ($this->storage->getToken() === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->storage->getToken()->getUser();
|
||||
|
||||
return ($user instanceof User);
|
||||
}
|
||||
}
|
||||
@@ -14,8 +14,10 @@ namespace App\EventSubscriber;
|
||||
use App\Entity\User;
|
||||
use App\Entity\UserPreference;
|
||||
use App\Event\UserPreferenceEvent;
|
||||
use App\Form\Type\SkinType;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
|
||||
use Symfony\Component\HttpKernel\Event\KernelEvent;
|
||||
use Symfony\Component\HttpKernel\KernelEvents;
|
||||
@@ -39,7 +41,7 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
|
||||
protected $storage;
|
||||
|
||||
/**
|
||||
* PreferenceService constructor.
|
||||
* UserPreferenceSubscriber constructor.
|
||||
* @param EventDispatcherInterface $dispatcher
|
||||
* @param TokenStorageInterface $storage
|
||||
*/
|
||||
@@ -55,7 +57,7 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
|
||||
public static function getSubscribedEvents(): array
|
||||
{
|
||||
return [
|
||||
KernelEvents::CONTROLLER => ['onKernelEvent', -1],
|
||||
KernelEvents::CONTROLLER => ['loadUserPreferences', 200]
|
||||
];
|
||||
}
|
||||
|
||||
@@ -70,11 +72,33 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
|
||||
->setValue(0)
|
||||
->setType(IntegerType::class)
|
||||
->addConstraint(new Range(['min' => 0])),
|
||||
/*
|
||||
|
||||
(new UserPreference())
|
||||
->setName(UserPreference::SKIN)
|
||||
->setValue('blue')
|
||||
->setValue('green')
|
||||
->setType(SkinType::class),
|
||||
|
||||
(new UserPreference())
|
||||
->setName('theme.fixed_layout')
|
||||
->setValue(true)
|
||||
->setType(CheckboxType::class),
|
||||
|
||||
(new UserPreference())
|
||||
->setName('theme.boxed_layout')
|
||||
->setValue(false)
|
||||
->setType(CheckboxType::class),
|
||||
|
||||
(new UserPreference())
|
||||
->setName('theme.collapsed_sidebar')
|
||||
->setValue(false)
|
||||
->setType(CheckboxType::class),
|
||||
|
||||
(new UserPreference())
|
||||
->setName('theme.mini_sidebar')
|
||||
->setValue(true)
|
||||
->setType(CheckboxType::class),
|
||||
|
||||
/*
|
||||
(new UserPreference())
|
||||
->setName('language')
|
||||
->setValue('de')
|
||||
@@ -84,11 +108,17 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
* @return User
|
||||
* @param KernelEvent $event
|
||||
*/
|
||||
public function setupUserPreferences(User $user)
|
||||
public function loadUserPreferences(KernelEvent $event)
|
||||
{
|
||||
if (!$this->canHandleEvent($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->storage->getToken()->getUser();
|
||||
|
||||
$prefs = [];
|
||||
foreach ($user->getPreferences() as $preference) {
|
||||
$prefs[$preference->getName()] = $preference;
|
||||
@@ -110,32 +140,27 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
|
||||
}
|
||||
|
||||
$user->setPreferences(array_values($prefs));
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param KernelEvent $event
|
||||
* @return bool
|
||||
*/
|
||||
public function onKernelEvent(KernelEvent $event): void
|
||||
protected function canHandleEvent(KernelEvent $event): bool
|
||||
{
|
||||
// Ignore sub-requests
|
||||
if (!$event->isMasterRequest()) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
// ignore events like the toolbar where we do not have a token
|
||||
if ($this->storage->getToken() === null) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->storage->getToken()->getUser();
|
||||
|
||||
if (!($user instanceof User)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->setupUserPreferences($user);
|
||||
return ($user instanceof User);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace App\Form\Type;
|
||||
|
||||
use App\Entity\UserPreference;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
@@ -45,9 +46,15 @@ class UserPreferenceType extends AbstractType
|
||||
return;
|
||||
}
|
||||
|
||||
$required = true;
|
||||
if ($preference->getType() == CheckboxType::class) {
|
||||
$required = false;
|
||||
}
|
||||
|
||||
$event->getForm()->add('value', $preference->getType(), [
|
||||
'label' => 'label.' . $preference->getName(),
|
||||
'constraints' => $preference->getConstraints()
|
||||
'constraints' => $preference->getConstraints(),
|
||||
'required' => $required,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,17 +40,6 @@ class UserRepository extends AbstractRepository
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a user by his username.
|
||||
*
|
||||
* @param $username
|
||||
* @return null|User
|
||||
*/
|
||||
public function findByUsername($username)
|
||||
{
|
||||
return $this->findOneBy(['username' => $username]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param UserQuery $query
|
||||
* @return \Pagerfanta\Pagerfanta
|
||||
|
||||
Reference in New Issue
Block a user