diff --git a/UPGRADE-3.x.md b/UPGRADE-3.x.md index 8ba09e0efaa..cc245eeed90 100644 --- a/UPGRADE-3.x.md +++ b/UPGRADE-3.x.md @@ -4,12 +4,30 @@ UPGRADE 3.x UPGRADE FROM 3.xx to 3.xx ========================= +### Deprecated `admin_pool` parameter in `sonata.admin.dashboard.top` and `onata.admin.dashboard.bottom` block events. + +This parameter will be removed in 4.0. If you are using it, you SHOULD inject `Pool` service instead. + +### Deprecated global Twig `sonata_admin` variable + +This variable has been deprecated in favor of `sonata_configuration` variable. + +### Sonata\AdminBundle\Twig\GlobalVariables + +This class has been deprecated without replacement. + ### Sonata\AdminBundle\Admin\Pool - Passing a `Symfony\Component\PropertyAccess\PropertyAccessorInterface` instance as 4 argument instantiating `Sonata\AdminBundle\Admin\Pool` is deprecated. - `Sonata\AdminBundle\Admin\Pool::getPropertyAccessor()` method has been deprecated. You SHOULD inject `Symfony\Component\PropertyAccess\PropertyAccessorInterface` where is needed. +- `Sonata\AdminBundle\Admin\Pool::getTitle()` method has been deprecated. +Use `Sonata\AdminBundle\Admin\SonataConfiguration::getTitle()` instead. +- `Sonata\AdminBundle\Admin\Pool::getTitleLogo()` method has been deprecated. +Use `Sonata\AdminBundle\Admin\SonataConfiguration::getLogo()` instead. +- `Sonata\AdminBundle\Admin\Pool::getOption()` method has been deprecated. +Use `Sonata\AdminBundle\Admin\SonataConfiguration::getOption()` instead. ### Sonata\AdminBundle\Action\SetObjectFieldValueAction diff --git a/src/Admin/Pool.php b/src/Admin/Pool.php index 494338bb1fa..eb98289d932 100644 --- a/src/Admin/Pool.php +++ b/src/Admin/Pool.php @@ -60,16 +60,28 @@ class Pool protected $assets = []; /** + * NEXT_MAJOR: Remove this property. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @var string */ protected $title; /** + * NEXT_MAJOR: Remove this property. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @var string */ protected $titleLogo; /** + * NEXT_MAJOR: Remove this property. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @var array */ protected $options = []; @@ -92,6 +104,7 @@ class Pool /** * NEXT_MAJOR: Remove $propertyAccessor argument. + * NEXT_MAJOR: Remove $title, $logoTitle and $options. * * @param string $title * @param string $logoTitle @@ -532,22 +545,48 @@ public function getTemplate($name) } /** + * NEXT_MAJOR: Remove this method. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @return string */ public function getTitleLogo() { + @trigger_error(sprintf( + 'The "%s" method is deprecated since version 3.x and will be removed in 4.0.' + .' Use "%s::getTitle()" instead.', + SonataConfiguration::class, + __METHOD__ + ), E_USER_DEPRECATED); + return $this->titleLogo; } /** + * NEXT_MAJOR: Remove this method. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @return string */ public function getTitle() { + @trigger_error(sprintf( + 'The "%s" method is deprecated since version 3.x and will be removed in 4.0.' + .' Use "%s::getLogo()" instead.', + SonataConfiguration::class, + __METHOD__ + ), E_USER_DEPRECATED); + return $this->title; } /** + * NEXT_MAJOR: Remove this method. + * + * @deprecated since sonata-project/admin-bundle 3.x, will be dropped in 4.0. + * * @param string $name * @param mixed $default * @@ -555,6 +594,13 @@ public function getTitle() */ public function getOption($name, $default = null) { + @trigger_error(sprintf( + 'The "%s" method is deprecated since version 3.x and will be removed in 4.0.' + .' Use "%s::getOption()" instead.', + SonataConfiguration::class, + __METHOD__ + ), E_USER_DEPRECATED); + if (isset($this->options[$name])) { return $this->options[$name]; } diff --git a/src/Admin/SonataConfiguration.php b/src/Admin/SonataConfiguration.php new file mode 100644 index 00000000000..f610ccdc475 --- /dev/null +++ b/src/Admin/SonataConfiguration.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Sonata\AdminBundle\Admin; + +final class SonataConfiguration +{ + /** + * @var string + */ + private $title; + + /** + * @var string + */ + private $logo; + + /** + * @var array + * @phpstan-param array{ + * html5_validate: bool, + * sort_admins: bool, + * confirm_exit: bool, + * js_debug: bool, + * skin: string, + * use_select2: bool, + * use_icheck: bool, + * use_bootlint: bool, + * use_stickyforms: bool, + * pager_links: ?int, + * form_type: string, + * default_group: string, + * default_label_catalogue: string, + * default_icon: string, + * dropdown_number_groups_per_colums: int, + * title_mode: 'single_text'|'single_image'|'both', + * lock_protection: bool, + * mosaic_background: string, + * lock_protection: bool, + * legacy_twig_text_extension: bool, + * } $options + */ + private $options; + + /** + * @phpstan-param array{ + * html5_validate: bool, + * sort_admins: bool, + * confirm_exit: bool, + * js_debug: bool, + * skin: string, + * use_select2: bool, + * use_icheck: bool, + * use_bootlint: bool, + * use_stickyforms: bool, + * pager_links: ?int, + * form_type: string, + * default_group: string, + * default_label_catalogue: string, + * default_icon: string, + * dropdown_number_groups_per_colums: int, + * title_mode: 'single_text'|'single_image'|'both', + * lock_protection: bool, + * mosaic_background: string, + * lock_protection: bool, + * legacy_twig_text_extension: bool, + * } $options + */ + public function __construct(string $title, string $logo, array $options) + { + $this->title = $title; + $this->logo = $logo; + $this->options = $options; + } + + public function getTitle(): string + { + return $this->title; + } + + public function getLogo(): string + { + return $this->logo; + } + + /** + * @param mixed $default + * + * @return mixed + */ + public function getOption(string $name, $default = null) + { + return $this->options[$name] ?? $default; + } +} diff --git a/src/DependencyInjection/Compiler/GlobalVariablesCompilerPass.php b/src/DependencyInjection/Compiler/GlobalVariablesCompilerPass.php index a7b95f004f8..b105173f345 100644 --- a/src/DependencyInjection/Compiler/GlobalVariablesCompilerPass.php +++ b/src/DependencyInjection/Compiler/GlobalVariablesCompilerPass.php @@ -27,6 +27,8 @@ class GlobalVariablesCompilerPass implements CompilerPassInterface public function process(ContainerBuilder $container) { $container->getDefinition('twig') + ->addMethodCall('addGlobal', ['sonata_configuration', new Reference('sonata.admin.configuration')]) + // NEXT_MAJOR: Remove next line. ->addMethodCall('addGlobal', ['sonata_admin', new Reference('sonata.admin.twig.global')]); } } diff --git a/src/DependencyInjection/SonataAdminExtension.php b/src/DependencyInjection/SonataAdminExtension.php index 74df9bea46e..0efb42fd31c 100644 --- a/src/DependencyInjection/SonataAdminExtension.php +++ b/src/DependencyInjection/SonataAdminExtension.php @@ -92,11 +92,17 @@ public function load(array $configs, ContainerBuilder $container) $config['options']['role_super_admin'] = $config['security']['role_super_admin']; $config['options']['search'] = $config['search']; + // NEXT_MAJOR: Remove this Pool configuration. $pool = $container->getDefinition('sonata.admin.pool'); $pool->replaceArgument(1, $config['title']); $pool->replaceArgument(2, $config['title_logo']); $pool->replaceArgument(3, $config['options']); + $sonataConfiguration = $container->getDefinition('sonata.admin.configuration'); + $sonataConfiguration->replaceArgument(0, $config['title']); + $sonataConfiguration->replaceArgument(1, $config['title_logo']); + $sonataConfiguration->replaceArgument(2, $config['options']); + if (false === $config['options']['lock_protection']) { $container->removeDefinition('sonata.admin.lock.extension'); } diff --git a/src/Resources/config/core.php b/src/Resources/config/core.php index b1d6878ac0e..1e69428dad5 100644 --- a/src/Resources/config/core.php +++ b/src/Resources/config/core.php @@ -16,6 +16,7 @@ use Sonata\AdminBundle\Admin\BreadcrumbsBuilderInterface; use Sonata\AdminBundle\Admin\Extension\LockExtension; use Sonata\AdminBundle\Admin\Pool; +use Sonata\AdminBundle\Admin\SonataConfiguration; use Sonata\AdminBundle\Controller\HelperController; use Sonata\AdminBundle\Event\AdminEventExtension; use Sonata\AdminBundle\Export\Exporter; @@ -61,6 +62,15 @@ ->alias(Pool::class, 'sonata.admin.pool') + ->set('sonata.admin.configuration', SonataConfiguration::class) + ->args([ + '', + '', + [], + ]) + + ->alias(SonataConfiguration::class, 'sonata.admin.configuration') + ->set('sonata.admin.route_loader', AdminPoolLoader::class) ->public() ->tag('routing.loader') @@ -213,6 +223,7 @@ ->public() ->tag('sonata.admin.extension', ['global' => true]) + // NEXT_MAJOR: Remove this service definition and alias. ->set('sonata.admin.twig.global', GlobalVariables::class) ->public() ->args([ diff --git a/src/Resources/config/twig.php b/src/Resources/config/twig.php index 277880b32e0..cf51aaf84ae 100644 --- a/src/Resources/config/twig.php +++ b/src/Resources/config/twig.php @@ -11,6 +11,7 @@ * file that was distributed with this source code. */ +use Sonata\AdminBundle\Twig\Extension\GroupExtension; use Sonata\AdminBundle\Twig\Extension\PaginationExtension; use Sonata\AdminBundle\Twig\Extension\SonataAdminExtension; use Sonata\AdminBundle\Twig\Extension\TemplateRegistryExtension; @@ -65,6 +66,12 @@ new ReferenceConfigurator('service_container'), ]) + ->set('sonata.admin.group.extension', GroupExtension::class) + ->tag('twig.extension') + ->args([ + new ReferenceConfigurator('sonata.admin.pool'), + ]) + // NEXT_MAJOR: Remove this service. ->set('sonata.pagination.twig.extension', PaginationExtension::class) ->tag('twig.extension') diff --git a/src/Resources/views/Block/block_admin_list.html.twig b/src/Resources/views/Block/block_admin_list.html.twig index 59a06c2da58..6da3554be4f 100644 --- a/src/Resources/views/Block/block_admin_list.html.twig +++ b/src/Resources/views/Block/block_admin_list.html.twig @@ -13,7 +13,7 @@ file that was distributed with this source code. {% block block %} {% for group in groups %} - {% set display = group.roles is empty or is_granted(sonata_admin.adminPool.getOption('role_super_admin')) or group.roles|filter(role => is_granted(role))|length > 0 %} + {% set display = group.roles is empty or is_granted(sonata_configuration.getOption('role_super_admin')) or group.roles|filter(role => is_granted(role))|length > 0 %} {% if display %}