src/AdminBundle/Admin/DCAutoSite/AccessoriesAdmin.php line 33

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Admin\DCAutoSite;
  3. use CoreBundle\Entity\User;
  4. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  5. use AdminBundle\Admin\BaseAdmin;
  6. use AdminBundle\Form\Type\ContentType;
  7. use DcSiteBundle\Entity\Part;
  8. use DcSiteBundle\Entity\Accessories;
  9. use DcSiteBundle\Entity\AccessoriesGroup;
  10. use DcSiteBundle\Entity\AccessoriesCategory;
  11. use DcSiteBundle\Entity\Service\VehicleAccessory;
  12. use DcSiteBundle\Entity\ServiceWorkPart;
  13. use Doctrine\ORM\Query\Expr\Join;
  14. use FOS\CKEditorBundle\Form\Type\CKEditorType;
  15. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  16. use Sonata\Form\Type\CollectionType;
  17. use Sonata\AdminBundle\Form\Type\ModelListType;
  18. use Sonata\AdminBundle\Form\Type\ModelType;
  19. use Sonata\AdminBundle\Route\RouteCollectionInterface;
  20. use Sonata\MediaBundle\Form\Type\MediaType;
  21. use Symfony\Component\Finder\Exception\AccessDeniedException;
  22. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextType;
  24. use Sonata\AdminBundle\Route\RouteCollection;
  25. use Sonata\AdminBundle\Form\FormMapper;
  26. use Sonata\AdminBundle\Datagrid\ListMapper;
  27. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  28. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  29. class AccessoriesAdmin extends BaseAdmin
  30. {
  31.     /**
  32.      * @param RouteCollection $collection
  33.      */
  34.     protected function configureRoutes(RouteCollectionInterface $collection): void
  35.     {
  36.         $collection->remove('view');
  37.         $collection->remove('delete');
  38.         $collection->add('media'$this->getRouterIdParameter() . '/accessory_media');
  39.     }
  40.     /**
  41.      * @param Accessories $object
  42.      */
  43.     public function prePersist($object): void
  44.     {
  45.         /** @var User $User */
  46.         $User $this->security->getUser();
  47.         if (!$User->getDealer() && !$object->getDealer()) {
  48.             throw new AccessDeniedException('User without dealer');
  49.         }
  50.         /** @var AccessoriesContent $content */
  51.         foreach ($object->getContent() as $content) {
  52.             $content->setAccessory($object);
  53.         }
  54.         $User $this->security->getUser();
  55.         $object->setDealer($User->getDealer());
  56.         $this->preSave($object);
  57.         $object->setState(1);
  58.     }
  59.     public function preUpdate($object): void
  60.     {
  61.         $this->preSave($object);
  62.         parent::preUpdate($object);
  63.     }
  64.     /**
  65.      * @param Accessories $object
  66.      */
  67.     private function preSave($object)
  68.     {
  69.         $object->setPrice((float)str_replace(',''.'$object->getPrice()));
  70.         if (empty($object->getUrl()) && !empty($object->getAccessoryNumber())) {
  71.             $object->setUrl(strtolower($object->getId() . '-' $object->getAccessoryNumber()->getNumber()));
  72.         }
  73.         if (empty($object->getNameRu())) {
  74.             $object->setNameRu('');
  75.         }
  76.         if (empty($object->getNameUa())) {
  77.             $object->setNameUA('');
  78.         }
  79.         /** @var VehicleAccessory $va */
  80.         foreach ($object->getAccessoryVehicles() as $va) {
  81.             $va->setAccessory($object);
  82.         }
  83.     }
  84.     /**
  85.      * @param FormMapper $formMapper
  86.      */
  87.     protected function configureFormFields(FormMapper $formMapper): void
  88.     {
  89.         $User $this->security->getUser();
  90.         if (!$Dealer $User->getDealer()) {
  91.             throw new AccessDeniedException('User without dealer');
  92.         }
  93.        if(in_array($User->getDealer()->getUniqueId(), ['YAMAHA''VIDI_MARINE','GRAND','OPEL'])){
  94.            $requiredAll false;
  95.            $requiredSingle =  true;
  96.        }else{
  97.            $requiredAll true;
  98.            $requiredSingle =  false;
  99.        }
  100.         $queryBuilderParentCategory $this->getModelManager()
  101.             ->getEntityManager(AccessoriesCategory::class)
  102.             ->createQueryBuilder('ac')
  103.             ->select('ac')
  104.             ->from(AccessoriesCategory::class, 'ac');
  105.         $queryBuilderPart $this->getModelManager()
  106.             ->getEntityManager(Part::class)
  107.             ->createQueryBuilder('p')
  108.             ->select('p')
  109.             ->from(Part::class, 'p')
  110.             ->innerJoin(ServiceWorkPart::class, 'swp'Join::WITH'swp.part = p.id')
  111.             ->where('p.dealer = :dealer')
  112.             ->setParameter('dealer'$Dealer);
  113.         $formMapper
  114.             ->tab('Основная информация NEW')
  115.             ->with('Контент', ['class' => 'col-lg-6'])
  116.             ->add('content'ContentType::class, ['label' => false], [
  117.                 'edit' => 'inline',
  118.                 'sortable' => 'position',
  119.                 'admin_code' => 'admin.dc.accessories_content',
  120.             ])
  121.             ->end()
  122.             ->with('Дополнительно', ['class' => 'col-md-6'])
  123.             ->add('state'CheckboxType::class, ['label' => 'Показывать на сайте''required' => false])
  124.             ->add('sale_price'null, [
  125.                 'required' => false,
  126.                 'label' => 'Цена со скидкой'
  127.             ])
  128.             ->add('accessory_number'ModelType::class, [
  129.                 'label' => 'Каталожный номер',
  130.                 'query' => $queryBuilderPart,
  131.                 'btn_add' => false,
  132.                 'required' => $requiredAll,
  133.             ])
  134.             ->add('url'null, [
  135.                 'label' => 'URL'
  136.             ])
  137. //                    ->add('price', null, [
  138. //                        'required' => true,
  139. //                        'label' => 'Цена'
  140. //                    ])
  141. //                    ->add('priceUsd', null, [
  142. //                        'required' => false,
  143. //                        'label' => 'Цена в валюте'
  144. //                    ])
  145. //                    ->add('avail_count', IntegerType::class, [
  146. //                        'required' => false,
  147. //                        'label' => 'Доступное количество',
  148. //                    ])
  149.             ->add('select_categories'ModelType::class, [
  150.                 'label' => 'Категория',
  151.                 'query' => $queryBuilderParentCategory,
  152.                 'btn_add' => false,
  153.                 'required' => $requiredAll,
  154.                 'multiple' => true,
  155.             ])
  156.             ->add('position'null, [
  157.                 'required' => false,
  158.                 'label' => 'Порядковый номер'
  159.             ])
  160.             ->end()
  161.             ->end()
  162.             ->tab('Основная информация OLD')
  163.             ->with('Описание (RUS)', ['class' => 'col-md-6'])
  164.             ->add('name_ru'TextType::class, [
  165.                 'required' => $requiredSingle,
  166.                 'label' => 'Название (RUS)'
  167.             ])
  168.             ->add('content_ru'CKEditorType::class, [
  169.                 'config_name' => 'default',
  170.                 'required' => false,
  171.                 'label' => 'Контент (RUS)'
  172.             ])
  173.             ->end()
  174.             ->with('Описание (UA)', ['class' => 'col-md-6'])
  175.             ->add('name_ua'TextType::class, [
  176.                 'required' => $requiredSingle,
  177.                 'label' => 'Название (UA)'
  178.             ])
  179.             ->add('content_ua'CKEditorType::class, [
  180.                 'config_name' => 'default',
  181.                 'required' => false,
  182.                 'label' => 'Контент (UA)'
  183.             ])
  184.             ->end()
  185.             ->with('Дополнительно', ['class' => 'col-md-6'])
  186.             ->add('image'MediaType::class, [
  187.                 'provider' => 'sonata.media.provider.image',
  188.                 'context' => 'dc_site',
  189.                 'label' => 'Фото',
  190.                 'required' => $requiredSingle,
  191.             ])
  192.             ->add('price'null, [
  193.                 'required' => $requiredSingle,
  194.                 'label' => 'Цена',
  195.             ])
  196.             ->add('priceUsd'null, [
  197.                 'required' => false,
  198.                 'label' => 'Цена в валюте'
  199.             ])
  200.             ->add('position'null, [
  201.                 'required' => false,
  202.                 'label' => 'Порядковый номер'
  203.             ])
  204.             ->add('catalog_number'null, ['label' => 'Каталожный номер'])
  205.             ->add('avail_count'IntegerType::class, [
  206.                 'required' => false,
  207.                 'label' => 'Доступное количество',
  208.             ])
  209.             ->end()
  210.             ->with('Дополнительно', ['class' => 'col-md-6'])
  211.                 ->add('state'CheckboxType::class, ['label' => 'Показывать на сайте''required' => false])
  212.             ->add('group'EntityType::class, [
  213.                 'class' => AccessoriesGroup::class,
  214.                 'required' => $requiredSingle,
  215.                 'label' => 'Категория',
  216.             ])
  217.             ->end()
  218.             ->end()
  219.             ->tab('Фото')
  220.             ->with('Фото', ['class' => 'col-md-6'])
  221.             ->add('gallery'ModelListType::class, [
  222.                 'label' => 'Галерея',
  223.                 'btn_list' => false,
  224.                 'required' => false,
  225.             ], [
  226.                 'edit' => 'inline',
  227.                 'inline' => 'table',
  228.                 'sortable' => 'position',
  229.                 'link_parameters' => [
  230.                     'context' => 'dc_car_gallery',
  231.                     'provider' => 'sonata.media.provider.image'
  232.                 ],
  233.                 'admin_code' => 'sonata.media.admin.gallery',
  234.             ])
  235.             ->end()
  236.             ->end()
  237.             ->tab('Применимость к моделям')
  238.             ->with('Применимость к моделям', ['class' => 'col-md-8'])
  239.             ->add('accessory_vehicles'CollectionType::class, [
  240.                 'by_reference' => false,
  241.                 'required' => false,
  242.                 'label' => false
  243.             ], [
  244.                 'edit' => 'inline',
  245.                 'inline' => 'table'
  246.             ])
  247.             ->end()
  248.             ->end();
  249.     }
  250.     /**
  251.      * @param string $context
  252.      * @return ProxyQueryInterface
  253.      */
  254.     public function configureQuery($context 'list'): ProxyQueryInterface
  255.     {
  256.         $user $this->security->getUser();
  257.         $query parent::configureQuery($context);
  258.         $dealer $user->getDealer();
  259.         if (!$dealer) {
  260.             throw new AccessDeniedException();
  261.         }
  262.         $query->andWhere($query->getRootAliases()[0] . '.dealer = :dealer');
  263.         $query->setParameter('dealer'$dealer->getId());
  264.         return $query;
  265.     }
  266.     /**
  267.      * @param ListMapper $listMapper
  268.      */
  269.     protected function configureListFields(ListMapper $listMapper): void
  270.     {
  271.         $listMapper->addIdentifier('id')
  272.             ->add('title'null, ['label' => 'Название'])
  273.             ->add('name_ru'null, ['label' => 'Название Old'])
  274.             ->add('catalog_number'null, ['label' => 'Каталожный номер'])
  275.             ->add('avail_count',null, ['label' => 'Количество'])
  276.             ->add('price',null, ['label' => 'Цена'])
  277.             ->add('priceUsd',null, ['label' => 'Цена в валюте'])
  278.             ->add('accessory_vehicles''sonata_type_collection', ['label' => 'Применимость к моделям'])
  279.             ->add('recommended''choice', ['label' => 'Рекомендованный''editable' => true'choices' => [
  280.                 => 'Да',
  281.                 => 'Нет',
  282.                 null => 'Нет',
  283.             ]])
  284.             ->add('select_categories''sonata_type_collection', ['label' => 'Группа'])
  285.             ->add('_action''actions', [
  286.                 'label' => 'Действия',
  287.                 'actions' => [
  288.                     'edit' => [],
  289.                     'media' => [
  290.                         'template' => '@AdminBundle/CRUD/list__action_media.html.twig'
  291.                     ],
  292.                 ]
  293.             ]);
  294.     }
  295.     /**
  296.      * @param DatagridMapper $datagridMapper ]
  297.      */
  298.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  299.     {
  300.         $User $this->security->getUser();
  301.         if (!$Dealer $User->getDealer()) {
  302.             throw new AccessDeniedException('User without dealer');
  303.         }
  304.         $datagridMapper
  305.             ->add('name_ru'null, ['label' => 'Название'])
  306.             ->add('group'null, ['label' => 'Группа'])
  307.             ->add('catalog_number'null, ['label' => 'Каталожный номер']);
  308.     }
  309. }