src/AdminBundle/Admin/ViDiWorkerAdmin.php line 27

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Admin;
  3. use ApiBundle\Model\UnicommerceModel;
  4. use CoreBundle\Entity\CallbackRequestLog;
  5. use CoreBundle\Entity\ViDiDepartment;
  6. use CoreBundle\Entity\ViDiWorker;
  7. use CoreBundle\Model\DealerModel;
  8. use CoreBundle\Model\ViDiWorkerModel;
  9. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  10. use Sonata\AdminBundle\Datagrid\ListMapper;
  11. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  12. use Sonata\AdminBundle\Form\FormMapper;
  13. use Sonata\AdminBundle\Form\Type\ModelType;
  14. use Sonata\AdminBundle\Route\RouteCollectionInterface;
  15. use Sonata\MediaBundle\Form\Type\MediaType;
  16. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  17. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  18. use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mime\Address;
  22. use Symfony\Component\Mime\Email;
  23. use Twig\Environment;
  24. class ViDiWorkerAdmin extends BaseAdmin
  25. {
  26.     protected MailerInterface $mailer;
  27.     protected Environment $twig;
  28.     public function setExtraServices(MailerInterface $mailerEnvironment $twig)
  29.     {
  30.         $this->mailer $mailer;
  31.         $this->twig $twig;
  32.     }
  33.     /**
  34.      * @param $object
  35.      */
  36.     public function prePersist($object): void
  37.     {
  38.         $dealer $this->security->getUser()->getDealer();
  39.         $object->setDealer($dealer);
  40.     }
  41.     public function preRemove($object): void
  42.     {
  43.         $this->em->createQueryBuilder()
  44.             ->update(CallbackRequestLog::class, 'c')
  45.             ->set('c.worker'':null')
  46.             ->where('c.worker = :workerId')
  47.             ->setParameter('workerId'$object->getId())
  48.             ->setParameter('null'null)
  49.             ->getQuery()
  50.             ->execute();
  51.     }
  52.     /**
  53.      * @param ViDiWorker $object
  54.      * @throws Twig_Error_Loader
  55.      * @throws Twig_Error_Runtime
  56.      * @throws Twig_Error_Syntax
  57.      */
  58.     public function sendToken($object)
  59.     {
  60.         $html $this->twig->render('@Admin/Mail/tm_bot_token.html.twig', ['token' => $object->getToken()]);
  61.         $message = (new Email())
  62.             ->subject('Доступ в TelegramBot')
  63.             ->from(new Address('info@vidi.ua''TelegramBot'))
  64.             ->setBody($html)
  65.             ->to($object->getEmail());
  66.         $this->mailer->send($message);
  67.     }
  68.     /**
  69.      * @param RouteCollectionInterface $collection
  70.      */
  71.     protected function configureRoutes(RouteCollectionInterface $collection): void
  72.     {
  73.         $collection->remove('view');
  74.         $collection->add('resendToken'$this->getRouterIdParameter() . '/resend_token');
  75.     }
  76.     /**
  77.      * @param DatagridMapper $datagridMapper
  78.      */
  79.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  80.     {
  81.         $User $this->getUser();
  82.         if (!$dealer $User->getDealer()) {
  83.             throw new AccessDeniedException('User without dealer');
  84.         }
  85.         $queryBuilder $this->getModelManager()
  86.             ->getEntityManager(ViDiDepartment::class)
  87.             ->createQueryBuilder('d')
  88.             ->select('d')
  89.             ->from(ViDiDepartment::class, 'd')
  90.             ->where('d.dealer = :dealer')
  91.             ->setParameter('dealer'$dealer);
  92.         $deps = [];
  93.         /** @var ViDiDepartment $item */
  94.         foreach ($queryBuilder->getQuery()->getResult() as $item) {
  95.             $deps[$item->getId()] = $item->getTitleRu();
  96.         }
  97.         $datagridMapper->add('id')
  98.             ->add('department''doctrine_orm_choice', ['label' => 'Отдел'], ChoiceType::class, ['choices' => array_flip($deps)])
  99.             ->add('dealer'null, ['label' => 'Дилерский центр']);
  100.     }
  101.     /**
  102.      * @param string $context
  103.      * @return ProxyQueryInterface
  104.      */
  105.     public function configureQuery($context 'list'): ProxyQueryInterface
  106.     {
  107.         $user $this->security->getUser();
  108.         $dealer $user->getDealer();
  109.         $query parent::configureQuery($context);
  110.         if ($user->hasRole('ROLE_SUPER_ADMIN')) {
  111.             return $query;
  112.         }
  113.         $query->andWhere(
  114.             $query->expr()->eq($query->getRootAliases()[0] . '.dealer'':dealer')
  115.         );
  116.         $query->setParameter('dealer'$dealer);
  117.         return $query;
  118.     }
  119.     /**
  120.      * @param FormMapper $formMapper
  121.      */
  122.     protected function configureFormFields(FormMapper $formMapper): void
  123.     {
  124.         $dealer $this->security->getUser()->getDealer();
  125.         $queryBuilder $this->getModelManager()
  126.             ->getEntityManager(ViDiDepartment::class)
  127.             ->createQueryBuilder('d')
  128.             ->select('d')
  129.             ->from(ViDiDepartment::class, 'd')
  130.             ->where('d.dealer = :dealer')
  131.             ->setParameter('dealer'$dealer);
  132.         $formMapper
  133.             ->with('Сотрудник', ['class' => 'col-lg-6'])
  134.             ->add('callback_available'CheckboxType::class, [
  135.                 'label' => 'Отвечает на обратные звонки?',
  136.                 'required' => false,
  137.             ])
  138.             ->add('photo'MediaType::class, [
  139.                 'label' => 'Фото',
  140.                 'required' => false,
  141.                 'provider' => 'sonata.media.provider.image',
  142.                 'context' => 'dc_site'
  143.             ])
  144.             ->add('name_ru'null, ['label' => 'ФИО'])
  145.             ->add('name_ua'null, ['label' => 'ПIБ'])
  146.             ->add('department'ModelType::class, ['query' => $queryBuilder'label' => 'Отдел'])
  147.             ->add('position'ChoiceType::class, ['label' => 'Должность''choices' => array_flip(ViDiWorkerModel::getPositions())])
  148.             ->add('email'null, ['label' => 'E-mail'])
  149.             ->add('phone_mobile'null, ['label' => 'Мобильный телефон'])
  150.             ->add('phone_internal'null, ['label' => 'Внутренний телефон'])
  151.             ->add('position_worker'null, ['label' => 'Порядок отображения персонала '])
  152.             ->add('additional_page_available'CheckboxType::class, [
  153.                 'label' => 'Показать на доп странице',
  154.                 'required' => false,
  155.             ]);
  156.         if ($dealer->getId() === DealerModel::UNICOMMERCE_DEALER) {
  157.             $formMapper->add('show_on_pages'ChoiceType::class, [
  158.                 'label' => 'Сторінки на яких відображати',
  159.                 'choices' => array_flip(UnicommerceModel::PAGES),
  160.                 'multiple' => true,
  161.                 'expanded' => false// або true, якщо хочеш чекбокси
  162.                 'required' => false,
  163.             ]);
  164.         }
  165.         $formMapper->end();
  166.     }
  167.     /**
  168.      * @param ListMapper $listMapper
  169.      */
  170.     protected function configureListFields(ListMapper $listMapper): void
  171.     {
  172.         $listMapper->addIdentifier('id')
  173.             ->add('name'null, ['label' => 'Имя'])
  174.             ->add('email'null, ['label' => 'E-mail'])
  175.             ->add('position'ChoiceType::class, ['label' => 'Должность''choices' => ViDiWorkerModel::getPositions()])
  176.             ->add('dealer'null, ['label' => 'Дилерский центр'])
  177.             ->add('phone_internal'null, ['label' => 'Внутренний телефон'])
  178.             ->add('callback_available'null, ['label' => 'Отвечает на обратные?'])
  179.             ->add('department'null, ['label' => 'Отдел'])
  180.             ->add('position_worker'null, ['label' => 'Порядок'])
  181.             ->add('_action''actions', [
  182.                 'label' => 'Действия',
  183.                 'actions' => [
  184.                     'edit' => [],
  185.                     'resendToken' => [
  186.                         'template' => '@AdminBundle/CRUD/list__action_resend_token.html.twig'
  187.                     ],
  188.                     'delete' => [],
  189.                 ]
  190.             ]);
  191.     }
  192. }