Skip to content

Commit

Permalink
Merge pull request #2 from Jibbarth/feature/easy-admin-bridge
Browse files Browse the repository at this point in the history
Feature/easy admin bridge
  • Loading branch information
Jibbarth authored Oct 28, 2018
2 parents 5a5a933 + 660c696 commit f3a73e8
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 43 deletions.
3 changes: 3 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,8 @@
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"suggest": {
"easycorp/easyadmin-bundle": "Embed Config forms directly in EasyAdminBundle"
}
}
27 changes: 24 additions & 3 deletions src/Controller/DefaultController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Barth\SimpleConfigBundle\Controller;

use Barth\SimpleConfigBundle\NameConverter\SnakeCaseToCamelCaseNameConverter;
use Barth\SimpleConfigBundle\Service\ConfigService;
use Barth\SimpleConfigBundle\Service\ExtensionConfigurationService;
use Barth\SimpleConfigBundle\Service\ExtensionLocatorService;
Expand All @@ -28,15 +29,21 @@ class DefaultController extends Controller
* @var ExtensionConfigurationService
*/
private $extensionConfigurationService;
/**
* @var string
*/
private $defaultAdminBundle;

public function __construct(
ConfigService $configService,
ExtensionLocatorService $extensionLocatorService,
ExtensionConfigurationService $extensionConfigurationService
ExtensionConfigurationService $extensionConfigurationService,
string $defaultAdminBundle = null
) {
$this->configService = $configService;
$this->extensionLocatorService = $extensionLocatorService;
$this->extensionConfigurationService = $extensionConfigurationService;
$this->defaultAdminBundle = $defaultAdminBundle;
}

/**
Expand All @@ -51,6 +58,7 @@ public function indexAction()

return $this->render('@BarthSimpleConfig/list.html.twig', [
'bundles' => $availableBundles,
'parent_template' => $this->getParentTemplate(),
]);
}

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

$this->configService->saveNewConfig($package, $data);
if ($this->configService->isOverrideConfigForPackageExist($package)) {
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
$this->get('session')->getFlashBag()->add(
'success',
'Successfully registered config for ' . $package
'Successfully registered config for ' . $nameConverter->handle($package)
);
}

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

$nameConverter = new SnakeCaseToCamelCaseNameConverter();
return $this->render('@BarthSimpleConfig/form.html.twig', [
'config_form' => $form->createView(),
'extension' => $extension->getAlias(),
'extension' => $nameConverter->handle($extension->getAlias()),
'parent_template' => $this->getParentTemplate(),
]);
}

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

return $data;
}

protected function getParentTemplate()
{
switch ($this->defaultAdminBundle) {
case 'easy_admin':
return '@EasyAdmin/default/layout.html.twig';
default:
return '@BarthSimpleConfig/base.html.twig';
}
}
}
106 changes: 88 additions & 18 deletions src/DependencyInjection/BarthSimpleConfigExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,23 @@

namespace Barth\SimpleConfigBundle\DependencyInjection;

use Barth\SimpleConfigBundle\Controller\DefaultController;
use Barth\SimpleConfigBundle\NameConverter\SnakeCaseToCamelCaseNameConverter;
use Barth\SimpleConfigBundle\Service\ConfigService;
use Barth\SimpleConfigBundle\Service\ExtensionLocatorService;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

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

$container->getDefinition(ConfigService::class)->setArgument(1, $config['override_package_directory']);
$container->getDefinition(ConfigService::class)->setArgument('$overrideDir', $config['override_package_directory']);
$bundles = $container->getParameter('kernel.bundles');
if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
$container->getDefinition(DefaultController::class)->setArgument('$defaultAdminBundle', 'easy_admin');
}

if (true === $config['enable_blacklist']) {
$this->blacklistedBundles = $config['blacklisted_bundles'];
$container
->getDefinition(ExtensionLocatorService::class)
->setArgument(1, $config['blacklisted_bundles']);
}
}

/**
* @param ContainerBuilder $container
*/
public function prepend(ContainerBuilder $container)
{
$bundles = $container->getParameter('kernel.bundles');

$this->loadOverrideConfig($container);
$config = $this->getExtensionConfig($container);

if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
$easyConfig = [
'design' => [
'menu' => [[
'label' => 'Bundles Configuration',
'icon' => 'wrench',
'children' => $this->getEasyAdminChildren($container, $config)
]]
],
];

$container->prependExtensionConfig('easy_admin', $easyConfig);
}
}


private function loadOverrideConfig(ContainerBuilder $container)
{
$config = $this->getExtensionConfig($container);
$overrideLoader = $this->getContainerLoader($container);
$confDir = $container->getParameter('kernel.project_dir') . '/config';
$overrideLoader->load($confDir . '/packages/' . $config['override_package_directory'] . '/*.yaml', 'glob');
}

/**
* @param ContainerBuilder $container
* @param array $config
* @return array
*/
private function getDefaultBlacklistBundle()
private function getEasyAdminChildren(ContainerBuilder $container, array $config)
{
$extensions = $container->getExtensions();
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
$childrenConfig = [];

foreach ($extensions as $extension) {
if (!in_array($extension->getAlias(), $config['blacklisted_bundles']) || $config['enable_blacklist'] === false) {
$childrenConfig[] = [
'label' => $nameConverter->handle($extension->getAlias()),
'route' => 'barth_simpleconfig_edit',
'params' => ['package' => $extension->getAlias()]
];
}
}

return $childrenConfig;
}

