src/AdminBundle/Admin/Service/ServiceWorkAdmin.php line 25

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Admin\Service;
  3. use DateTime;
  4. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  5. use CoreBundle\Entity\Model;
  6. use DcSiteBundle\Entity\ServiceWorkJob;
  7. use DcSiteBundle\Entity\ServiceWorkPart;
  8. use DcSiteBundle\Entity\ServiceWork;
  9. use Doctrine\ORM\Query\Expr\Join;
  10. use Sonata\AdminBundle\Admin\AbstractAdmin;
  11. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  12. use Sonata\AdminBundle\Datagrid\ListMapper;
  13. use Sonata\AdminBundle\Form\FormMapper;
  14. use Sonata\AdminBundle\Form\Type\ModelType;
  15. use Sonata\AdminBundle\Route\RouteCollectionInterface;
  16. use Sonata\Form\Type\CollectionType;
  17. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  18. use Symfony\Component\Finder\Exception\AccessDeniedException;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\Security\Core\Security;
  21. class ServiceWorkAdmin extends AbstractAdmin
  22. {
  23.     protected Security $security;
  24.     public function setContainerServices(Security $security): void
  25.     {
  26.         $this->security $security;
  27.     }
  28.     public function prePersist($object): void
  29.     {
  30.         $this->prePare($object);
  31.     }
  32.     public function preUpdate($object): void
  33.     {
  34.         $this->prePare($object);
  35.         parent::preUpdate($object);
  36.     }
  37.     private function prePare(ServiceWork $object) {
  38.         $user $this->security->getUser();
  39.         $dealer $user->getDealer();
  40.         if(!$dealer) {
  41.             throw new AccessDeniedException();
  42.         }
  43.         $object->setDealer($dealer);
  44.         /** @var ServiceWorkJob $Job */
  45.         foreach ($object->getJobs() as $Job) {
  46.             $Job->setRegulation($object);
  47.         }
  48.         /** @var ServiceWorkPart $Part */
  49.         foreach ($object->getParts() as $Part) {
  50.             $Part->setRegulation($object);
  51.         }
  52.         parent::preUpdate($object);
  53.     }
  54.     /**
  55.      * @param RouteCollectionInterface $collection
  56.      */
  57.     protected function configureRoutes(RouteCollectionInterface $collection): void
  58.     {
  59.         $collection->remove('view');
  60.         $collection->remove('create');
  61.         $collection->remove('delete');
  62.         $collection->add('cloneRegulation'$this->getRouterIdParameter().'/clone');
  63.     }
  64.     /**
  65.      * @param FormMapper $formMapper
  66.      */
  67.     protected function configureFormFields(FormMapper $formMapper): void
  68.     {
  69.         $years = [];
  70.         $year = new DateTime();
  71.         for($i 1$i <= 25$i++) {
  72.             $years[$year->format('Y')] = $year->format('Y');
  73.             $year->modify('- 1 year');
  74.         }
  75.         $User $this->security->getUser();
  76.         if(!$Dealer $User->getDealer()) {
  77.             throw new AccessDeniedException('User without dealer');
  78.         }
  79.         $queryBuilder $this->getModelManager()
  80.             ->getEntityManager(Model::class)
  81.             ->createQueryBuilder('m')
  82.             ->select('m')
  83.             ->from('CoreBundle:Model','m')
  84.             ->innerJoin('m.brand','b'Join::WITH'b.id = :brand')
  85.             ->setParameter('brand'$Dealer->getBrand());
  86.         $formMapper
  87.             ->with(' ', ['class' => 'col-lg-3'])
  88.                 ->add('variation.model'ModelType::class, ['label' => 'Модель''required' => true'query' => $queryBuilder'btn_add' => false])
  89.                 ->add('variation.engine_volume'null, ['label' => 'Объем двигателя'])
  90.                 ->add('mileage'null, ['label' => 'Пробег (км)'])
  91.             ->end()
  92.             ->with('  ', ['class' => 'col-lg-3'])
  93.                 ->add('variation.year_from'ChoiceType::class, ['label' => 'Год выпуска от''choices' => $years])
  94.                 ->add('variation.year_to'ChoiceType::class, ['label' => 'Год выпуска до''choices' => $years'required' => false])
  95.             ->end()
  96.             ->with('   ', ['class' => 'col-lg-3'])
  97.                 ->add('variation.fuelType'ModelType::class, ['label' => 'Тип топлива''btn_add' => false])
  98.                 ->add('variation.driveUnit'ModelType::class, ['label' => 'Привод''btn_add' => false])
  99.             ->end()
  100.             ->with('    ', ['class' => 'col-lg-3'])
  101.                 ->add('variation.transmissionType'ModelType::class, ['label' => 'КПП''btn_add' => false])
  102.                 ->add('variation.transmission_step_count'null, ['label' => 'Кол-во ступеней КПП''required' => false])
  103.             ->end()
  104.             ->with('Список запасных частей', ['class' => 'col-lg-12'])
  105.                 ->add('parts'CollectionType::class,[
  106.                     'label' => false,
  107.                     'by_reference' => false,
  108.                 ],[
  109.                     'edit' => 'inline',
  110.                     'inline' => 'table',
  111.                     'sortable' => 'position',
  112.                 ])
  113.             ->end()
  114.             ->with('Список работ', ['class' => 'col-lg-12'])
  115.                 ->add('jobs'CollectionType::class,[
  116.                     'label' => false,
  117.                     'by_reference' => false,
  118.                 ],[
  119.                     'edit' => 'inline',
  120.                     'inline' => 'table',
  121.                     'sortable' => 'position',
  122.                 ])
  123.             ->end()
  124.         ;
  125.     }
  126.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  127.     {
  128.         $datagridMapper->add('id');
  129.         $User $this->security->getUser();
  130.         if(!$Dealer $User->getDealer()) {
  131.             throw new AccessDeniedException('User without dealer');
  132.         }
  133.         $queryBuilder $this->getModelManager()
  134.             ->getEntityManager(Model::class)
  135.             ->createQueryBuilder('m')
  136.             ->select('m')
  137.             ->from('CoreBundle:Model','m')
  138.             ->where('m.brand = :brand')
  139.             ->setParameter('brand'$User->getDealer()->getBrand());
  140.         $datagridMapper->add('variation.model',null, ['label' => 'Модель'], EntityType::class,
  141.             ['class' => 'CoreBundle:Model''query_builder' => $queryBuilder]);
  142.     }
  143.     /**
  144.      * @param string $context
  145.      * @return ProxyQueryInterface
  146.      */
  147.     public function configureQuery($context 'list'): ProxyQueryInterface
  148.     {
  149.         $user $this->security->getUser();
  150.         $query parent::configureQuery($context);
  151.         $dealer $user->getDealer();
  152.         if(!$dealer) {
  153.             throw new AccessDeniedException();
  154.         }
  155.         $query->andWhere(
  156.             $query->expr()->eq($query->getRootAliases()[0].'.dealer',':dealer')
  157.         );
  158.         $query->setParameter('dealer'$dealer->getId());
  159.         return $query;
  160.     }
  161.     /**
  162.      * @param ListMapper $listMapper
  163.      */
  164.     protected function configureListFields(ListMapper $listMapper): void
  165.     {
  166.         $listMapper->addIdentifier('id')
  167.             ->add('variation.model',null, ['label' => 'Модель'])
  168.             ->add('variation.year_from'null, ['label' => 'Год выпуска от'])
  169.             ->add('variation.year_to'null, ['label' => 'Год выпуска до'])
  170.             ->add('mileage'null, ['label' => 'Пробег'])
  171.             ->add('variation.engine_volume'ChoiceType::class, ['label' => 'Объем двигателя'])
  172.             ->add('variation.transmissionType',null, ['label' => 'КПП'])
  173.             ->add('variation.fuelType',null, ['label' => 'Тип топлива'])
  174.             ->add('variation.driveUnit',null, ['label' => 'Привод'])
  175.             ->add('_action''actions', [
  176.                 'label' => 'Действия',
  177.                 'actions' => [
  178.                     'edit' => [],
  179.                     'cloneRegulation' => [
  180.                         'template' => '@AdminBundle/CRUD/list__action_clone_r.html.twig'
  181.                     ]
  182.                 ]
  183.             ])
  184.         ;
  185.     }
  186. }