vendor/sulu/article-bundle/DependencyInjection/SuluArticleExtension.php line 36

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Sulu.
  4.  *
  5.  * (c) Sulu GmbH
  6.  *
  7.  * This source file is subject to the MIT license that is bundled
  8.  * with this source code in the file LICENSE.
  9.  */
  10. namespace Sulu\Bundle\ArticleBundle\DependencyInjection;
  11. use Sulu\Bundle\ArticleBundle\Document\ArticleDocument;
  12. use Sulu\Bundle\ArticleBundle\Document\ArticlePageDocument;
  13. use Sulu\Bundle\ArticleBundle\Document\Form\ArticleDocumentType;
  14. use Sulu\Bundle\ArticleBundle\Document\Form\ArticlePageDocumentType;
  15. use Sulu\Bundle\ArticleBundle\Document\Structure\ArticleBridge;
  16. use Sulu\Bundle\ArticleBundle\Document\Structure\ArticlePageBridge;
  17. use Sulu\Bundle\ArticleBundle\Exception\ArticlePageNotFoundException;
  18. use Sulu\Bundle\ArticleBundle\Exception\ParameterNotAllowedException;
  19. use Symfony\Component\Config\FileLocator;
  20. use Symfony\Component\DependencyInjection\ContainerBuilder;
  21. use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
  22. use Symfony\Component\DependencyInjection\Loader;
  23. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  24. /**
  25.  * This is the class that loads and manages article bundle configuration.
  26.  */
  27. class SuluArticleExtension extends Extension implements PrependExtensionInterface
  28. {
  29.     /**
  30.      * {@inheritdoc}
  31.      */
  32.     public function prepend(ContainerBuilder $container)
  33.     {
  34.         if ($container->hasExtension('sulu_core')) {
  35.             $container->prependExtensionConfig(
  36.                 'sulu_core',
  37.                 [
  38.                     'content' => [
  39.                         'structure' => [
  40.                             'paths' => [
  41.                                 'article' => [
  42.                                     'path' => '%kernel.project_dir%/config/templates/articles',
  43.                                     'type' => 'article',
  44.                                 ],
  45.                                 'article_page' => [
  46.                                     'path' => '%kernel.project_dir%/config/templates/articles',
  47.                                     'type' => 'article_page',
  48.                                 ],
  49.                             ],
  50.                             'type_map' => [
  51.                                 'article' => ArticleBridge::class,
  52.                                 'article_page' => ArticlePageBridge::class,
  53.                             ],
  54.                         ],
  55.                     ],
  56.                 ]
  57.             );
  58.         }
  59.         if ($container->hasExtension('sulu_route')) {
  60.             $container->prependExtensionConfig(
  61.                 'sulu_route',
  62.                 [
  63.                     'mappings' => [
  64.                         'Sulu\Bundle\ArticleBundle\Document\ArticleDocument' => [
  65.                             'resource_key' => 'articles',
  66.                         ],
  67.                         'Sulu\Bundle\ArticleBundle\Document\ArticlePageDocument' => [
  68.                             'resource_key' => 'article_pages',
  69.                         ],
  70.                     ],
  71.                 ]
  72.             );
  73.         }
  74.         if ($container->hasExtension('jms_serializer')) {
  75.             $container->prependExtensionConfig(
  76.                 'jms_serializer',
  77.                 [
  78.                     'metadata' => [
  79.                         'directories' => [
  80.                             'sulu_article' => [
  81.                                 'path' => __DIR__ '/../Resources/config/serializer',
  82.                                 'namespace_prefix' => 'Sulu\Bundle\ArticleBundle',
  83.                             ],
  84.                         ],
  85.                     ],
  86.                 ]
  87.             );
  88.         }
  89.         if ($container->hasExtension('sulu_search')) {
  90.             $container->prependExtensionConfig(
  91.                 'sulu_page',
  92.                 [
  93.                     'search' => [
  94.                         'mapping' => [
  95.                             ArticleDocument::class => ['index' => 'article''decorate_index' => true],
  96.                             ArticlePageDocument::class => ['index' => 'article_page'],
  97.                         ],
  98.                     ],
  99.                 ]
  100.             );
  101.         }
  102.         if ($container->hasExtension('sulu_document_manager')) {
  103.             $container->prependExtensionConfig(
  104.                 'sulu_document_manager',
  105.                 [
  106.                     'mapping' => [
  107.                         'article' => [
  108.                             'class' => ArticleDocument::class,
  109.                             'phpcr_type' => 'sulu:article',
  110.                             'form_type' => ArticleDocumentType::class,
  111.                         ],
  112.                         'article_page' => [
  113.                             'class' => ArticlePageDocument::class,
  114.                             'phpcr_type' => 'sulu:articlepage',
  115.                             'form_type' => ArticlePageDocumentType::class,
  116.                         ],
  117.                     ],
  118.                     'path_segments' => [
  119.                         'articles' => 'articles',
  120.                     ],
  121.                 ]
  122.             );
  123.         }
  124.         if ($container->hasExtension('fos_js_routing')) {
  125.             $container->prependExtensionConfig(
  126.                 'fos_js_routing',
  127.                 [
  128.                     'routes_to_expose' => [
  129.                         'sulu_article.post_article_version_trigger',
  130.                     ],
  131.                 ]
  132.             );
  133.         }
  134.         if ($container->hasExtension('fos_rest')) {
  135.             $container->prependExtensionConfig(
  136.                 'fos_rest',
  137.                 [
  138.                     'exception' => [
  139.                         'codes' => [
  140.                             ParameterNotAllowedException::class => 400,
  141.                             ArticlePageNotFoundException::class => 404,
  142.                         ],
  143.                     ],
  144.                 ]
  145.             );
  146.         }
  147.         if ($container->hasExtension('massive_build')) {
  148.             $container->prependExtensionConfig(
  149.                 'massive_build',
  150.                 [
  151.                     'targets' => [
  152.                         'prod' => [
  153.                             'dependencies' => [
  154.                                 'article_index' => [],
  155.                             ],
  156.                         ],
  157.                         'dev' => [
  158.                             'dependencies' => [
  159.                                 'article_index' => [],
  160.                             ],
  161.                         ],
  162.                         'maintain' => [
  163.                             'dependencies' => [
  164.                                 'article_index' => [],
  165.                             ],
  166.                         ],
  167.                     ],
  168.                 ]
  169.             );
  170.         }
  171.         if ($container->hasExtension('sulu_admin')) {
  172.             $container->prependExtensionConfig(
  173.                 'sulu_admin',
  174.                 [
  175.                     'lists' => [
  176.                         'directories' => [
  177.                             __DIR__ '/../Resources/config/lists',
  178.                         ],
  179.                     ],
  180.                     'forms' => [
  181.                         'directories' => [
  182.                             __DIR__ '/../Resources/config/forms',
  183.                         ],
  184.                     ],
  185.                     'resources' => [
  186.                         'articles' => [
  187.                             'routes' => [
  188.                                 'list' => 'sulu_article.get_articles',
  189.                                 'detail' => 'sulu_article.get_article',
  190.                             ],
  191.                         ],
  192.                         'article_versions' => [
  193.                             'routes' => [
  194.                                 'list' => 'sulu_article.get_article_versions',
  195.                                 'detail' => 'sulu_article.post_article_version_trigger',
  196.                             ],
  197.                         ],
  198.                     ],
  199.                     'field_type_options' => [
  200.                         'selection' => [
  201.                             'article_selection' => [
  202.                                 'default_type' => 'list_overlay',
  203.                                 'resource_key' => 'articles',
  204.                                 'types' => [
  205.                                     'list_overlay' => [
  206.                                         'adapter' => 'table',
  207.                                         'list_key' => 'articles',
  208.                                         'display_properties' => ['title''routePath'],
  209.                                         'icon' => 'su-newspaper',
  210.                                         'label' => 'sulu_article.selection_label',
  211.                                         'overlay_title' => 'sulu_article.selection_overlay_title',
  212.                                     ],
  213.                                 ],
  214.                             ],
  215.                         ],
  216.                         'single_selection' => [
  217.                             'single_article_selection' => [
  218.                                 'default_type' => 'list_overlay',
  219.                                 'resource_key' => 'articles',
  220.                                 'types' => [
  221.                                     'list_overlay' => [
  222.                                         'adapter' => 'table',
  223.                                         'list_key' => 'articles',
  224.                                         'display_properties' => ['title'],
  225.                                         'empty_text' => 'sulu_article.no_article_selected',
  226.                                         'icon' => 'su-newspaper',
  227.                                         'overlay_title' => 'sulu_article.single_selection_overlay_title',
  228.                                     ],
  229.                                 ],
  230.                             ],
  231.                         ],
  232.                     ],
  233.                 ]
  234.             );
  235.         }
  236.         if ($container->hasExtension('ongr_elasticsearch')) {
  237.             $configs $container->getExtensionConfig($this->getAlias());
  238.             $config $this->processConfiguration(new Configuration(), $configs);
  239.             $indexName $config['index_name'];
  240.             $hosts $config['hosts'];
  241.             $ongrElasticSearchConfig = [
  242.                 'managers' => [
  243.                     'default' => [
  244.                         'index' => [
  245.                             'index_name' => $indexName,
  246.                         ],
  247.                         'mappings' => ['SuluArticleBundle'],
  248.                     ],
  249.                     'live' => [
  250.                         'index' => [
  251.                             'index_name' => $indexName '_live',
  252.                         ],
  253.                         'mappings' => ['SuluArticleBundle'],
  254.                     ],
  255.                 ],
  256.             ];
  257.             if (count($hosts) > 0) {
  258.                 $ongrElasticSearchConfig['managers']['default']['index']['hosts'] = $hosts;
  259.                 $ongrElasticSearchConfig['managers']['live']['index']['hosts'] = $hosts;
  260.             }
  261.             $container->prependExtensionConfig(
  262.                 'ongr_elasticsearch',
  263.                 $ongrElasticSearchConfig
  264.             );
  265.         }
  266.     }
  267.     /**
  268.      * {@inheritdoc}
  269.      */
  270.     public function load(array $configsContainerBuilder $container)
  271.     {
  272.         $configuration = new Configuration();
  273.         $config $this->processConfiguration($configuration$configs);
  274.         $container->setParameter('sulu_article.default_main_webspace'$config['default_main_webspace']);
  275.         $container->setParameter('sulu_article.default_additional_webspaces'$config['default_additional_webspaces']);
  276.         $container->setParameter('sulu_article.types'$config['types']);
  277.         $container->setParameter('sulu_article.documents'$config['documents']);
  278.         $container->setParameter('sulu_article.view_document.article.class'$config['documents']['article']['view']);
  279.         $container->setParameter('sulu_article.display_tab_all'$config['display_tab_all']);
  280.         $container->setParameter('sulu_article.smart_content.default_limit'$config['smart_content']['default_limit']);
  281.         $container->setParameter('sulu_article.search_fields'$config['search_fields']);
  282.         $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ '/../Resources/config'));
  283.         $loader->load('services.xml');
  284.         $bundles $container->getParameter('kernel.bundles');
  285.         if (array_key_exists('SuluAutomationBundle'$bundles)) {
  286.             $loader->load('automation.xml');
  287.         }
  288.         $this->appendDefaultAuthor($config$container);
  289.         $this->appendArticlePageConfig($container);
  290.         $articleDocument ArticleDocument::class;
  291.         $articlePageDocument ArticlePageDocument::class;
  292.         foreach ($container->getParameter('sulu_document_manager.mapping') as $mapping) {
  293.             if ('article' == $mapping['alias']) {
  294.                 $articleDocument $mapping['class'];
  295.             }
  296.             if ('article_page' == $mapping['alias']) {
  297.                 $articlePageDocument $mapping['class'];
  298.             }
  299.         }
  300.         $container->setParameter('sulu_article.article_document.class'$articleDocument);
  301.         $container->setParameter('sulu_article.article_page_document.class'$articlePageDocument);
  302.     }
  303.     /**
  304.      * Append configuration for article "set_default_author".
  305.      */
  306.     private function appendDefaultAuthor(array $configContainerBuilder $container): void
  307.     {
  308.         $mapping $container->getParameter('sulu_document_manager.mapping');
  309.         foreach ($mapping as $key => $item) {
  310.             if ('article' === $item['alias']) {
  311.                 $mapping[$key]['set_default_author'] = $config['default_author'];
  312.             }
  313.         }
  314.         $container->setParameter('sulu_document_manager.mapping'$mapping);
  315.         $container->setParameter('sulu_article.default_author'$config['default_author']);
  316.     }
  317.     /**
  318.      * Append configuration for article-page (cloned from article).
  319.      */
  320.     private function appendArticlePageConfig(ContainerBuilder $container): void
  321.     {
  322.         $paths $container->getParameter('sulu.content.structure.paths');
  323.         $paths['article_page'] = $this->cloneArticleConfig($paths['article'], 'article_page');
  324.         $container->setParameter('sulu.content.structure.paths'$paths);
  325.         $defaultTypes $container->getParameter('sulu.content.structure.default_types');
  326.         if (isset($defaultTypes['article'])) {
  327.             $defaultTypes['article_page'] = $defaultTypes['article'];
  328.             $container->setParameter('sulu.content.structure.default_types'$defaultTypes);
  329.         }
  330.     }
  331.     /**
  332.      * Clone given path configuration and use given type.
  333.      */
  334.     private function cloneArticleConfig(array $configstring $type): array
  335.     {
  336.         $result = [];
  337.         foreach ($config as $item) {
  338.             $result[] = ['path' => $item['path'], 'type' => $type];
  339.         }
  340.         return $result;
  341.     }
  342. }