<?php
namespace App\Admin;
use App\Application\Sonata\UserBundle\Entity\User;
use App\Entity\SonataUserUser;
use App\Util\ClientUtil;
use App\Util\PropertyUtil;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
use Sonata\Form\Type\DatePickerType;
use Sonata\Form\Validator\ErrorElement;
use Sonata\UserBundle\Form\Type\SecurityRolesType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\LocaleType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TimezoneType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\Validator\Constraints\Regex;
class UserAdmin extends \Sonata\UserBundle\Admin\Model\UserAdmin
{
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->addIdentifier('username')
->add('email')
->add('groups')
->add('enabled', null, ['editable' => true])
->add('createdAt');
if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
$listMapper
->add('impersonating', 'string', ['template' => '@SonataUser/Admin/Field/impersonating.html.twig'])
;
}
$listMapper->add('_action', null, [
'actions' => [
'addresses' => ['template' => 'admin/user/address.html.twig'],
'cancelations' => ['template' => 'admin/user/cancel.html.twig'],
'delete' => [],
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
/** @var User $user */
$user = $this->getSubject();
// define group zoning
$formMapper
->tab('User')
->with('Profile', ['class' => 'col-md-6'])->end()
->with('General', ['class' => 'col-md-6'])->end()
->with('Social', ['class' => 'col-md-6 d-none'])->end()
->end()
->tab('Security')
->with('Status', ['class' => 'col-md-4'])->end()
->with('Groups', ['class' => 'col-md-4'])->end()
->with('Keys', ['class' => 'col-md-4'])->end()
->with('Roles', ['class' => 'col-md-12 d-none'])->end()
->end();
$now = new \DateTime();
$genderOptions = [
'choices' => \call_user_func([$this->getUserManager()->getClass(), 'getGenderList']),
'required' => false,
'translation_domain' => $this->getTranslationDomain(),
];
// NEXT_MAJOR: Remove this when dropping support for SF 2.8
if (method_exists(FormTypeInterface::class, 'setDefaultOptions')) {
$genderOptions['choices_as_values'] = true;
}
$formMapper
->tab('User')
->with('General')
->add('username')
->add('accountType')
->add('accountState')
->add('accountRole')
->add('email')
->add('plainPassword', TextType::class, [
'required' => (!$this->getSubject() || null === $this->getSubject()->getId()),
])
->end()
->with('Profile')
->add('firstname', null, ['required' => true])
->add('lastname', null, ['required' => true])
->add('website', UrlType::class, ['required' => false])
// ->add('biography', TextType::class, ['required' => false])
->add('locale', LocaleType::class, ['required' => false, 'data' => (!empty($user->getId()) ? $user->getLocale() : 'cs')])
->add('timezone', TimezoneType::class, ['required' => false, 'data' => (!empty($user->getId()) ? $user->getTimezone() : 'Europe/Prague')])
->add('phone', null, ['required' => false, 'constraints' => [
new Regex('/([+]?\d{1,3}[. \s]?)?(\d{9}?)/')
]])
->add('dateOfBirth', DatePickerType::class, [
'years' => range(1900, $now->format('Y')),
'dp_min_date' => '1-1-1900',
'dp_max_date' => $now->format('c'),
'required' => false,
])
->add('gender', ChoiceType::class, $genderOptions)
->end()
->with('Social')
->add('facebookUid', null, ['required' => false])
->add('facebookName', null, ['required' => false])
->add('twitterUid', null, ['required' => false])
->add('twitterName', null, ['required' => false])
->add('gplusUid', null, ['required' => false])
->add('gplusName', null, ['required' => false])
->end()
->end()
->tab('Security')
->with('Status')
->add('enabled', null, ['required' => false])
->end()
->with('Groups')
->add('groups', ModelType::class, [
'required' => false,
'expanded' => true,
'multiple' => true,
])
->end()
->with('Roles')
->add('realRoles', SecurityRolesType::class, [
'label' => 'Role',
'expanded' => true,
'multiple' => true,
'required' => false,
])
->end()
->with('Keys')
->add('token', null, ['required' => false])
->add('twoStepVerificationCode', null, ['required' => false])
->end()
->end();
}
public function getFormBuilder()
{
$this->formOptions['data_class'] = $this->getClass();
$formBuilder = $this->getFormContractor()->getFormBuilder(
$this->getUniqid(),
$this->formOptions
);
$this->defineFormBuilder($formBuilder);
return $formBuilder;
}
/**
* @param ErrorElement $errorElement
* @param $object
*/
public function validate(ErrorElement $errorElement, $object)
{
if (!empty($object->getPhone()) && empty(preg_match('/^[0-9\-\(\)\/\+\s]*$/', $object->getPhone()))) {
$error = 'Telefon je v nesprávném tvaru';
$errorElement->with('phone')->addViolation($error)->end();
}
}
/**
* @param SonataUserUser $object
*/
public function postUpdate($object)
{
if ($this->hasRequest() && null !== $object->getLocale()) {
$this->getRequest()->getSession()->set('_locale', $object->getLocale());
}
}
}