src/AdminBundle/Admin/ViDiWorkerAdmin.php line 28

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