Skip to content

Validation failed on required fields check #9

@Digi92

Description

@Digi92

Hi,
in a freshly installed Symfony 6.4 the valiadation in mosparo-bundle/src/Validator/IsValidMosparoValidator.php:90 fails.
In the Mosparo result request and later in “$verifiedFields” the fields are written as “contact[firstname]”.
From “mosparo-bundle/src/Validator/IsValidMosparoValidator.php:77->$this->normalizer->normalize($form);” and later “$requiredFields” the fields are returned as “contactfirstname”.
It seems that there is a mismatch between the two values.

To recreate:

  1. Run the command: composer create-project symfony/skeleton:^6.4 htdocs && cd htdocs && composer require webapp && composer require arnaud-ritti/mosparo-bundle
  2. Setup this bundle: https://github.com/arnaud-ritti/mosparo-bundle?tab=readme-ov-file#configuration
  3. Add my simple form code:
    src/Controller/ContactFormController.php

namespace App\Controller;

use App\Form\Type\ContactType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ContactFormController extends AbstractController
{
    #[Route('/contact', name: 'contact_form')]
    public function new(Request $request): Response
    {
        $form = $this->createForm(ContactType::class);
        
        $form->handleRequest($request);
        if ($form->isSubmitted() &&
            $form->isValid()
        ) {
            $contact = $form->getData();
            
            return $this->redirectToRoute('contact_form_success');
        }
        
        return $this->render('contact/new.html.twig', [
            'form' => $form,
        ]);
    }

    #[Route('/success', name: 'contact_form_success')]
    public function success(): Response
    {
        return $this->render('contact/success.html.twig', []);
    }
}

src/Entity/Contact.php

<?php

namespace App\Entity;

class Contact
{
    #[Assert\NotBlank]
    protected string $firstname;

    #[Assert\NotBlank]
    protected string $lastname;

    #[Assert\NotBlank]
    protected string $mail;

    #[Assert\NotBlank]
    protected string $message;

    public function getFirstname(): string
    {
        return $this->firstname;
    }

    public function setFirstname(string $firstname): void
    {
        $this->firstname = $firstname;
    }

    public function getLastname(): string
    {
        return $this->lastname;
    }

    public function setLastname(string $lastname): void
    {
        $this->lastname = $lastname;
    }

    public function getMail(): string
    {
        return $this->mail;
    }

    public function setMail(string $mail): void
    {
        $this->mail = $mail;
    }

    public function getMessage(): string
    {
        return $this->message;
    }

    public function setMessage(string $message): void
    {
        $this->message = $message;
    }
}

src/Form/Type/ContactType.php

<?php

namespace App\Form\Type;

use Mosparo\MosparoBundle\Form\Type\MosparoType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use App\Entity\Contact;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ContactType extends AbstractType
{
    #[\Override]
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('firstname', TextType::class, ['required' => true])
            ->add('lastname', TextType::class, ['required' => true])
            ->add('mail', TextType::class, ['required' => true])
            ->add('message', TextareaType::class, ['required' => true])
            ->add('mosparo', MosparoType::class, [
                'project' => 'default',
                'allowBrowserValidation' => false,
                'cssResourceUrl' => '',
                'designMode' => false,
                'inputFieldSelector' => '[name]:not(.mosparo__ignored-field)',
                'loadCssResource' => true,
                'requestSubmitTokenOnInit' => true,
            ])
            ->add('send', SubmitType::class, ['label' => 'Send'])
        ;
    }

    #[\Override]
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Contact::class,
        ]);
    }
}

templates/contact/new.html.twig

{{ form(form) }}

templates/contact/success.html.twig

<h1>Success</h1>

public/.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On

  # we skip all files with .something
  RewriteCond %{REQUEST_URI} \..+$
  RewriteCond %{REQUEST_URI} !\.html$
  RewriteRule .* - [L]

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
  1. Try to send the validated form

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions