Actualización

This commit is contained in:
Xes
2025-04-10 12:24:57 +02:00
parent 8969cc929d
commit 45420b6f0d
39760 changed files with 4303286 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\CoreBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
/**
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
*/
class AdapterCompilerPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
if (!$container->has('sonata.core.model.adapter.chain')) {
return;
}
$definition = $container->findDefinition('sonata.core.model.adapter.chain');
if ($container->has('doctrine')) {
$definition->addMethodCall('addAdapter', array(new Reference('sonata.core.model.adapter.doctrine_orm')));
} else {
$container->removeDefinition('sonata.core.model.adapter.doctrine_orm');
}
if ($container->has('doctrine_phpcr')) {
$definition->addMethodCall('addAdapter', array(new Reference('sonata.core.model.adapter.doctrine_phpcr')));
} else {
$container->removeDefinition('sonata.core.model.adapter.doctrine_phpcr');
}
}
}

View File

@@ -0,0 +1,56 @@
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\CoreBundle\DependencyInjection\Compiler;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FormFactoryCompilerPass extends FormPass
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
$typeIdx = array();
foreach ($container->findTaggedServiceIds('form.type') as $id => $tags) {
$typeIdx[] = $id;
}
$typeExtensionIdx = array();
foreach ($container->findTaggedServiceIds('form.type_extension') as $id => $tag) {
$typeExtensionIdx[] = $id;
}
$container->setParameter('sonata.core.form.types', $typeIdx);
$container->setParameter('sonata.core.form.type_extensions', $typeExtensionIdx);
// nothing to do
if (!$container->hasDefinition('sonata.core.form.extension.dependency')) {
return;
}
// get factories
$original = $container->getDefinition('form.extension');
parent::process($container);
$factory = $container->getDefinition('sonata.core.form.extension.dependency');
$factory->replaceArgument(1, $original->getArgument(1));
$factory->replaceArgument(2, $original->getArgument(2));
$factory->replaceArgument(3, $original->getArgument(3));
$container->removeDefinition('form.extension');
$container->removeDefinition('sonata.core.form.extension.dependency');
$container->setDefinition('form.extension', $factory);
}
}

View File

@@ -0,0 +1,35 @@
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\CoreBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
/**
* @author Hugo Briand <briand@ekino.com>
*/
class StatusRendererCompilerPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
foreach ($container->findTaggedServiceIds('sonata.status.renderer') as $id => $attributes) {
$container
->getDefinition('sonata.core.twig.status_extension')
->addMethodCall('addStatusService', array(new Reference($id)))
;
}
}
}

View File

@@ -0,0 +1,134 @@
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\CoreBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* This is the class that validates and merges configuration from your app/config files.
*
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
* @author Alexander <iam.asm89@gmail.com>
*/
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('sonata_core');
$this->addFlashMessageSection($rootNode);
$this->addSerializerFormats($rootNode);
$rootNode
->children()
->arrayNode('form')
->addDefaultsIfNotSet()
->children()
->arrayNode('mapping')
->addDefaultsIfNotSet()
->children()
->booleanNode('enabled')
->defaultValue(true)
->end()
->arrayNode('type')
->useAttributeAsKey('id')
->defaultValue(array())
->prototype('scalar')->end()
->end()
->arrayNode('extension')
->useAttributeAsKey('id')
->defaultValue(array())
->prototype('array')
->prototype('scalar')->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
;
return $treeBuilder;
}
/**
* Returns configuration for flash messages.
*
* @param ArrayNodeDefinition $node
*/
private function addFlashMessageSection(ArrayNodeDefinition $node)
{
$node
->children()
->scalarNode('form_type')
->defaultValue('standard')
->validate()
->ifNotInArray($validFormTypes = array('standard', 'horizontal'))
->thenInvalid(sprintf(
'The form_type option value must be one of %s',
$validFormTypesString = implode(', ', $validFormTypes)
))
->end()
->info(sprintf('Must be one of %s', $validFormTypesString))
->end()
->arrayNode('flashmessage')
->useAttributeAsKey('message')
->prototype('array')
->children()
->scalarNode('css_class')->end()
->arrayNode('types')
->useAttributeAsKey('type')
->prototype('array')
->children()
->scalarNode('domain')->defaultValue('SonataCoreBundle')->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
;
}
/**
* Returns configuration for serializer formats.
*
* @param ArrayNodeDefinition $node
*/
private function addSerializerFormats(ArrayNodeDefinition $node)
{
// NEXT_MAJOR : do not execute this if jms/serializer is missing
$node
->children()
->arrayNode('serializer')
->addDefaultsIfNotSet()
->children()
->arrayNode('formats')
->prototype('scalar')->end()
->defaultValue(array('json', 'xml', 'yml'))
->info('Default serializer formats, will be used while getting subscribing methods.')
->end()
->end()
->end()
->end()
;
}
}

View File