private function getExtensionConfig($container)
{
$configs = $container->getExtensionConfig($this->getAlias());
return $this->processConfiguration(new Configuration(), $configs);
}

private function getContainerLoader(ContainerInterface $container)
{
return [
'debug',
'doctrine',
'doctrine_cache',
'doctrine_migrations',
'framework',
'maker',
'monolog',
'security',
'sensio_framework_extra',
'swiftmailer',
'twig',
'web_profiler',
'web_server',
];
$locator = new FileLocator([]);
$resolver = new LoaderResolver(array(
new YamlFileLoader($container, $locator),
new GlobFileLoader($container, $locator),
new DirectoryLoader($container, $locator),
new ClosureLoader($container)
));

return new DelegatingLoader($resolver);
}
}
7 changes: 3 additions & 4 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@ public function getConfigTreeBuilder()
$rootNode
->children()
->scalarNode('override_package_directory')->defaultValue('override')->end()
->arrayNode('blacklisted_bundles_old')
->scalarPrototype()->end()
->beforeNormalization()->castToArray()->end()
->end()
->booleanNode('enable_blacklist')
->defaultValue(true)
->end()
->booleanNode('enable_easyadmin_integration')
->defaultValue(true)
->end()
->variableNode('blacklisted_bundles')
->defaultValue($this->getDefaultBlacklistBundle())
->cannotBeOverwritten()
Expand Down
14 changes: 14 additions & 0 deletions src/NameConverter/SnakeCaseToCamelCaseNameConverter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Barth\SimpleConfigBundle\NameConverter;

class SnakeCaseToCamelCaseNameConverter
{
public function handle($value) {
$camelCased = preg_replace_callback('/(^|_|\.)+(.)/', function ($match) {
return ('.' === $match[1] ? '_' : '').strtoupper($match[2]);
}, $value);

return $camelCased;
}
}
3 changes: 2 additions & 1 deletion src/Resources/views/base.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
{% for flashMessage in app.session.flashbag.get('success') %}
<div class="message success">{{ flashMessage }}</div>
{% endfor %}
{% block content %}{% endblock %}
{% block content_title %}{% endblock %}
{% block main %}{% endblock %}
</body>
</html>
21 changes: 16 additions & 5 deletions src/Resources/views/form.html.twig
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
{% extends "@BarthSimpleConfig/base.html.twig" %}
{% extends parent_template %}

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

{{ form_start(config_form) }}
{{ form_widget(config_form) }}
{% block content_title %}Settings for {{ extension }}{% endblock %}
{% block main %}
{{ form_start(config_form, form_attr) }}
<div class="row">
{% for child in config_form.children %}
<div class="col-xs-12">
{{ form_row(child) }}
</div>
{% endfor %}
</div>
{{ form_end(config_form) }}
{% endblock %}
5 changes: 3 additions & 2 deletions src/Resources/views/list.html.twig
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{% extends "@BarthSimpleConfig/base.html.twig" %}
{% extends parent_template %}

{% block content %}
{% block content_title %}Bundles configurations{% endblock %}
{% block main %}
<ul>
{% for bundle in bundles %}
<li>
Expand Down
33 changes: 23 additions & 10 deletions src/Service/FormConfigService.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\FormInterface;

Expand All @@ -16,7 +16,7 @@ class FormConfigService
/**
* @var FormFactoryInterface
*/
private $factory;
protected $factory;

public function __construct(
FormFactoryInterface $factory
Expand All @@ -36,16 +36,22 @@ public function getFormForConfig(array $config): FormInterface
return $formBuilder->getForm();
}

protected function addToForm(FormBuilder $formBuilder, string $key, $field)
protected function addToForm(FormBuilderInterface $formBuilder, string $key, $field, $parentKey = ''): void
{
$params = [
'label' => $this->humanize($key) . (($parentKey) ? sprintf(' (%s)', $this->humanize($parentKey)) : null),
'data' => $field,
'required' => false,
'translation_domain' => 'barth_simple_config',
];
switch (true) {
case \is_array($field):
foreach ($field as $subKey => $value) {
if (!\is_int($subKey)) {
$this->addToForm($formBuilder, $key . ':' . $subKey, $value);

$this->addToForm($formBuilder, $subKey, $value, ($parentKey) ? $parentKey . ':' . $key : $key);
}
}

return;
break;

Expand All @@ -63,11 +69,18 @@ protected function addToForm(FormBuilder $formBuilder, string $key, $field)
default:
return;
}

if ('' !== $parentKey) {
$key = $parentKey . ':' . $key;
}
$key = \str_replace('.', '-', $key);
$formBuilder->add($key, $type, [
'data' => $field,
'required' => false,
]);
$formBuilder->add($key, $type, $params);
}

/**
* copied from Symfony\Component\Form\FormRenderer::humanize()
*/
protected function humanize(string $text): string
{
return ucfirst(strtolower(trim(preg_replace(array('/([A-Z])/', '/[_\s]+/'), array('_$1', ' '), $text))));
}
}

0 comments on commit f3a73e8

Please sign in to comment.