Skip to content

Commit f3a73e8

Browse files
authored
Merge pull request #2 from Jibbarth/feature/easy-admin-bridge
Feature/easy admin bridge
2 parents 5a5a933 + 660c696 commit f3a73e8

File tree

9 files changed

+176
-43
lines changed

9 files changed

+176
-43
lines changed

composer.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,8 @@
3737
"branch-alias": {
3838
"dev-master": "1.0-dev"
3939
}
40+
},
41+
"suggest": {
42+
"easycorp/easyadmin-bundle": "Embed Config forms directly in EasyAdminBundle"
4043
}
4144
}

src/Controller/DefaultController.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Barth\SimpleConfigBundle\Controller;
44

5+
use Barth\SimpleConfigBundle\NameConverter\SnakeCaseToCamelCaseNameConverter;
56
use Barth\SimpleConfigBundle\Service\ConfigService;
67
use Barth\SimpleConfigBundle\Service\ExtensionConfigurationService;
78
use Barth\SimpleConfigBundle\Service\ExtensionLocatorService;
@@ -28,15 +29,21 @@ class DefaultController extends Controller
2829
* @var ExtensionConfigurationService
2930
*/
3031
private $extensionConfigurationService;
32+
/**
33+
* @var string
34+
*/
35+
private $defaultAdminBundle;
3136

3237
public function __construct(
3338
ConfigService $configService,
3439
ExtensionLocatorService $extensionLocatorService,
35-
ExtensionConfigurationService $extensionConfigurationService
40+
ExtensionConfigurationService $extensionConfigurationService,
41+
string $defaultAdminBundle = null
3642
) {
3743
$this->configService = $configService;
3844
$this->extensionLocatorService = $extensionLocatorService;
3945
$this->extensionConfigurationService = $extensionConfigurationService;
46+
$this->defaultAdminBundle = $defaultAdminBundle;
4047
}
4148