@@ -0,0 +1,197 @@
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\CoreBundle\DependencyInjection;
use Sonata\CoreBundle\Form\FormHelper;
use Sonata\CoreBundle\Serializer\BaseSerializerHandler;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\HttpKernel\Kernel;
/**
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
*/
class SonataCoreExtension extends Extension implements PrependExtensionInterface
{
/**
* {@inheritdoc}
*/
public function prepend(ContainerBuilder $container)
{
$configs = $container->getExtensionConfig('sonata_admin');
foreach ($configs as $config) {
if (isset($config['options']['form_type'])) {
$container->prependExtensionConfig(
$this->getAlias(),
array('form_type' => $config['options']['form_type'])
);
}
}
}
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$processor = new Processor();
$configuration = new Configuration();
// NEXT_MAJOR : remove this if block
if (!interface_exists('JMS\Serializer\Handler\SubscribingHandlerInterface')) {
/* Let's check for config values before the configuration is processed,
* otherwise we won't be able to tell,
* since there is a default value for this option. */
foreach ($configs as $config) {
if (isset($config['serializer'])) {
@trigger_error(<<<'EOT'
Setting the sonata_core -> serializer -> formats option
without having the jms/serializer library installed is deprecated since 3.1,
and will not be supported in 4.0,
because the configuration option will not be added in that case.
EOT
, E_USER_DEPRECATED);
}
}
}
$config = $processor->processConfiguration($configuration, $configs);
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('date.xml');
$loader->load('flash.xml');
$loader->load('form_types.xml');
$loader->load('validator.xml');
$loader->load('twig.xml');
$loader->load('model_adapter.xml');
$loader->load('core.xml');
$this->registerFlashTypes($container, $config);
$container->setParameter('sonata.core.form_type', $config['form_type']);
$this->configureFormFactory($container, $config);
if (\PHP_VERSION_ID < 70000) {
$this->configureClassesToCompile();
}
$this->deprecateSlugify($container);
$this->configureSerializerFormats($config);
}
public function configureClassesToCompile()
{
$this->addClassesToCompile(array(
'Sonata\\CoreBundle\\Form\\Type\\BooleanType',
'Sonata\\CoreBundle\\Form\\Type\\CollectionType',
'Sonata\\CoreBundle\\Form\\Type\\DateRangeType',
'Sonata\\CoreBundle\\Form\\Type\\DateTimeRangeType',
'Sonata\\CoreBundle\\Form\\Type\\EqualType',
'Sonata\\CoreBundle\\Form\\Type\\ImmutableArrayType',
'Sonata\\CoreBundle\\Form\\Type\\TranslatableChoiceType',
));
}
/**
* @param ContainerBuilder $container
* @param array $config
*/
public function configureFormFactory(ContainerBuilder $container, array $config)
{
if (!$config['form']['mapping']['enabled'] || version_compare(Kernel::VERSION, '2.8', '<')) {
$container->removeDefinition('sonata.core.form.extension.dependency');
return;
}
$container->setParameter('sonata.core.form.mapping.type', $config['form']['mapping']['type']);
$container->setParameter('sonata.core.form.mapping.extension', $config['form']['mapping']['extension']);
FormHelper::registerFormTypeMapping($config['form']['mapping']['type']);
foreach ($config['form']['mapping']['extension'] as $ext => $idx) {
FormHelper::registerFormExtensionMapping($ext, $idx);
}
$definition = $container->getDefinition('sonata.core.form.extension.dependency');
$definition->replaceArgument(4, FormHelper::getFormTypeMapping());
$definition = $container->getDefinition('sonata.core.form.extension.dependency');
$definition->replaceArgument(5, FormHelper::getFormExtensionMapping());
}
/**
* Registers flash message types defined in configuration to flash manager.
*
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
* @param array $config
*/
public function registerFlashTypes(ContainerBuilder $container, array $config)
{
$mergedConfig = array_merge_recursive($config['flashmessage'], array(
'success' => array('types' => array(
'success' => array('domain' => 'SonataCoreBundle'),
'sonata_flash_success' => array('domain' => 'SonataAdminBundle'),
'sonata_user_success' => array('domain' => 'SonataUserBundle'),
'fos_user_success' => array('domain' => 'FOSUserBundle'),
)),
'warning' => array('types' => array(
'warning' => array('domain' => 'SonataCoreBundle'),
'sonata_flash_info' => array('domain' => 'SonataAdminBundle'),
)),
'danger' => array('types' => array(
'error' => array('domain' => 'SonataCoreBundle'),
'sonata_flash_error' => array('domain' => 'SonataAdminBundle'),
'sonata_user_error' => array('domain' => 'SonataUserBundle'),
)),
));
$types = $cssClasses = array();
foreach ($mergedConfig as $typeKey => $typeConfig) {
$types[$typeKey] = $typeConfig['types'];
$cssClasses[$typeKey] = array_key_exists('css_class', $typeConfig) ? $typeConfig['css_class'] : $typeKey;
}
$identifier = 'sonata.core.flashmessage.manager';
$definition = $container->getDefinition($identifier);
$definition->replaceArgument(2, $types);
$definition->replaceArgument(3, $cssClasses);
$container->setDefinition($identifier, $definition);
}
/**
* @param array $config
*/
public function configureSerializerFormats($config)
{
if (interface_exists('JMS\Serializer\Handler\SubscribingHandlerInterface')) {
BaseSerializerHandler::setFormats($config['serializer']['formats']);
}
}
protected function deprecateSlugify(ContainerBuilder $container)
{
$definition = $container->getDefinition('sonata.core.slugify.cocur');
if (method_exists($definition, 'setDeprecated')) {
$definition->setDeprecated(true);
$definition = $container->getDefinition('sonata.core.slugify.native');
$definition->setDeprecated(true);
}
}
}