diff --git a/src/Form/Extension/ChoiceTypeExtension.php b/src/Form/Extension/ChoiceTypeExtension.php index 836a12e005..8bf6439ba5 100644 --- a/src/Form/Extension/ChoiceTypeExtension.php +++ b/src/Form/Extension/ChoiceTypeExtension.php @@ -15,6 +15,9 @@ use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormTypeInterface; use Symfony\Component\Form\FormView; @@ -27,6 +30,25 @@ */ final class ChoiceTypeExtension extends AbstractTypeExtension { + public function buildForm(FormBuilderInterface $builder, array $options): void + { + if ($options['multiple'] && (true === ($options['sortable'] ?? false))) { + $builder->addEventListener(FormEvents::PRE_SUBMIT, static function (FormEvent $event) use ($options) { + /** @var PreSubmitEvent $event */ + $form = $event->getForm(); + $data = $event->getData(); + + if (!is_array($data) || count($data) !== 1) { + return; + } + + if (str_contains($data[0], ',')) { + $event->setData(explode(',', $data[0])); + } + }, 1); + } + } + public function configureOptions(OptionsResolver $resolver): void { $optionalOptions = ['sortable']; diff --git a/src/Resources/views/CRUD/Association/edit_many_script.html.twig b/src/Resources/views/CRUD/Association/edit_many_script.html.twig index a23ab8070b..7825c44da0 100644 --- a/src/Resources/views/CRUD/Association/edit_many_script.html.twig +++ b/src/Resources/views/CRUD/Association/edit_many_script.html.twig @@ -329,17 +329,24 @@ This code manages the many-to-[one|many] association field popup data: {_xml_http_request: true }, dataType: 'html', type: 'POST', - success: function(html) { + success: function(html) { jQuery('#field_container_{{ id }}').replaceWith(html); var newElement = jQuery('#{{ id }} [value="' + data.objectId + '"]'); - if (newElement.is("input")) { - newElement.attr('checked', 'checked'); + + if (newElement.length) { + if (newElement.is("input")) { + newElement.attr('checked', 'checked'); + } else { + newElement.attr('selected', 'selected'); + } } else { - newElement.attr('selected', 'selected'); + var selections = jQuery('#{{ id }}').val().split(','); + selections.push(data.objectId); + jQuery('#{{ id }}').val(selections.filter((val) => val.length > 0).join(',')); } jQuery('#field_container_{{ id }}').trigger('sonata-admin-append-form-element'); - } + } }); {% endif %}