From 0c2b5f3fb4a2c73bf7e6f63fcbde8bb1d7b45052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 24 Feb 2015 21:15:02 +0100 Subject: [PATCH] Add column option, definition in config & adapt form Exemple for configuration : ``` chill_custom_fields: customizables_entities: - class: Chill\ReportBundle\Entity\Report name: ReportEntity options: summary_fields: {key: abc, form_type: text, form_options: { required: false }} ``` --- DependencyInjection/Configuration.php | 19 ++++++++- Entity/CustomFieldsGroup.php | 30 ++++++++++++++ Form/CustomFieldsGroupType.php | 40 +++++++++++++++++-- .../config/doctrine/CustomFieldsGroup.orm.yml | 2 + .../migrations/Version20150224164531.php | 22 ++++++++++ 5 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 Resources/migrations/Version20150224164531.php diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 43343527f..2c72269fe 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -22,6 +22,8 @@ class Configuration implements ConfigurationInterface $classInfo = "The class which may receive custom fields"; $nameInfo = "The name which will appears in the user interface. May be translatable"; + $optionsInfo = "Options available for custom fields groups referencing this class"; + $prototypeTypeInfo = "The name of the form to append"; $customizableEntitiesInfo = "A list of customizable entities"; $rootNode @@ -33,9 +35,24 @@ class Configuration implements ConfigurationInterface ->children() ->scalarNode('class')->isRequired()->info($classInfo)->end() ->scalarNode('name') ->isRequired()->info($nameInfo) ->end() + ->arrayNode('options') + ->info($optionsInfo) + ->defaultValue(array()) + ->useAttributeAsKey('key') + ->prototype('array') + ->children() + ->scalarNode('form_type') + ->isRequired() + ->info($prototypeTypeInfo) + ->end() + ->variableNode('form_options') + ->defaultValue(array()) + ->end() + ->end() + ->end() + ->end() ->end() ->end() - ->end() ; return $treeBuilder; diff --git a/Entity/CustomFieldsGroup.php b/Entity/CustomFieldsGroup.php index ff4715ee8..cbcd43575 100644 --- a/Entity/CustomFieldsGroup.php +++ b/Entity/CustomFieldsGroup.php @@ -45,6 +45,12 @@ class CustomFieldsGroup * @var \Doctrine\Common\Collections\Collection */ private $customFields; + + /** + * + * @var array + */ + private $options = array(); /** * Constructor @@ -161,5 +167,29 @@ class CustomFieldsGroup { return $this->entity; } + + /** + * get options array + * + * @return array + */ + public function getOptions() + { + return $this->options; + } + + /** + * set options array + * + * @param array $options + * @return \Chill\CustomFieldsBundle\Entity\CustomFieldsGroup + */ + public function setOptions(array $options) + { + $this->options = $options; + return $this; + } + + } diff --git a/Form/CustomFieldsGroupType.php b/Form/CustomFieldsGroupType.php index 2cd4eff2a..204c4e3f8 100644 --- a/Form/CustomFieldsGroupType.php +++ b/Form/CustomFieldsGroupType.php @@ -6,6 +6,8 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\FormEvent; class CustomFieldsGroupType extends AbstractType @@ -32,18 +34,50 @@ class CustomFieldsGroupType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { //prepare translation - $customizableEntites = array(); + $entities = array(); + $customizableEntities = array(); foreach($this->customizableEntities as $key => $definition) { - $customizableEntites[$definition['class']] = $this->translator->trans($definition['name']); + $entities[$definition['class']] = $this->translator->trans($definition['name']); + $customizableEntities[$definition['class']] = $definition; } $builder ->add('name', 'translatable_string') ->add('entity', 'choice', array( - 'choices' => $customizableEntites + 'choices' => $entities )) ; + + $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event) + use ($customizableEntities, $builder){ + $form = $event->getForm(); + $group = $event->getData(); + + if (count($customizableEntities[$group->getEntity()]['options']) > 0) { + $optionBuilder = $builder + ->getFormFactory() + ->createBuilderForProperty( + 'Chill\CustomFieldsBundle\Entity\CustomFieldsGroup', + 'options' + ) + ->create('options', null, array( + 'compound' => true, + 'auto_initialize' => false, + 'required' => false) + ); + } + + foreach($customizableEntities[$group->getEntity()]['options'] as $key => $option) { + $optionBuilder + ->add($key, $option['form_type'], $option['form_options']) + ; + } + if (isset($optionBuilder) && $optionBuilder->count() > 0) { + $form->add($optionBuilder->getForm()); + } + + }); } /** diff --git a/Resources/config/doctrine/CustomFieldsGroup.orm.yml b/Resources/config/doctrine/CustomFieldsGroup.orm.yml index 58cf60375..28f32820f 100644 --- a/Resources/config/doctrine/CustomFieldsGroup.orm.yml +++ b/Resources/config/doctrine/CustomFieldsGroup.orm.yml @@ -13,6 +13,8 @@ Chill\CustomFieldsBundle\Entity\CustomFieldsGroup: entity: type: string length: 255 + options: + type: json_array oneToMany: customFields: orderBy: { 'ordering': 'ASC' } diff --git a/Resources/migrations/Version20150224164531.php b/Resources/migrations/Version20150224164531.php new file mode 100644 index 000000000..a4d3771ad --- /dev/null +++ b/Resources/migrations/Version20150224164531.php @@ -0,0 +1,22 @@ +addSql('ALTER TABLE customfieldsgroup ADD options JSON DEFAULT \'{}\'::json'); + } + + public function down(Schema $schema) + { + $this->addSql('ALTER TABLE CustomFieldsGroup DROP options'); + } +}