diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 576645f..b8d541e 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -24,6 +24,12 @@ public function getConfigTreeBuilder() $rootNode->children()->booleanNode('indexer')->defaultFalse(); + /** @var ArrayNodeDefinition $types */ + $types = $rootNode->children()->arrayNode('types'); + $types->defaultValue([]); + $types = $types->prototype('array'); + $types->prototype('scalar'); + $formats = $rootNode->children()->arrayNode('formats'); $formats->isRequired(); $formats->requiresAtLeastOneElement(); diff --git a/DependencyInjection/PageMediaSetExtension.php b/DependencyInjection/PageMediaSetExtension.php index 2da6642..8282ac4 100644 --- a/DependencyInjection/PageMediaSetExtension.php +++ b/DependencyInjection/PageMediaSetExtension.php @@ -32,6 +32,8 @@ public function load(array $configs, ContainerBuilder $container) $loader->load('indexer.yml'); } + $container->setParameter('page_media_set.types', $configs['types']); + $repository = $container->getDefinition('page_media_set.format_repository'); foreach ($configs['formats'] as $name => $format) { $id = 'page_media_set.format.' . $name; diff --git a/EventListener/PageMediaSetFormAdaptorListener.php b/EventListener/PageMediaSetFormAdaptorListener.php index b54e01a..d68cd88 100644 --- a/EventListener/PageMediaSetFormAdaptorListener.php +++ b/EventListener/PageMediaSetFormAdaptorListener.php @@ -6,6 +6,7 @@ use ArsThanea\PageMediaSetBundle\Form\FormWidget; use ArsThanea\PageMediaSetBundle\Form\PageMediaCollectionAdminType; use ArsThanea\PageMediaSetBundle\Service\HasMediaSetInterface; +use ArsThanea\PageMediaSetBundle\Service\MediaSetDefinitionInterface; use Doctrine\Common\Collections\ArrayCollection; use Kunstmaan\AdminBundle\Helper\FormWidgets\Tabs\Tab; use Kunstmaan\NodeBundle\Event\AdaptFormEvent; @@ -18,9 +19,15 @@ class PageMediaSetFormAdaptorListener */ private $repository; - public function __construct(PageMediaRepository $repository) + /** + * @var MediaSetDefinitionInterface + */ + private $mediaSetDefinition; + + public function __construct(PageMediaRepository $repository, MediaSetDefinitionInterface $mediaSetDefinition) { $this->repository = $repository; + $this->mediaSetDefinition = $mediaSetDefinition; } /** @@ -36,7 +43,7 @@ public function adaptForm(AdaptFormEvent $event) $mediaSet = $this->repository->getPageMediaSet($page); - $type = new PageMediaCollectionAdminType($page); + $type = new PageMediaCollectionAdminType($page, $this->mediaSetDefinition); $mediaWidget = new FormWidget($type, new ArrayCollection($mediaSet)); $event->getTabPane()->addTab(new Tab('Media Set', $mediaWidget)); diff --git a/Form/PageMediaCollectionAdminType.php b/Form/PageMediaCollectionAdminType.php index 8b2e5df..4ffb346 100644 --- a/Form/PageMediaCollectionAdminType.php +++ b/Form/PageMediaCollectionAdminType.php @@ -4,6 +4,7 @@ use ArsThanea\PageMediaSetBundle\Entity\PageMedia; use ArsThanea\PageMediaSetBundle\Service\HasMediaSetInterface; +use ArsThanea\PageMediaSetBundle\Service\MediaSetDefinitionInterface; use ArsThanea\PageMediaSetBundle\Service\HasRichMediaInterface; use Doctrine\Common\Collections\Collection; use Symfony\Component\Form\AbstractType; @@ -19,9 +20,15 @@ class PageMediaCollectionAdminType extends AbstractType */ private $page; - public function __construct(HasMediaSetInterface $page) + /** + * @var MediaSetDefinitionInterface + */ + private $mediaSetDefinition; + + public function __construct(HasMediaSetInterface $page, MediaSetDefinitionInterface $mediaSetDefinition) { $this->page = $page; + $this->mediaSetDefinition = $mediaSetDefinition; } public function buildForm(FormBuilderInterface $builder, array $options) @@ -32,7 +39,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'allow_add' => false, 'type' => PageMediaAdminType::class, 'options' => [ - 'media_types' => $this->page->getMediaSetDefinition(), + 'media_types' => $this->mediaSetDefinition->getMediaSetDefinition($this->page), 'images_only' => false === $this->page instanceof HasRichMediaInterface ], 'attr' => [ @@ -44,11 +51,13 @@ public function buildForm(FormBuilderInterface $builder, array $options) /** @var Collection $data */ $data = $event->getData(); + $mediaSet = $this->mediaSetDefinition->getMediaSetDefinition($this->page); + $types = array_map(function ($type) use ($data) { return $data->filter(function (PageMedia $element) use ($type) { return $type === $element->getType(); })->first() ? : (new PageMedia)->setType($type)->setPageId($this->page->getId())->setPageType($this->page->getType()); - }, array_combine($this->page->getMediaSetDefinition(), $this->page->getMediaSetDefinition())); + }, array_combine($mediaSet, $mediaSet)); $data->clear(); foreach ($types as $key => $item) { diff --git a/README.md b/README.md index 15f60cd..da74006 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,18 @@ page_media_set: You need to configure all your media types, but the constraints are optional. +### Predefined media set types + +You can configure the media set definitions using symfony config, instead of returning them using the `getMediaSetDefinition` method. + +```yaml +# app/config/config.yml +page_media_set: + types: + 'Acme\Foo\Bar\BazEntity': [ 'foo', 'bar' ] +``` + +In this case `Acme\Foo\Bar\BazEntity::getMediaSetDefinition()` won’t be called, `foo` and `bar` formats will be used. ### Format names diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 3296425..dc6e5c0 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -4,11 +4,12 @@ parameters: page_media_set.node_listener.class: ArsThanea\PageMediaSetBundle\EventListener\PageMediaSetFormAdaptorListener page_media_set.form.page_media_admin_type.class: ArsThanea\PageMediaSetBundle\Form\PageMediaAdminType page_media_set.twig.page_media_set_twig_extension.class: ArsThanea\PageMediaSetBundle\Twig\PageMediaSetTwigExtension + page_media_set.media_set_definition.class: 'ArsThanea\PageMediaSetBundle\Service\MediaSetDefinitionService' services: page_media_set.page_media_set_service: class: %page_media_set.page_media_set_service.class% - arguments: [ @page_media_set.repository ] + arguments: [ '@page_media_set.repository', '@page_media_set.media_set_definition' ] page_media_set.format_repository: class: %page_media_set.format_repository.class% @@ -31,7 +32,7 @@ services: page_media_set.node_listener: class: %page_media_set.node_listener.class% - arguments: [ @page_media_set.repository ] + arguments: [ '@page_media_set.repository', '@page_media_set.media_set_definition' ] tags: - { name: kernel.event_listener, event: kunstmaan_node.adaptForm, method: adaptForm } @@ -41,3 +42,7 @@ services: tags: - { name: form.type, alias: page_media } + + page_media_set.media_set_definition: + class: '%page_media_set.media_set_definition.class%' + arguments: [ "%page_media_set.types%" ] diff --git a/Service/HasRichMediaInterface.php b/Service/HasRichMediaInterface.php index a609a61..8e42905 100644 --- a/Service/HasRichMediaInterface.php +++ b/Service/HasRichMediaInterface.php @@ -2,7 +2,7 @@ namespace ArsThanea\PageMediaSetBundle\Service; -class HasRichMediaInterface +interface HasRichMediaInterface extends HasMediaSetInterface { } diff --git a/Service/MediaSetDefinitionInterface.php b/Service/MediaSetDefinitionInterface.php new file mode 100644 index 0000000..f142c4a --- /dev/null +++ b/Service/MediaSetDefinitionInterface.php @@ -0,0 +1,18 @@ +types = array_map(function ($v) { return (array)$v; }, $types); + } + + + /** + * @param HasMediaSetInterface $object + * @return array + */ + public function getMediaSetDefinition(HasMediaSetInterface $object) + { + if (isset($this->types[$object->getType()])) { + return (array)$this->types[$object->getType()]; + } + + return $object->getMediaSetDefinition(); + } + + /** + * @param string $type + * @return array + */ + public function getDefaultMediaSetDefinition($type) + { + if (isset($this->types[$type])) { + return $this->types[$type]; + } + + return []; + } +} diff --git a/Service/PageMediaSetService.php b/Service/PageMediaSetService.php index e740e6c..4e837fe 100644 --- a/Service/PageMediaSetService.php +++ b/Service/PageMediaSetService.php @@ -22,15 +22,21 @@ class PageMediaSetService */ private $repository; - public function __construct(PageMediaRepository $repository) + /** + * @var MediaSetDefinitionInterface + */ + private $mediaSetDefinition; + + public function __construct(PageMediaRepository $repository, MediaSetDefinitionInterface $mediaSetDefinition) { $this->repository = $repository; + $this->mediaSetDefinition = $mediaSetDefinition; } public function getPageMedia(HasMediaSetInterface $page, $name = null) { if (null === $name) { - list ($name) = $page->getMediaSetDefinition(); + list ($name) = $this->mediaSetDefinition->getMediaSetDefinition($page); } $mediaSet = $this->getPageMediaSet($page); @@ -71,4 +77,4 @@ private function getPageMediaSet(HasMediaSetInterface $page) return $this->mediaSets[$page->getType()][$page->getId()]; } -} \ No newline at end of file +}