Skip to content

Commit aa20336

Browse files
author
fernando.carletti
committed
Added data providers for choice fields.
1 parent bc7ce87 commit aa20336

File tree

5 files changed

+84
-0
lines changed

5 files changed

+84
-0
lines changed

DataProvider.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Linio\DynamicFormBundle;
4+
5+
6+
interface DataProvider
7+
{
8+
/**
9+
* Retrieve data for collection fields.
10+
*
11+
* @return array
12+
*/
13+
public function getData();
14+
}

DependencyInjection/CompilerPass.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ class CompilerPass implements CompilerPassInterface
1212
* @param ContainerBuilder $container
1313
*/
1414
public function process(ContainerBuilder $container)
15+
{
16+
$this->loadFormlyFields($container);
17+
$this->loadDataProviders($container);
18+
19+
}
20+
21+
/**
22+
* @param ContainerBuilder $container
23+
*/
24+
public function loadFormlyFields(ContainerBuilder $container)
1525
{
1626
if (!$container->hasDefinition('container.formly_field')) {
1727
return;
@@ -26,4 +36,19 @@ public function process(ContainerBuilder $container)
2636
}
2737
}
2838
}
39+
40+
/**
41+
* @param ContainerBuilder $container
42+
*/
43+
public function loadDataProviders(ContainerBuilder $container)
44+
{
45+
$containerDefinition = $container->getDefinition('dynamic_form.factory');
46+
$taggedServices = $container->findTaggedServiceIds('dynamic_form.data_provider');
47+
48+
foreach ($taggedServices as $id => $tags) {
49+
foreach ($tags as $attributes) {
50+
$containerDefinition->addMethodCall('addDataProvider', [$attributes['alias'], new Reference($id)]);
51+
}
52+
}
53+
}
2954
}

DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
66
use Symfony\Component\Config\Definition\ConfigurationInterface;
7+
use Linio\DynamicFormBundle\DataProvider;
78

89
/**
910
* This is the class that validates and merges configuration from your app/config files
@@ -30,6 +31,7 @@ public function getConfigTreeBuilder()
3031
->booleanNode('enabled')
3132
->defaultFalse()
3233
->end()
34+
3335
->scalarNode('type')
3436
->isRequired()
3537
->end()
@@ -42,6 +44,9 @@ public function getConfigTreeBuilder()
4244

4345
->variableNode('validation')
4446
->end()
47+
48+
->scalarNode('data_provider')
49+
->end()
4550
->end()
4651
->end()
4752
->end()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Linio\DynamicFormBundle\Exception;
4+
5+
class NotExistentDataProviderException extends DynamicFormException
6+
{
7+
}

Form/FormFactory.php

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

33
namespace Linio\DynamicFormBundle\Form;
44

5+
use Linio\DynamicFormBundle\DataProvider;
56
use Linio\DynamicFormBundle\Exception\NonExistentFormException;
67
use Symfony\Component\Form\FormBuilderInterface;
78
use Symfony\Component\Form\FormFactory as SymfonyFormFactory;
@@ -19,6 +20,11 @@ class FormFactory
1920
*/
2021
protected $configuration;
2122

23+
/**
24+
* @var DataProvider[]
25+
*/
26+
protected $dataProviders = [];
27+
2228
/**
2329
* @param SymfonyFormFactory $formFactory
2430
*/
@@ -35,6 +41,15 @@ public function setConfiguration(array $configuration)
3541
$this->configuration = $configuration;
3642
}
3743

44+
/**
45+
* @param string $alias
46+
* @param DataProvider $dataProvider
47+
*/
48+
public function addDataProvider($alias, DataProvider $dataProvider)
49+
{
50+
$this->dataProviders[$alias] = $dataProvider;
51+
}
52+
3853
/**
3954
* @param string $key The key of the Form in the form configuration
4055
* @param array $data
@@ -75,6 +90,10 @@ public function createBuilder($key, $data = [], $options = [], $name = null)
7590

7691
$fieldOptions = isset($fieldConfiguration['options']) ? $fieldConfiguration['options'] : [];
7792

93+
if (isset($fieldConfiguration['data_provider'])) {
94+
$fieldOptions['choices'] = $this->loadDataProvider($fieldConfiguration['data_provider'])->getData();
95+
}
96+
7897
if (isset($fieldConfiguration['validation'])) {
7998
$constraints = [];
8099

@@ -106,6 +125,20 @@ public function createBuilder($key, $data = [], $options = [], $name = null)
106125
return $formBuilder;
107126
}
108127

128+
/**
129+
* @param string $alias
130+
*
131+
* @return DataProvider
132+
*/
133+
public function loadDataProvider($alias)
134+
{
135+
if (!isset($this->dataProviders[$alias])) {
136+
throw new NotExistentDataProviderException();
137+
}
138+
139+
return $this->dataProviders[$alias];
140+
}
141+
109142
/**
110143
* @param string $name
111144
*

0 commit comments

Comments
 (0)