Skip to content

Commit

Permalink
Merge pull request #2 from syzygypl/feature/predefined-types
Browse files Browse the repository at this point in the history
Allow configuring media set definitions via Symfony config
  • Loading branch information
mlebkowski authored Sep 16, 2016
2 parents 8a23891 + 7148d90 commit f643342
Show file tree
Hide file tree
Showing 10 changed files with 122 additions and 11 deletions.
6 changes: 6 additions & 0 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions DependencyInjection/PageMediaSetExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 9 additions & 2 deletions EventListener/PageMediaSetFormAdaptorListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

/**
Expand All @@ -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));
Expand Down
15 changes: 12 additions & 3 deletions Form/PageMediaCollectionAdminType.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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' => [
Expand All @@ -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) {
Expand Down
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
9 changes: 7 additions & 2 deletions Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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%
Expand All @@ -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 }

Expand All @@ -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%" ]
2 changes: 1 addition & 1 deletion Service/HasRichMediaInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace ArsThanea\PageMediaSetBundle\Service;

class HasRichMediaInterface
interface HasRichMediaInterface extends HasMediaSetInterface
{

}
18 changes: 18 additions & 0 deletions Service/MediaSetDefinitionInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace ArsThanea\PageMediaSetBundle\Service;

interface MediaSetDefinitionInterface
{
/**
* @param HasMediaSetInterface $object
* @return array
*/
public function getMediaSetDefinition(HasMediaSetInterface $object);

/**
* @param string $type
* @return array
*/
public function getDefaultMediaSetDefinition($type);
}
46 changes: 46 additions & 0 deletions Service/MediaSetDefinitionService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace ArsThanea\PageMediaSetBundle\Service;

class MediaSetDefinitionService implements MediaSetDefinitionInterface
{
/**
* @var array
*/
private $types;

/**
* @param array $types
*/
public function __construct(array $types)
{
$this->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 [];
}
}
12 changes: 9 additions & 3 deletions Service/PageMediaSetService.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -71,4 +77,4 @@ private function getPageMediaSet(HasMediaSetInterface $page)
return $this->mediaSets[$page->getType()][$page->getId()];
}

}
}

0 comments on commit f643342

Please sign in to comment.