vendor/sonata-project/media-bundle/src/Admin/BaseMediaAdmin.php line 53

  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the Sonata Project package.
  5.  *
  6.  * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Sonata\MediaBundle\Admin;
  12. use Sonata\AdminBundle\Admin\AbstractAdmin;
  13. use Sonata\AdminBundle\Datagrid\ListMapper;
  14. use Sonata\AdminBundle\Form\FormMapper;
  15. use Sonata\AdminBundle\Form\Type\ModelListType;
  16. use Sonata\AdminBundle\Object\Metadata;
  17. use Sonata\AdminBundle\Object\MetadataInterface;
  18. use Sonata\ClassificationBundle\Model\CategoryManagerInterface;
  19. use Sonata\ClassificationBundle\Model\ContextManagerInterface;
  20. use Sonata\MediaBundle\Form\DataTransformer\ProviderDataTransformer;
  21. use Sonata\MediaBundle\Provider\MediaProviderInterface;
  22. use Sonata\MediaBundle\Provider\Pool;
  23. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  24. /**
  25.  * @phpstan-extends AbstractAdmin<\Sonata\MediaBundle\Model\MediaInterface>
  26.  */
  27. abstract class BaseMediaAdmin extends AbstractAdmin
  28. {
  29.     protected Pool $pool;
  30.     protected ?CategoryManagerInterface $categoryManager null;
  31.     protected ?ContextManagerInterface $contextManager null;
  32.     protected $classnameLabel 'Media';
  33.     /**
  34.      * @phpstan-param class-string<\Sonata\MediaBundle\Model\MediaInterface> $class
  35.      */
  36.     public function __construct(
  37.         string $code,
  38.         string $class,
  39.         string $baseControllerName,
  40.         Pool $pool,
  41.         ?CategoryManagerInterface $categoryManager null,
  42.         ?ContextManagerInterface $contextManager null
  43.     ) {
  44.         parent::__construct($code$class$baseControllerName);
  45.         $this->pool $pool;
  46.         $this->categoryManager $categoryManager;
  47.         $this->contextManager $contextManager;
  48.     }
  49.     final public function getObjectMetadata(object $object): MetadataInterface
  50.     {
  51.         $provider $this->pool->getProvider($object->getProviderName());
  52.         $url $provider->generatePublicUrl(
  53.             $object,
  54.             $provider->getFormatName($objectMediaProviderInterface::FORMAT_ADMIN)
  55.         );
  56.         return new Metadata($this->toString($object), $object->getDescription(), $url);
  57.     }
  58.     protected function prePersist(object $object): void
  59.     {
  60.         $parameters $this->getPersistentParameters();
  61.         $object->setContext($parameters['context']);
  62.     }
  63.     protected function configurePersistentParameters(): array
  64.     {
  65.         $parameters = [];
  66.         if (!$this->hasRequest()) {
  67.             return $parameters;
  68.         }
  69.         $request $this->getRequest();
  70.         // TODO: Change to $request->query->all('filter') when support for Symfony < 5.1 is dropped.
  71.         $filter $request->query->all()['filter'] ?? [];
  72.         if (\is_array($filter) && \array_key_exists('context'$filter)) {
  73.             $context $filter['context']['value'];
  74.         } else {
  75.             $context $request->query->get('context'$this->pool->getDefaultContext());
  76.         }
  77.         $providers $this->pool->getProvidersByContext($context);
  78.         $provider $request->query->get('provider');
  79.         // if the context has only one provider, set it into the request
  80.         // so the intermediate provider selection is skipped
  81.         if (=== \count($providers) && null === $provider) {
  82.             $provider array_shift($providers)->getName();
  83.             $request->query->set('provider'$provider);
  84.         }
  85.         // if there is a post server error, provider is not posted and in case of
  86.         // multiple providers, it has to be persistent to not being lost
  87.         if (\count($providers) && null !== $provider) {
  88.             $parameters['provider'] = $provider;
  89.         }
  90.         $categoryId $request->query->get('category');
  91.         if (null !== $this->categoryManager && null !== $this->contextManager && null === $categoryId) {
  92.             $rootCategories $this->categoryManager->getRootCategoriesForContext($this->contextManager->find($context));
  93.             $rootCategory current($rootCategories);
  94.             if (false !== $rootCategory) {
  95.                 $categoryId $rootCategory->getId();
  96.             }
  97.         }
  98.         return array_merge($parameters, [
  99.             'context' => $context,
  100.             'category' => $categoryId,
  101.             'hide_context' => $request->query->getBoolean('hide_context'),
  102.         ]);
  103.     }
  104.     protected function alterNewInstance(object $object): void
  105.     {
  106.         if (!$this->hasRequest()) {
  107.             return;
  108.         }
  109.         $request $this->getRequest();
  110.         if ($request->isMethod('POST')) {
  111.             $uniqId $this->getUniqId();
  112.             // TODO: Change to $request->request->all($uniqid)['providerName'] when support for Symfony < 5.1 is dropped.
  113.             $data $request->request->all()[$uniqId] ?? [];
  114.             \assert(\is_array($data));
  115.             $providerName $data['providerName'];
  116.         } else {
  117.             $providerName $request->query->get('provider');
  118.         }
  119.         $context $request->query->get('context');
  120.         $object->setProviderName($providerName);
  121.         $object->setContext($context);
  122.         $categoryId $this->getPersistentParameter('category');
  123.         if (null === $this->categoryManager || null === $categoryId) {
  124.             return;
  125.         }
  126.         $category $this->categoryManager->find($categoryId);
  127.         if (null === $category) {
  128.             return;
  129.         }
  130.         $categoryContext $category->getContext();
  131.         if (null === $categoryContext || $categoryContext->getId() !== $context) {
  132.             return;
  133.         }
  134.         $object->setCategory($category);
  135.     }
  136.     protected function configureListFields(ListMapper $list): void
  137.     {
  138.         $list
  139.             ->addIdentifier('name')
  140.             ->add('description')
  141.             ->add('enabled')
  142.             ->add('size');
  143.     }
  144.     protected function configureFormFields(FormMapper $form): void
  145.     {
  146.         $media $this->hasSubject() ? $this->getSubject() : $this->getNewInstance();
  147.         if (null === $media->getProviderName()) {
  148.             return;
  149.         }
  150.         $form->add('providerName'HiddenType::class);
  151.         $form->getFormBuilder()->addModelTransformer(new ProviderDataTransformer($this->pool$this->getClass()), true);
  152.         $provider $this->pool->getProvider($media->getProviderName());
  153.         if (null !== $media->getId()) {
  154.             $provider->buildEditForm($form);
  155.         } else {
  156.             $provider->buildCreateForm($form);
  157.         }
  158.         if (null === $this->categoryManager) {
  159.             return;
  160.         }
  161.         $form->add('category'ModelListType::class, [], [
  162.             'link_parameters' => [
  163.                 'context' => $media->getContext(),
  164.                 'hide_context' => true,
  165.                 'mode' => 'tree',
  166.             ],
  167.         ]);
  168.     }
  169. }