2012-09-14 4 views
70

Ich überprüfe einige Validierung in meinem Controller. Und ich möchte Fehler zu bestimmten Element meines Formulars bei Fehler hinzufügen. Mein Formular:Hinzufügen von Fehler zu Symfony 2 Formularelement

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 addError() -Methode fügt einen Fehler zu Formular, nicht zu Element hinzu. Wie kann ich dem locationRadius-Element einen Fehler hinzufügen?

Antwort

145

Sie können

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

tun Als Formelemente auch von FormInterface Typ sind.

+1

Dank. Es hat mein Problem gelöst. – pltvs

+0

@ m2mdas, gute 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 übersetzt es nicht, und ich denke, es macht Sinn. Wie würden Sie eine FormError-Instanz übersetzen? – Mick

+1

Hallo @ Patt, Entschuldigung für die späte Antwort. Die Validator-Komponente kümmert sich um die Übersetzung von Formbedingungsverletzungsnachrichten, bevor die Fehlermeldungen dem Formular hinzugefügt werden. Zum Hinzufügen eines benutzerdefinierten Fehlers haben Sie die Nachricht genauso übersetzt wie für andere Strings. Beispiel: $ this-> get ('translator') -> trans ('error message') ' –

5

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

Mein Fall:

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

API-Server-Fehler-Format ist:

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

Mein Ziel ist es flexible Lösung zu erhalten. Lässt den Fehler für das entsprechende Feld setzen.

$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 war's!

HINWEIS!addError() Methode umgeht error_mapping Option.


Meine Form (Adresse Form in Form Gesellschaft eingebettet):

Firma

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

wo platzieren Sie diesen Code? $ vm = new ViolationMapper(); –

+0

@vidyvideni , Controller-Aktion, bei der das Senden von Formularen gehandhabt wird Auch können Sie diesen Codeabschnitt anpassen und in eine separate Methode verschieben – Jekis