4249
/**
@@ -51,6 +58,7 @@ public function indexAction()
5158

5259
return $this->render('@BarthSimpleConfig/list.html.twig', [
5360
'bundles' => $availableBundles,
61+
'parent_template' => $this->getParentTemplate(),
5462
]);
5563
}
5664

@@ -77,18 +85,21 @@ public function editAction(
7785

7886
$this->configService->saveNewConfig($package, $data);
7987
if ($this->configService->isOverrideConfigForPackageExist($package)) {
88+
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
8089
$this->get('session')->getFlashBag()->add(
8190
'success',
82-
'Successfully registered config for ' . $package
91+
'Successfully registered config for ' . $nameConverter->handle($package)
8392
);
8493
}
8594

8695
return $this->redirect($this->generateUrl('barth_simpleconfig_index'));
8796
}
8897

98+
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
8999
return $this->render('@BarthSimpleConfig/form.html.twig', [
90100
'config_form' => $form->createView(),
91-
'extension' => $extension->getAlias(),
101+
'extension' => $nameConverter->handle($extension->getAlias()),
102+
'parent_template' => $this->getParentTemplate(),
92103
]);
93104
}
94105

@@ -102,4 +113,14 @@ protected function cleanData(array $data): array
102113

103114
return $data;
104115
}
116+
117+
protected function getParentTemplate()
118+
{
119+
switch ($this->defaultAdminBundle) {
120+
case 'easy_admin':
121+
return '@EasyAdmin/default/layout.html.twig';
122+
default:
123+
return '@BarthSimpleConfig/base.html.twig';
124+
}
125+
}
105126
}

src/DependencyInjection/BarthSimpleConfigExtension.php

Lines changed: 88 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@
22

33
namespace Barth\SimpleConfigBundle\DependencyInjection;
44

5+
use Barth\SimpleConfigBundle\Controller\DefaultController;
6+
use Barth\SimpleConfigBundle\NameConverter\SnakeCaseToCamelCaseNameConverter;
57
use Barth\SimpleConfigBundle\Service\ConfigService;
68
use Barth\SimpleConfigBundle\Service\ExtensionLocatorService;
79
use Symfony\Component\Config\FileLocator;
10+
use Symfony\Component\Config\Loader\DelegatingLoader;
11+
use Symfony\Component\Config\Loader\LoaderResolver;
812
use Symfony\Component\DependencyInjection\ContainerBuilder;
13+
use Symfony\Component\DependencyInjection\ContainerInterface;
14+
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
15+
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
16+
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
17+
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
918
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
1019
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
1120

12-
class BarthSimpleConfigExtension extends Extension
21+
class BarthSimpleConfigExtension extends Extension implements PrependExtensionInterface
1322
{
1423
/**
1524
* {@inheritdoc}
@@ -22,33 +31,94 @@ public function load(array $configs, ContainerBuilder $container)
2231
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
2332
$loader->load('services.yml');
2433

25-
$container->getDefinition(ConfigService::class)->setArgument(1, $config['override_package_directory']);
34+
$container->getDefinition(ConfigService::class)->setArgument('$overrideDir', $config['override_package_directory']);
35+
$bundles = $container->getParameter('kernel.bundles');
36+
if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
37+
$container->getDefinition(DefaultController::class)->setArgument('$defaultAdminBundle', 'easy_admin');
38+
}
39+
2640
if (true === $config['enable_blacklist']) {
41+
$this->blacklistedBundles = $config['blacklisted_bundles'];
2742
$container
2843
->getDefinition(ExtensionLocatorService::class)
2944
->setArgument(1, $config['blacklisted_bundles']);
3045
}
3146
}
3247

3348
/**
49+
* @param ContainerBuilder $container
50+
*/
51+
public function prepend(ContainerBuilder $container)
52+
{
53+
$bundles = $container->getParameter('kernel.bundles');
54+
55+
$this->loadOverrideConfig($container);
56+
$config = $this->getExtensionConfig($container);
57+
58+
if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
59+
$easyConfig = [
60+
'design' => [
61+
'menu' => [[
62+
'label' => 'Bundles Configuration',
63+
'icon' => 'wrench',
64+
'children' => $this->getEasyAdminChildren($container, $config)
65+
]]
66+
],
67+
];
68+
69+
$container->prependExtensionConfig('easy_admin', $easyConfig);
70+
}
71+
}
72+
73+
74+
private function loadOverrideConfig(ContainerBuilder $container)
75+
{
76+
$config = $this->getExtensionConfig($container);
77+
$overrideLoader = $this->getContainerLoader($container);
78+
$confDir = $container->getParameter('kernel.project_dir') . '/config';
79+
$overrideLoader->load($confDir . '/packages/' . $config['override_package_directory'] . '/*.yaml', 'glob');
80+
}
81+
82+
/**
83+
* @param ContainerBuilder $container
84+
* @param array $config
3485
* @return array
3586
*/
36-
private function getDefaultBlacklistBundle()
87+
private function getEasyAdminChildren(ContainerBuilder $container, array $config)
88+
{
89+
$extensions = $container->getExtensions();
90+
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
91+
$childrenConfig = [];
92+
93+
foreach ($extensions as $extension) {
94+
if (!in_array($extension->getAlias(), $config['blacklisted_bundles']) || $config['enable_blacklist'] === false) {
95+
$childrenConfig[] = [
96+
'label' => $nameConverter->handle($extension->getAlias()),
97+
'route' => 'barth_simpleconfig_edit',
98+
'params' => ['package' => $extension->getAlias()]
99+
];
100+
}
101+
}
102+
103+
return $childrenConfig;
104+
}
105+
106+
private function getExtensionConfig($container)
107+
{
108+
$configs = $container->getExtensionConfig($this->getAlias());
109+
return $this->processConfiguration(new Configuration(), $configs);
110+
}
111+
112+
private function getContainerLoader(ContainerInterface $container)
37113
{
38-
return [
39-
'debug',
40-
'doctrine',
41-
'doctrine_cache',
42-
'doctrine_migrations',
43-
'framework',
44-
'maker',
45-
'monolog',
46-
'security',
47-
'sensio_framework_extra',
48-
'swiftmailer',
49-
'twig',
50-
'web_profiler',
51-
'web_server',
52-
];
114+
$locator = new FileLocator([]);
115+
$resolver = new LoaderResolver(array(
116+
new YamlFileLoader($container, $locator),
117+
new GlobFileLoader($container, $locator),
118+
new DirectoryLoader($container, $locator),
119+
new ClosureLoader($container)
120+
));
121+
122+
return new DelegatingLoader($resolver);
53123
}
54124
}

src/DependencyInjection/Configuration.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ public function getConfigTreeBuilder()
1717
$rootNode
1818
->children()
1919
->scalarNode('override_package_directory')->defaultValue('override')->end()
20-
->arrayNode('blacklisted_bundles_old')
21-
->scalarPrototype()->end()
22-
->beforeNormalization()->castToArray()->end()
23-
->end()
2420
->booleanNode('enable_blacklist')
2521
->defaultValue(true)
2622
->end()
23+
->booleanNode('enable_easyadmin_integration')
24+
->defaultValue(true)
25+
->end()
2726
->variableNode('blacklisted_bundles')
2827
->defaultValue($this->getDefaultBlacklistBundle())
2928
->cannotBeOverwritten()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Barth\SimpleConfigBundle\NameConverter;
4+
5+
class SnakeCaseToCamelCaseNameConverter
6+
{
7+
public function handle($value) {
8+
$camelCased = preg_replace_callback('/(^|_|\.)+(.)/', function ($match) {
9+
return ('.' === $match[1] ? '_' : '').strtoupper($match[2]);
10+
}, $value);
11+
12+
return $camelCased;
13+
}
14+
}

