diff --git a/src/Limenius/Liform/Transformer/CompoundTransformer.php b/src/Limenius/Liform/Transformer/CompoundTransformer.php index d8865d5..309f049 100644 --- a/src/Limenius/Liform/Transformer/CompoundTransformer.php +++ b/src/Limenius/Liform/Transformer/CompoundTransformer.php @@ -46,7 +46,12 @@ public function transform(FormInterface $form, array $extensions = [], $widget = $order = 1; $required = []; - foreach ($form->all() as $name => $field) { + $formItems = $form->all(); + uasort($formItems, static function ($a, $b): int { + return $a->getConfig()->getOption('priority') <=> $b->getConfig()->getOption('priority'); + }); + + foreach ($formItems as $name => $field) { $transformerData = $this->resolver->resolve($field); $transformedChild = $transformerData['transformer']->transform($field, $extensions, $transformerData['widget']); $transformedChild['propertyOrder'] = $order; diff --git a/tests/Limenius/Liform/Tests/Transformer/CompoundTransformerTest.php b/tests/Limenius/Liform/Tests/Transformer/CompoundTransformerTest.php index da41067..5701335 100644 --- a/tests/Limenius/Liform/Tests/Transformer/CompoundTransformerTest.php +++ b/tests/Limenius/Liform/Tests/Transformer/CompoundTransformerTest.php @@ -11,17 +11,13 @@ namespace Limenius\Liform\Tests\Transformer; -use Symfony\Component\Form\FormBuilder; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Form\Tests\AbstractFormTest; -use Symfony\Component\Form\Extension\Core\Type\TextType; -use Symfony\Component\Form\Extension\Core\Type\FormType; - -use Limenius\Liform\Transformer\CompoundTransformer; -use Limenius\Liform\Transformer\StringTransformer; use Limenius\Liform\Resolver; use Limenius\Liform\Tests\LiformTestCase; +use Limenius\Liform\Transformer\CompoundTransformer; +use Limenius\Liform\Transformer\StringTransformer; +use Symfony\Component\Form\Extension\Core\Type\FormType; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\Tests\AbstractFormTest; /** * @author Nacho Martín @@ -39,8 +35,64 @@ public function testOrder() $resolver->setTransformer('text', new StringTransformer($this->translator)); $transformer = new CompoundTransformer($this->translator, null, $resolver); $transformed = $transformer->transform($form); - $this->assertTrue(is_array($transformed)); - $this->assertEquals(1, $transformed['properties']['firstName']['propertyOrder']); - $this->assertEquals(2, $transformed['properties']['secondName']['propertyOrder']); + + $this->assertSame( + [ + 'title' => null, + 'type' => 'object', + 'properties' => [ + 'firstName' => [ + 'type' => 'string', + 'title' => null, + 'propertyOrder' => 1, + ], + 'secondName' => [ + 'type' => 'string', + 'title' => null, + 'propertyOrder' => 2, + ], + ], + 'required' => [ + 'firstName', + 'secondName', + ], + ], + $transformed + ); + } + + public function testPriority() + { + $form = $this->factory->create(FormType::class) + ->add('firstName', TextType::class, ['priority' => 1]) + ->add('secondName', TextType::class, ['priority' => 0]); + $resolver = new Resolver(); + $resolver->setTransformer('text', new StringTransformer($this->translator)); + $transformer = new CompoundTransformer($this->translator, null, $resolver); + $transformed = $transformer->transform($form); + + $this->assertSame( + [ + 'title' => null, + 'type' => 'object', + 'properties' => [ + 'secondName' => [ + 'type' => 'string', + 'title' => null, + 'propertyOrder' => 1, + ], + 'firstName' => [ + 'type' => 'string', + 'title' => null, + 'propertyOrder' => 2, + ], + ], + 'required' => [ + 'secondName', + 'firstName', + ], + ], + $transformed + ); } }