Skip to content

Commit e89a671

Browse files
authored
allow mf-adapter fields inside dynamic field container (#320)
* allow mf-adapter fields inside dynamic field container, fixes #316
1 parent f356569 commit e89a671

File tree

8 files changed

+43
-29
lines changed

8 files changed

+43
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
```json
2323
"require" : {
24-
"dachcom-digital/formbuilder" : "~4.0.0"
24+
"dachcom-digital/formbuilder" : "~4.1.0"
2525
}
2626
```
2727

UPGRADE.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# Upgrade Notes
22

3-
#### Version 4.1.0
3+
## Version 4.1.0
44
- **[NEW FEATURE]**: API Output channel [#290](https://github.com/dachcom-digital/pimcore-formbuilder/issues/301)
5-
- **[NEW FEATURE]**: API Output channel Field Transformer
5+
- **[NEW FEATURE]**: API Output channel field transformer
66
- **[BUGFIX]**: ensure migration of form configs will be symfony5 compatible [@grizzlydotweb](https://github.com/dachcom-digital/pimcore-formbuilder/pull/310)
77
- **[BUGFIX]**: fix typo in translation [#312](https://github.com/dachcom-digital/pimcore-formbuilder/issues/312)
8-
- **[BUGFIX]**: disable selectOnFocus [#315](https://github.com/dachcom-digital/pimcore-formbuilder/issues/315)
8+
- **[BUGFIX]**: disable `selectOnFocus` [#315](https://github.com/dachcom-digital/pimcore-formbuilder/issues/315)
9+
- **[BUGFIX]**: ⚠️ multi file upload: hidden type `_data` not in form row. touched view: `form/theme/type/dynamic_multi_file.html.twig` [#316](https://github.com/dachcom-digital/pimcore-formbuilder/issues/316)
910

1011
## Version 4.0.2
1112
- [ENHANCEMENT] enable placeholder in cc and bcc field in email output workflow [@frithjof](https://github.com/dachcom-digital/pimcore-formbuilder/pull/305)

src/FormBuilderBundle/Form/Type/DynamicMultiFile/DropZoneType.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ public function __construct(Translator $translator)
1818
$this->translator = $translator;
1919
}
2020

21+
/**
22+
* @throws \JsonException
23+
*/
2124
public function buildView(FormView $view, FormInterface $form, array $options): void
2225
{
2326
$view->vars = array_merge_recursive($view->vars, [
2427
'attr' => [
25-
'data-field-id' => $view->parent->vars['id'],
28+
'data-field-id' => $view->vars['id'],
2629
'data-engine-options' => json_encode([
2730
'translations' => $this->getInterfaceTranslations(),
2831
'instance_error' => $this->translator->trans('form_builder.dynamic_multi_file.global.cannot_destroy_active_instance'),

src/FormBuilderBundle/Form/Type/DynamicMultiFileType.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
use Symfony\Component\Form\CallbackTransformer;
99
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
1010
use Symfony\Component\Form\FormBuilderInterface;
11-
use Symfony\Component\Form\FormInterface;
12-
use Symfony\Component\Form\FormView;
11+
use Symfony\Component\Form\FormFactoryInterface;
1312
use Symfony\Component\OptionsResolver\OptionsResolver;
1413

1514
class DynamicMultiFileType extends AbstractType
1615
{
16+
protected FormFactoryInterface $formFactory;
1717
protected Configuration $configuration;
1818
protected DynamicMultiFileAdapterRegistry $dynamicMultiFileAdapterRegistry;
1919

2020
public function __construct(
21+
FormFactoryInterface $formFactory,
2122
Configuration $configuration,
2223
DynamicMultiFileAdapterRegistry $dynamicMultiFileAdapterRegistry
2324
) {
25+
$this->formFactory = $formFactory;
2426
$this->configuration = $configuration;
2527
$this->dynamicMultiFileAdapterRegistry = $dynamicMultiFileAdapterRegistry;
2628
}
@@ -41,27 +43,24 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
4143
$dmfAdapterName = $this->configuration->getConfig('dynamic_multi_file_adapter');
4244
$dmfAdapter = $this->dynamicMultiFileAdapterRegistry->get($dmfAdapterName);
4345

44-
$options['mapped'] = false;
46+
$options['compound'] = true;
4547
$options['label'] = empty($options['label']) ? false : $options['label'];
4648
$options['attr']['data-dynamic-multi-file-instance'] = 'true';
4749
$options['attr']['data-js-handler'] = $dmfAdapter->getJsHandler();
4850

49-
$builder->add('adapter', $dmfAdapter->getForm(), $options);
50-
$builder->add('data', HiddenType::class, []);
51+
$dmfForm = $this->formFactory->createNamedBuilder('adapter', $dmfAdapter->getForm(), null, $options);
5152

52-
$builder->get('data')->addModelTransformer(new CallbackTransformer(
53+
$dmfForm->add('data', HiddenType::class, []);
54+
$dmfForm->get('data')->addModelTransformer(new CallbackTransformer(
5355
function ($identifier) {
54-
return $identifier === null ? null : json_encode($identifier);
56+
return $identifier === null ? null : json_encode($identifier, JSON_THROW_ON_ERROR);
5557
},
5658
function ($identifier) {
57-
return $identifier === null ? [] : json_decode($identifier, true);
59+
return $identifier === null ? [] : json_decode($identifier, true, 512, JSON_THROW_ON_ERROR);
5860
}
5961
));
60-
}
6162

62-
public function buildView(FormView $view, FormInterface $form, array $options): void
63-
{
64-
$view->vars['attr']['id'] = $view->vars['id'];
63+
$builder->add($dmfForm);
6564
}
6665

6766
public function getBlockPrefix(): string

src/FormBuilderBundle/Resources/config/services/forms/forms.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ services:
1717
FormBuilderBundle\Form\Type\DynamicMultiFileType:
1818
public: false
1919
arguments:
20+
- '@Symfony\Component\Form\FormFactoryInterface'
2021
- '@FormBuilderBundle\Configuration\Configuration'
2122
- '@FormBuilderBundle\Registry\DynamicMultiFileAdapterRegistry'
2223
tags:

src/FormBuilderBundle/Resources/views/form/theme/type/dynamic_multi_file.html.twig

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
{% block form_builder_dynamicmultifile_widget %}
22
{%- for child in form %}
3-
{% if child.vars.name == 'adapter' %}
4-
{# pass row attributes to compount adapter form #}
5-
{% set widget_attr = attr|merge({class: (child.vars.attr.class|default('') ~ ' ' ~ attr.class|default(''))|trim}) %}
6-
{{- form_row(child, {compound: false, attr: widget_attr, id: id}) -}}
7-
{% else %}
8-
{{- form_row(child) -}}
9-
{% endif %}
3+
{{- form_row(child, {compound: false}) -}}
104
{% endfor -%}
115
{% endblock %}
126

@@ -19,6 +13,11 @@
1913
{% include '@FormBuilder/form/elements/dynamic-multi-file/form.html.twig' %}
2014
</div>
2115
</div>
16+
{% for child in form -%}
17+
{% if not child.rendered %}
18+
{{- form_row(child) -}}
19+
{% endif %}
20+
{%- endfor -%}
2221
</div>
2322
{% endapply %}
2423
{% endblock %}
@@ -30,6 +29,11 @@
3029
<div class="dropzone-template" style="display: none;">
3130
{% include '@FormBuilder/form/elements/dynamic-multi-file/form-drop-zone.html.twig' %}
3231
</div>
32+
{% for child in form -%}
33+
{% if not child.rendered %}
34+
{{- form_row(child) -}}
35+
{% endif %}
36+
{%- endfor -%}
3337
</div>
3438
{% endapply %}
3539
{% endblock %}

src/FormBuilderBundle/Transformer/Output/DynamicMultiFileTransformer.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ public function getValue(FieldDefinitionInterface $fieldDefinition, FormInterfac
2727
return null;
2828
}
2929

30+
$attachmentData = $rawValue['adapter']['data'];
31+
3032
$options = $fieldDefinition->getOptions();
3133
/** @var FormDataInterface $rootFormData */
3234
$rootFormData = $formField->getRoot()->getData();
3335

3436
if (isset($options['submit_as_attachment']) && $options['submit_as_attachment'] === true) {
35-
$attachmentLinks = $this->attachmentStream->createAttachmentLinks($rawValue['data'], $fieldDefinition->getName());
37+
$attachmentLinks = $this->attachmentStream->createAttachmentLinks($attachmentData, $fieldDefinition->getName());
3638
foreach ($attachmentLinks as $attachmentLink) {
3739
$rootFormData->addAttachment($attachmentLink);
3840
}
@@ -42,7 +44,7 @@ public function getValue(FieldDefinitionInterface $fieldDefinition, FormInterfac
4244
return null;
4345
}
4446

45-
$asset = $this->attachmentStream->createAttachmentAsset($rawValue['data'], $fieldDefinition->getName(), $rootFormData->getFormDefinition()->getName());
47+
$asset = $this->attachmentStream->createAttachmentAsset($attachmentData, $fieldDefinition->getName(), $rootFormData->getFormDefinition()->getName());
4648

4749
if ($asset instanceof Asset) {
4850
return sprintf('%s%s', \Pimcore\Tool::getHostUrl(), $asset->getRealFullPath());

src/FormBuilderBundle/Validator/Constraints/DynamicMultiFileNotBlankValidator.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ public function validate(mixed $value, Constraint $constraint): void
1414
throw new UnexpectedTypeException($constraint, DynamicMultiFileNotBlank::class);
1515
}
1616

17-
if(!isset($value['data'])) {
17+
if (!isset($value['adapter'])) {
1818
return;
1919
}
2020

21-
if (!is_array($value['data'])) {
21+
if (!isset($value['adapter']['data'])) {
22+
return;
23+
}
24+
25+
if (!is_array($value['adapter']['data'])) {
2226
$this->context->buildViolation($constraint->message)->addViolation();
23-
} elseif (count($value['data']) === 0) {
27+
} elseif (count($value['adapter']['data']) === 0) {
2428
$this->context->buildViolation($constraint->message)->addViolation();
2529
}
2630
}

0 commit comments

Comments
 (0)