Fehler zum Symfony 2-Formularelement hinzufügen

83

Ich überprüfe eine Validierung in meinem Controller. Und ich möchte bei einem Fehler einem bestimmten Element meines Formulars einen Fehler hinzufügen. Meine Form:

use Symfony\Component\Form\FormError;

// ...

$config = new Config();
$form = $this->createFormBuilder($config)
        ->add('googleMapKey', 'text', array('label' => 'Google Map key'))
        ->add('locationRadius', 'text', array('label' => 'Location radius (km)'))
        ->getForm();

// ...

$form->addError(new FormError('error message'));

Die Methode addError () fügt dem Formular einen Fehler hinzu, nicht dem Element. Wie kann ich dem locationRadius-Element einen Fehler hinzufügen?

Alex Pliutau
quelle

Antworten:

177

Du kannst tun

$form->get('locationRadius')->addError(new FormError('error message'));

Als Formularelemente sind auch vom FormInterfaceTyp.

Mun Mun Das
quelle
@ m2mdas, tolle Antwort! Wie würden wir das übersetzen? Denn sobald wir eine FormError-Instanz erstellt haben, wird sie nicht mehr übersetzt. Stimmt das? Ich habe es versucht und es übersetzt es nicht und ich denke, es macht Sinn. Wie würden Sie eine FormError-Instanz übersetzen?
Mick
2
Hallo @Patt, Entschuldigung für die späte Antwort. Die Validator-Komponente sorgt für die Übersetzung von Meldungen zu Verstößen gegen Formularbeschränkungen, bevor die Fehlermeldungen zum Formular hinzugefügt werden. Zum Hinzufügen eines benutzerdefinierten Fehlers haben Sie die Nachricht genauso übersetzt wie für andere Zeichenfolgen, z. B.$this->get('translator')->trans('error message')
Mun Mun Das
1
@ m2mdas Aber wie drucken Sie diesen Fehler aus Ihrer Sicht? Ich habe es versucht, aber es geht nicht form_errors(form)in meinen Zweig.
Nat Naydenova
1
@ NatNaydenova Ich weiß, es ist eine Weile her, aber versuchen Sie esform_erros(form.my_field_name)
TMichel
3
Bitte beachten Sie: Um einen Fehler beim Drucken mit form_errors (form) zu erhalten, fügen Sie Ihren Fehler dem Formular selbst hinzu, z. B. $ form-> addError (neuer FormError ('error msg');
beterthanlife
8

OK Leute, ich habe einen anderen Weg. Es ist komplexer und nur für bestimmte Fälle.

Mein Fall:

Ich habe ein Formular und poste nach dem Senden Daten an den API-Server. Und Fehler, die ich auch vom API-Server bekommen habe.

Das Fehlerformat des API-Servers lautet:

array(
    'message' => 'Invalid postal code',
    'propertyPath' => 'businessAdress.postalCode',
)

Mein Ziel ist es, eine flexible Lösung zu erhalten. Legt den Fehler für das entsprechende Feld fest.

$vm = new ViolationMapper();

// Format should be: children[businessAddress].children[postalCode]
$error['propertyPath'] = 'children['. str_replace('.', '].children[', $error['propertyPath']) .']';

// Convert error to violation.
$constraint = new ConstraintViolation(
    $error['message'], $error['message'], array(), '', $error['propertyPath'], null
);

$vm->mapViolation($constraint, $form);

Das ist es!

HINWEIS! addError()Methode umgeht die Option error_mapping .


Mein Formular (im Unternehmensformular eingebettetes Adressformular):

Unternehmen

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Company extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('companyName', 'text',
                array(
                    'label' => 'Company name',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('businessAddress', new Address(),
                array(
                    'label' => 'Business address',
                )
            )
            ->add('update', 'submit', array(
                    'label' => 'Update',
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}

Adresse

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Address extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('postalCode', 'text',
                array(
                    'label' => 'Postal code',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('town', 'text',
                array(
                    'label' => 'Town',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('country', 'choice',
                array(
                    'label' => 'Country',
                    'choices' => $this->getCountries(),
                    'empty_value' => 'Select...',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}
Jekis
quelle
Wo platzieren Sie diesen Code? $ vm = neuer ViolationMapper ();
Vidy Videni
@vidyvideni, Controller-Aktion, bei der das Senden des Formulars behandelt wird. Sie können diesen Code auch anpassen und in eine separate Methode verschieben
Jekis