src/Resources/views/base.html.twig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
{% for flashMessage in app.session.flashbag.get('success') %}
1414
<div class="message success">{{ flashMessage }}</div>
1515
{% endfor %}
16-
{% block content %}{% endblock %}
16+
{% block content_title %}{% endblock %}
17+
{% block main %}{% endblock %}
1718
</body>
1819
</html>

src/Resources/views/form.html.twig

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1-
{% extends "@BarthSimpleConfig/base.html.twig" %}
1+
{% extends parent_template %}
22

3-
{% block content %}
4-
<h1>{% trans from 'Settings' %}settings{% endtrans %} for {{ extension }}</h1>
3+
{% set form_attr = {} %}
4+
{% if 'EasyAdmin' in parent_template %}
5+
{% form_theme config_form with easyadmin_config('design.form_theme') %}
6+
{% set form_attr = {'attr': {'class':'form-horizontal'}} %}
7+
{% endif %}
58

6-
{{ form_start(config_form) }}
7-
{{ form_widget(config_form) }}
9+
{% block content_title %}Settings for {{ extension }}{% endblock %}
10+
{% block main %}
11+
{{ form_start(config_form, form_attr) }}
12+
<div class="row">
13+
{% for child in config_form.children %}
14+
<div class="col-xs-12">
15+
{{ form_row(child) }}
16+
</div>
17+
{% endfor %}
18+
</div>
819
{{ form_end(config_form) }}
920
{% endblock %}

src/Resources/views/list.html.twig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
{% extends "@BarthSimpleConfig/base.html.twig" %}
1+
{% extends parent_template %}
22

3-
{% block content %}
3+
{% block content_title %}Bundles configurations{% endblock %}
4+
{% block main %}
45
<ul>
56
{% for bundle in bundles %}
67
<li>

src/Service/FormConfigService.php

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
88
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
99
use Symfony\Component\Form\Extension\Core\Type\TextType;
10-
use Symfony\Component\Form\FormBuilder;
10+
use Symfony\Component\Form\FormBuilderInterface;
1111
use Symfony\Component\Form\FormFactoryInterface;
1212
use Symfony\Component\Form\FormInterface;
1313

@@ -16,7 +16,7 @@ class FormConfigService
1616
/**
1717
* @var FormFactoryInterface
1818
*/
19-
private $factory;
19+
protected $factory;
2020

2121
public function __construct(
2222
FormFactoryInterface $factory
@@ -36,16 +36,22 @@ public function getFormForConfig(array $config): FormInterface
3636
return $formBuilder->getForm();
3737
}
3838

39-
protected function addToForm(FormBuilder $formBuilder, string $key, $field)
39+
protected function addToForm(FormBuilderInterface $formBuilder, string $key, $field, $parentKey = ''): void
4040
{
41+
$params = [
42+
'label' => $this->humanize($key) . (($parentKey) ? sprintf(' (%s)', $this->humanize($parentKey)) : null),
43+
'data' => $field,
44+
'required' => false,
45+
'translation_domain' => 'barth_simple_config',
46+
];
4147
switch (true) {
4248
case \is_array($field):
4349
foreach ($field as $subKey => $value) {
4450
if (!\is_int($subKey)) {
45-
$this->addToForm($formBuilder, $key . ':' . $subKey, $value);
51+
52+
$this->addToForm($formBuilder, $subKey, $value, ($parentKey) ? $parentKey . ':' . $key : $key);
4653
}
4754
}
48-
4955
return;
5056
break;
5157

@@ -63,11 +69,18 @@ protected function addToForm(FormBuilder $formBuilder, string $key, $field)
6369
default:
6470
return;
6571
}
66-
72+
if ('' !== $parentKey) {
73+
$key = $parentKey . ':' . $key;
74+
}
6775
$key = \str_replace('.', '-', $key);
68-
$formBuilder->add($key, $type, [
69-
'data' => $field,
70-
'required' => false,
71-
]);
76+
$formBuilder->add($key, $type, $params);
77+
}
78+
79+
/**
80+
* copied from Symfony\Component\Form\FormRenderer::humanize()
81+
*/
82+
protected function humanize(string $text): string
83+
{
84+
return ucfirst(strtolower(trim(preg_replace(array('/([A-Z])/', '/[_\s]+/'), array('_$1', ' '), $text))));
7285
}
7386
}

0 commit comments

Comments
 (0)