<?php
namespace AdminBundle\Admin;
use AdminBundle\AdminException;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\User;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class ClientAdmin extends BaseAdmin
{
protected $baseRouteName = 'client';
protected $baseRoutePattern = 'core/client';
public function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->remove('delete');
$collection->remove('view');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper->add('id');
$datagridMapper->add('username');
$datagridMapper->add('email');
$datagridMapper->add('name');
$datagridMapper->add('last_name');
}
/**
* @param FormMapper $formMapper
* @throws AdminException
*/
protected function configureFormFields(FormMapper $formMapper): void
{
$request = $this->getRequest();
$requestPathInfo = $request->getPathInfo();
/** @var User $user */
$user = $this->getUser();
$roles = $this->parameterBag->get('security.role_hierarchy.roles');
$roles = array_keys($roles);
$roles = array_combine($roles, $roles);
if (!$user->hasRole('ROLE_SUPER_ADMIN')) {
throw new AdminException('Ви не маєте доступу');
}
$formMapper->with('Клієнт', ['class' => 'col-lg-6']);
$formMapper
->add('name',null, ['label' => 'Имя', 'required' => true])
->add('last_name',null, ['label' => 'Фамиия', 'required' => true])
->add('username', null, ['label' => 'Логин', 'required' => true])
->add('email',null, ['label' => 'E-mail', 'required' => true])
->add('roles', ChoiceType::class, [
'label' => 'Роль',
'required' => true,
'multiple' => true,
'choices' => $roles
]);
if ($requestPathInfo === '/core/client/create') {
$formMapper->add('password', null, ['label' => 'Пароль', 'required' => true]);
}
$formMapper->end();
}
/**
* @param string $context
* @return ProxyQueryInterface
*/
public function configureQuery($context = 'list'): ProxyQueryInterface
{
$query = parent::configureQuery($context);
$alias = $query->getRootAliases()[0];
$query->andWhere($alias.'.roles like \'%ROLE_LOYALTY_USER%\' OR '
.$alias.'.roles like \'%ROLE_INSURANCE_USER%\''
);
$User = $this->security->getUser();
if ($User->hasRole('ROLE_SUPER_ADMIN')) {
return $query;
}
$query->andWhere($alias.'.id = :id')->setParameter('id', $User->getId());
return $query;
}
protected function configureListFields(ListMapper $listMapper): void
{
$this->checkByRole(['ROLE_SUPER_ADMIN', 'ROLE_CONTENT_MANAGER','ROLE_DC_MANAGER']);
$dcList = [];
$dc = $this->em->getRepository(Dealer::class)->findAll();
foreach ($dc as $item) {
$dcList[$item->getId()] = $item->getName();
}
$subDcList = [];
$subDc = $this->em->getRepository(\ImporterBundle\Entity\Dealer::class)->findAll();
foreach ($subDc as $item) {
$subDcList[$item->getId()] = $item->getName();
}
$listMapper->addIdentifier('id')
->add('fullName',null,['label' => 'Имя'])
->add('username',null,['label' => 'Login'])
->add('email')
//->add('roles')
->add('dealer', ChoiceType::class, [
'label' => 'ДЦ',
'class' => Dealer::class,
'choices' => $dcList,
'editable' => true
])
->add('sub_dealer', ChoiceType::class, [
'label' => 'Суб ДЦ',
'class' => \ImporterBundle\Entity\Dealer::class,
'choices' => $subDcList,
'editable' => true,
'admin_code' => 'admin.sub.contact',
])
->add('enabled', null, ['editable' => true])
->add('_action', 'actions', [
'label' => 'Действия',
'actions' => [
'edit' => [],
]
])
;
}
/**
* Створити нового користувача
*
* @param User $object
* @return void
* @throws AdminException
*/
public function prePersist($object): void
{
/**
* @var User $user
*/
$user = $this->getUser();
if (!$user->hasRole('ROLE_SUPER_ADMIN')) {
throw new AdminException("У вас нету доступа");
}
if (empty($object->getName())) {
throw new AdminException("Не вказано поле Имя");
}
if (empty($object->getLastName())) {
throw new AdminException("Не вказано поле Фамиия");
}
if (empty($object->getUsername())) {
throw new AdminException("Не вказано поле Логин");
}
if (empty($object->getEmail())) {
throw new AdminException("Не вказано поле E-mail");
}
if (empty($object->getPassword())) {
throw new AdminException("Не вказано поле Пароль");
}
$model = new UserAdminModel($this->getEntityManager());
if (!empty($model->selectByLogin($object->getUsername()))) {
throw new AdminException("Логин вже використовується");
}
if (!empty($model->selectByEmail($object->getEmail()))) {
throw new AdminException("E-mail вже використовується");
}
$password = $object->getPassword();
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 13]);
$object->setEnabled(true);
$object->setPassword($password);
parent::prePersist($object);
}
}