2012-09-14 13 views
70

Compruebo un poco de validación en mi controlador. Y deseo agregar un error al elemento específico de mi formulario en caso de falla. Mi forma:Agregar error al elemento de formulario de Symfony 2

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')); 

método addError() agrega error a la forma, no al elemento. ¿Cómo puedo agregar un error al elemento locationRadius?

Respuesta

145

Se puede hacer

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

Como elementos de formulario son también de tipo FormInterface.

+1

Gracias. Ha solucionado mi problema. – pltvs

+0

@ m2mdas, gran respuesta! ¿Cómo traduciríamos esto? porque una vez que creamos una instancia de FormError, no la traducirá, ¿estoy en lo cierto? Intenté y no lo traduzco, y creo que tiene sentido. ¿Cómo traducirías una instancia de FormError? – Mick

+1

Hola @Patt, perdón por la respuesta tardía. El componente validador se encarga de traducir los mensajes de violación de restricciones de formulario antes de que los mensajes de error se agreguen al formulario. Para agregar un error personalizado, debe traducir el mensaje del mismo modo que para otras cadenas, por ejemplo, '$ this-> get ('translator') -> trans ('mensaje de error')' –

5

OK muchachos, tengo otra manera. Es más complejo y solo para casos específicos.

Mi caso:

Tengo una forma y después de someto puedo enviar datos al servidor API. Y los errores que obtuve del servidor API también.

formato de error del servidor API es:

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

Mi objetivo es conseguir una solución flexible. Permite establecer el error para el campo correspondiente.

$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); 

Eso es todo!

NOTA!addError() método omite la opción error_mapping.


Mi forma (forma Dirección incrustado en forma de empresa):

Compañía

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

Dirección

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

donde coloca este código? $ vm = new ViolationMapper(); –

+0

@vidyvideni Acción del controlador donde se manejará el envío de formulario. También podría ajustar este fragmento de código y moverlo a un método diferente – Jekis

Cuestiones relacionadas