open-orchestra/open-orchestra-media-admin-bundle

View on GitHub
MediaAdminBundle/DependencyInjection/OpenOrchestraMediaAdminExtension.php

Summary

Maintainability
C
7 hrs
Test Coverage
<?php

namespace OpenOrchestra\MediaAdminBundle\DependencyInjection;

use OpenOrchestra\Media\DisplayBlock\Strategies\DisplayMediaStrategy;
use OpenOrchestra\Media\DisplayBlock\Strategies\GalleryStrategy;
use OpenOrchestra\Media\DisplayBlock\Strategies\MediaListByKeywordStrategy;
use OpenOrchestra\Media\DisplayBlock\Strategies\SlideshowStrategy;
use OpenOrchestra\MediaAdmin\Security\ContributionRoleInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class OpenOrchestraMediaAdminExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $container->setParameter('open_orchestra_media_admin.tmp_dir', $config['tmp_dir']);
        $container->setParameter('open_orchestra_media_admin.media_type_filter', $config['media_type_filter']);
        $container->setParameter(
            'open_orchestra_media_admin.max_width_generation',
            $config['max_width_generation']
        );
        $container->setParameter(
            'open_orchestra_media_admin.max_height_generation',
            $config['max_height_generation']
        );

        foreach ($config['facades'] as $transformer => $facade) {
            $container->setParameter('open_orchestra_media_admin.facade.' . $transformer . '.class', $facade);
        }
        $configurationRoles = array(
            'open_orchestra_backoffice.role.contribution' => array(
                'firstpackage' => array(
                    'folder' => array(
                        ContributionRoleInterface::MEDIA_FOLDER_CONTRIBUTOR => array(
                            'label' => 'open_orchestra_backoffice.role.contributor.label',
                        ),
                        ContributionRoleInterface::MEDIA_FOLDER_SUPER_EDITOR => array(
                            'label' => 'open_orchestra_backoffice.role.editor.label',
                        ),
                        ContributionRoleInterface::MEDIA_FOLDER_SUPER_SUPRESSOR => array(
                            'label' => 'open_orchestra_backoffice.role.supressor.label',
                        ),
                    ),
                    'media' => array(
                        ContributionRoleInterface::MEDIA_CONTRIBUTOR => array(
                            'label' => 'open_orchestra_backoffice.role.contributor.label',
                        ),
                        ContributionRoleInterface::MEDIA_SUPER_EDITOR => array(
                            'label' => 'open_orchestra_backoffice.role.editor.label',
                        ),
                        ContributionRoleInterface::MEDIA_SUPER_SUPRESSOR => array(
                            'label' => 'open_orchestra_backoffice.role.supressor.label',
                        ),
                    ),
                ),
            ),
        );
        if ($container->hasParameter('open_orchestra_backoffice.configuration.roles')) {
            $configurationRoles = array_merge_recursive($container->getParameter('open_orchestra_backoffice.configuration.roles'), $configurationRoles);
        }
        $container->setParameter('open_orchestra_backoffice.configuration.roles', $configurationRoles);

        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );

        $loader->load('transformer.yml');
        $loader->load('subscriber.yml');
        $loader->load('form.yml');
        $loader->load('manager.yml');
        $loader->load('twig.yml');
        $loader->load('generator.yml');
        $loader->load('file_utils.yml');
        $loader->load('file_alternatives.yml');
        $loader->load('media_form.yml');
        $loader->load('event.yml');
        $loader->load('reference.yml');
        $loader->load('voter.yml');
        $loader->load('perimeter.yml');
        $loader->load('generate_perimeter.yml');
        $loader->load('business_rules.yml');
        $loader->load('validator.yml');

        $this->addMediaFieldType($container);
        $this->setFilesParameters($container, $config, $loader);
        $this->updateBlockConfiguration($container);
    }

    /**
     * Merge app conf with bundle conf
     *
     * @param ContainerBuilder $container
     */
    protected function addMediaFieldType(ContainerBuilder $container)
    {
        $fieldTypes = array_merge(
            $container->getParameter('open_orchestra_backoffice.field_types'),
            array(
                'orchestra_media' => array(
                    'label' => 'open_orchestra_media_admin.form.field_type.custom_type.media',
                    'type' => 'oo_media_choice',
                    'deserialize_type' => 'array',
                    'search' => 'text',
                    'default_value' => array(
                        'type' => 'oo_media_choice',
                        'options' => array(
                            'label' => 'open_orchestra_backoffice.form.field_type.default_value',
                            'required' => false,
                        ),
                    ),
                    'options' => array(
                        'required' => array(
                            'default_value' => false,
                        ),
                        'filter' => array(
                            'default_value' => ''
                        )
                    )
                )
            )
        );

        $container->setParameter('open_orchestra_backoffice.field_types', $fieldTypes);

        $mediaTypeFilterChoices = array('' => 'open_orchestra_media_admin.media_filter.none');
        $mediaTypeFilterChoices = array_merge($mediaTypeFilterChoices, $container->getParameter('open_orchestra_media_admin.media_type_filter'));

        $options = array_merge(
            $container->getParameter('open_orchestra_backoffice.options'),
            array(
                'filter' => array(
                    'type' => 'choice',
                    'label' => 'open_orchestra_media_admin.form.field_type.field_option.filter',
                    'required' => false,
                    'choices' => $mediaTypeFilterChoices,
                )
            )
        );

        $container->setParameter('open_orchestra_backoffice.options', $options);
    }

    /**
     * Add the files generation parameters to the container
     * Takes the Open Orchestra alternatives image formats or the application one instead if defined
     *
     * @param ContainerBuilder $container
     * @param array            $config
     * @param YamlFileLoader   $loader
     */
    protected function setFilesParameters(ContainerBuilder $container, array $config, YamlFileLoader $loader)
    {
        $container->setParameter(
            'open_orchestra_media_admin.files.thumbnail_format',
            $config['thumbnail']
        );

        $container->setParameter(
            'open_orchestra_media_admin.files.alternatives.default.thumbnail',
            $config['files']['alternatives']['default']['thumbnail']
        );

        $container->setParameter(
            'open_orchestra_media_admin.files.alternatives.audio.thumbnail',
            $config['files']['alternatives']['audio']['thumbnail']
            );

        if (count($config['files']['alternatives']['image']['formats']) > 0) {
            $container->setParameter(
                'open_orchestra_media_admin.files.alternatives.image.formats',
                $config['files']['alternatives']['image']['formats']
            );
        } else {
            $loader->load('alternatives_formats.yml');
        }
    }

    /**
     * @param ContainerBuilder $container
     */
    protected function updateBlockConfiguration(ContainerBuilder $container)
    {
        $mediaBlockConfiguration = array(
            GalleryStrategy::NAME => array(
                'category' => 'open_orchestra_backoffice.block_configuration.category.media',
                'name'     => 'open_orchestra_media_admin.block.gallery.title',
                'description'     => 'open_orchestra_media_admin.block.gallery.description',
            ),
            SlideshowStrategy::NAME => array(
                'category' => 'open_orchestra_backoffice.block_configuration.category.media',
                'name'     => 'open_orchestra_media_admin.block.slideshow.title',
                'description'     => 'open_orchestra_media_admin.block.slideshow.description',
            ),
            MediaListByKeywordStrategy::NAME => array(
                'category' => 'open_orchestra_backoffice.block_configuration.category.media',
                'name'     => 'open_orchestra_media_admin.block.media_list_by_keyword.title',
                'description'     => 'open_orchestra_media_admin.block.media_list_by_keyword.description',
            ),
            DisplayMediaStrategy::NAME => array(
                'category' => 'open_orchestra_backoffice.block_configuration.category.media',
                'name'     => 'open_orchestra_media_admin.block.display_media.title',
                'description'     => 'open_orchestra_media_admin.block.display_media.description',
            ),
        );

        $blockConfiguration = array();
        if ($container->hasParameter('open_orchestra_backoffice.block_configuration')) {
            $blockConfiguration = $container->getParameter('open_orchestra_backoffice.block_configuration');
        }
        $blockConfiguration = array_merge($blockConfiguration, $mediaBlockConfiguration);
        $container->setParameter('open_orchestra_backoffice.block_configuration', $blockConfiguration);
    }
}