Search code examples
symfonysymfony3

How to set min value for field in form?


I have form with integer field - price.

$builder->add('list',
            CollectionType::class,
            [
                'required' => false,
                'allow_add' => true,
                'error_bubbling' => true,
            ])
            ->add('price',
            IntegerType::class,
            [
                'required' => false,
                'error_bubbling' => true,
            ]);

How to set, for example, for validation i need min value for price 0 or greater?

I tried this one, but it's not work:

'constraints' => [
new GreaterThanOrEqual(50)
 ],

Thanks for all help.

controller Action

 public function getProductAction(Request $request)
    {
        $variables = $request->get('list');

        $price = $request->get('price');

        $form = $this->createForm(ProductForm::class, null, ['csrf_protection' => false, 'allow_extra_fields' => true]);

        $form->submit(['variables' => $variables, 'prices' => $price]);

        if(!$form->isValid()) {

            $errors = '';

            foreach ($form->getErrors() as $error) {
                $errors = $error->getMessage();
            }

            return new JsonResponse([
                'errors' => $errors
            ],Response::HTTP_BAD_REQUEST);
        } else {

            $product = $this->getDoctrine()
                ->getRepository(Product::class)
                ->findByListAndPrice($list, $price);

            if (!$product) {
                return new JsonResponse([
                    'errors' => 'Product not found.'
                ],Response::HTTP_BAD_REQUEST);
            }

            return new JsonResponse($product);
        }
    }

Form not validate, and don't show errors, $form->isValid() === true


Solution

  • According to https://github.com/symfony/symfony/issues/3533 you can use min and max for the IntegerType even though the documentation might not mention this.

    $builder->add('list',
        CollectionType::class,
        [
            'required' => false,
            'allow_add' => true,
            'error_bubbling' => true,
        ])
        ->add('price',
        IntegerType::class,
        [
            'required' => false,
            'error_bubbling' => true,
            /*'min' => 50*/
            'attr' => [
              'min' => 50
            ]
        ]);
    

    EDIT: According to the documentation the 'min' property has to be inside 'attr' tag. This will add the min inside the input in the HTML.