Fehler zum Symfony 2-Formularelement hinzugefügt

Lesezeit: 3 Minuten

Benutzer-Avatar
Alex Pliutau

Ich überprüfe einige Validierungen in meinem Controller. Und ich möchte bei einem Fehler einem bestimmten Element meines Formulars einen Fehler hinzufügen. Mein Formular:

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?

Benutzer-Avatar
Mun Mun Das

Du kannst tun

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

Als Formelemente eignen sich auch z FormInterface Typ.

  • @m2mdas, tolle Antwort! Wie würden wir das übersetzen? denn sobald wir eine FormError-Instanz erstellt haben, wird sie nicht übersetzt, habe ich recht? Ich habe es versucht und es wird nicht übersetzt, und ich denke, es macht Sinn. Wie würden Sie eine FormError-Instanz übersetzen?

    – Mick

    12. Januar 2014 um 15:24 Uhr


  • Hallo @Patt, sorry für die späte Antwort. Die Validator-Komponente kümmert sich um die Übersetzung von Meldungen über Verletzungen von Formulareinschränkungen, bevor die Fehlermeldungen zum Formular hinzugefügt werden. Zum Hinzufügen eines benutzerdefinierten Fehlers müssen Sie die Nachricht auf die gleiche Weise übersetzen wie für andere Zeichenfolgen, z. $this->get('translator')->trans('error message')

    – Mun Mun Das

    14. Januar 2014 um 21:31 Uhr

  • @m2mdas Aber wie druckst du diesen Fehler in deiner Ansicht? Ich habe das versucht, aber es geht nicht in die form_errors(form) in meinem Zweig.

    – Nat Naydenova

    22. April 2015 um 11:38 Uhr


  • @NatNaydenova Ich weiß, es ist eine Weile her, aber versuche es form_erros(form.my_field_name)

    – TMichel

    1. Dezember 2015 um 17:58 Uhr


  • Bitte beachten Sie: Um einen Fehler zum Drucken mit form_errors(form) zu erhalten, fügen Sie Ihren Fehler zum Formular selbst hinzu, zB $form->addError(new FormError(‘error msg’);

    – besser als das Leben

    9. Januar 2017 um 10:38 Uhr

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 Absenden Daten an den API-Server. Und Fehler, die ich auch vom API-Server bekommen habe.

API-Server-Fehlerformat ist:

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

Mein Ziel ist eine flexible Lösung. Legen wir 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 error_mapping Möglichkeit.


Mein Formular (Adressformular eingebettet in das Firmenformular):

Gesellschaft

<?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;
    }
}

  • Wo platzierst du diesen Code? $vm = neuer ViolationMapper();

    – vidy videni

    26. November 2015 um 6:20 Uhr

  • @vidyvideni, Controller-Aktion, bei der das Absenden des Formulars verarbeitet wird. Sie könnten diesen Codeabschnitt auch anpassen und in eine separate Methode verschieben

    – Jekis

    27. November 2015 um 7:08 Uhr

1351750cookie-checkFehler zum Symfony 2-Formularelement hinzugefügt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy