src/AdminBundle/Admin/References/ModelAdmin.php line 28

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Admin\References;
  3. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  4. use AdminBundle\Admin\BaseAdmin;
  5. use CoreBundle\Entity\Brand;
  6. use CoreBundle\Entity\Model;
  7. use CoreBundle\Model\Vehicles\VehicleType;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Imagine\Exception\RuntimeException;
  10. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  11. use Sonata\AdminBundle\Datagrid\ListMapper;
  12. use Sonata\AdminBundle\Exception\ModelManagerException;
  13. use Sonata\AdminBundle\Form\FormMapper;
  14. use Sonata\AdminBundle\Form\Type\ModelType;
  15. use Sonata\AdminBundle\Route\RouteCollectionInterface;
  16. use Sonata\Form\Validator\ErrorElement;
  17. use Sonata\MediaBundle\Form\Type\MediaType;
  18. use Symfony\Component\Finder\Exception\AccessDeniedException;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\Form\FormError;
  21. /**
  22.  * Class ModelAdmin
  23.  * @package AdminBundle\Admin\References
  24.  */
  25. class ModelAdmin extends BaseAdmin
  26. {
  27.     /**
  28.      * @param RouteCollectionInterface $collection
  29.      */
  30.     protected function configureRoutes(RouteCollectionInterface $collection): void
  31.     {
  32.         $collection->remove('view');
  33.         $collection->remove('delete');
  34.     }
  35.     /**
  36.      * @param ErrorElement $errorElement
  37.      * @param Model $object
  38.      */
  39.     public function validate(ErrorElement $errorElement$object)
  40.     {
  41.         if (preg_match('/[\p{Cyrillic}]|\\\\|\//u'$object->getTitle())) {
  42.             $this->getForm()->addError(new FormError('Title не повинен містити кирилицю та символи "/" та "\"'));
  43.         }
  44.         /** @var EntityManagerInterface $em */
  45.         $models $this->em->getRepository(Model::class)->findBy(['brand' => $object->getBrand()]);
  46.         foreach ($models as $model) {
  47.             $fTitle $model->getTitle();
  48.             $fTitle str_replace(' '''$fTitle);
  49.             $fTitle str_replace('-'''$fTitle);
  50.             $sTitle $object->getTitle();
  51.             $sTitle str_replace(' '''$sTitle);
  52.             $sTitle str_replace('-'''$sTitle);
  53.             if (strtolower($fTitle) == strtolower($sTitle) && $object->getId() !== $model->getId()) {
  54.                 $this->getForm()->addError(new FormError('Така модель вже існує'));
  55.             }
  56.         }
  57.     }
  58.     /**
  59.      * @param Model $object
  60.      */
  61.     public function prePersist($object): void
  62.     {
  63.         try {
  64.             $url $this->generateUrlFromString($object->getTitle());
  65.             $object->setUrl($url);
  66.         } catch (\RuntimeException $e) {
  67.             $this->getForm()->addError(
  68.                 new FormError('Зображення пошкоджено або формат не підтримується')
  69.             );
  70.             throw new ModelManagerException('Зображення пошкоджено або формат не підтримується'0$e);
  71.         }
  72.     }
  73.     /**
  74.      * @param Model $object
  75.      */
  76.     public function preUpdate($object): void
  77.     {
  78.         try {
  79.             $url $this->generateUrlFromString($object->getTitle());
  80.             $object->setUrl($url);
  81.         } catch (\RuntimeException $e) {
  82.             $this->getForm()->addError(
  83.                 new FormError('Зображення пошкоджено або формат не підтримується')
  84.             );
  85.             throw new ModelManagerException('Зображення пошкоджено або формат не підтримується'0$e);
  86.         }
  87.     }
  88.     /**
  89.      * @param FormMapper $formMapper
  90.      */
  91.     protected function configureFormFields(FormMapper $formMapper): void
  92.     {
  93.         $User $this->getUser();
  94.         $Dealer $User->getDealer();
  95.         $queryBuilder $this->getModelManager()
  96.             ->getEntityManager(Brand::class)
  97.             ->createQueryBuilder('b')
  98.             ->select('b')
  99.             ->from('CoreBundle:Brand''b')
  100.             ->innerJoin('b.dealer''d')
  101.             ->where('d = :dealer')
  102.             ->setParameter('dealer'$Dealer->getId());
  103.         $queryModel = [];
  104.         $formMapper
  105.             ->with('Контент', ['class' => 'col-lg-6'])
  106.             ->add('image'MediaType::class, [
  107.                 'label' => 'Зображення',
  108.                 'provider' => 'sonata.media.provider.image',
  109.                 'context' => 'dc_site'
  110.             ])
  111.             ->add('vehicle_type'ChoiceType::class, [
  112.                 'label' => 'Тип техніки',
  113.                 'choices' => array_flip(VehicleType::getTypes())
  114.             ]);
  115.         if ($User->hasRole('ROLE_AUTOMARKET_MANAGER') || $User->hasRole('ROLE_SUPER_ADMIN') || $User->hasRole('ROLE_DC_MANAGER')) {
  116.             $formMapper->add('brand'ModelType::class, ['label' => 'Бренд']);
  117.         } else {
  118.             $formMapper->add('brand'ModelType::class, ['label' => 'Бренд''query' => $queryBuilder]);
  119.             $brand $queryBuilder->getQuery()->getOneOrNullResult();
  120.             if($brand) {
  121.                 $autoRiaModelByBrand $this->autoRia->getModels($brand->getRiaId());
  122.                 foreach ($autoRiaModelByBrand as $model) {
  123.                     $queryModel[$model['title']] = $model['id'];
  124.                 }
  125.             }
  126.         }
  127.         $formMapper->add('title'ChoiceType::class, ['label' => 'Модель''choices' => $queryModel]);
  128.         $formMapper->add('crm_id'null, ['label' => 'CRM ID']);
  129.         $formMapper->add('position'null, ['label' => 'Позиція']);
  130.         $formMapper->end();
  131.     }
  132.     /**
  133.      * @param string $context
  134.      * @return ProxyQueryInterface
  135.      */
  136.     public function configureQuery($context 'list'): ProxyQueryInterface
  137.     {
  138.         $user $this->getUser();
  139.         $query parent::configureQuery($context);
  140.         $dealer $user->getDealer();
  141.         if (!$dealer) {
  142.             throw new AccessDeniedException();
  143.         }
  144.         if ($user->hasRole('ROLE_AUTOMARKET_MANAGER') || $user->hasRole('ROLE_SUPER_ADMIN')) {
  145.             return $query;
  146.         }
  147.         $query->innerJoin($query->getRootAliases()[0] . '.brand''b');
  148.         $query->innerJoin('b.dealer''d');
  149.         $query->andWhere('d.id = :dealer');
  150.         $query->setParameter('dealer'$dealer);
  151.         return $query;
  152.     }
  153.     /**
  154.      * @param DatagridMapper $datagridMapper
  155.      */
  156.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  157.     {
  158.         $datagridMapper->add('id')
  159.             ->add('brand'null, ['label' => 'Бренд'])
  160.             ->add('title'null, ['label' => 'Назва моделі']);
  161.     }
  162.     /**
  163.      * @param ListMapper $listMapper
  164.      */
  165.     protected function configureListFields(ListMapper $listMapper): void
  166.     {
  167.         $listMapper->addIdentifier('id')
  168.             ->add('title'null, ['label' => 'Назва'])
  169.             ->add('brand'null, ['label' => 'Бренд'])
  170.             ->add('vehicle_type''choice', [
  171.                 'label' => 'Тип техники',
  172.                 'choices' => VehicleType::getTypes()
  173.             ])
  174.             ->add('crm_id'null, ['label' => 'CRM ID']);
  175.         $listMapper->add('_action''actions', [
  176.             'label' => 'Дії',
  177.             'actions' => [
  178.                 'edit' => [],
  179.             ]
  180.         ]);
  181.     }
  182.     protected function configure(): void
  183.     {
  184.         parent::configure(); // TODO: Change the autogenerated stub
  185.         $this->setTemplate('edit''@Admin/CRUD/Vehicle/vehicle-model-create_edit.html.twig');
  186.         $this->setTemplate('create''@Admin/CRUD/Vehicle/vehicle-model-create_edit.html.twig');
  187.     }
  188. }