Symfony 2 양식 요소에 오류 추가


83

컨트롤러에서 일부 유효성 검사를 확인합니다. 그리고 실패시 내 양식의 특정 요소에 오류를 추가하고 싶습니다. 내 양식 :

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

addError () 메서드는 요소가 아닌 양식에 오류를 추가합니다. locationRadius 요소에 오류를 추가하려면 어떻게해야합니까?

답변:


178

넌 할 수있어

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

양식 요소도 FormInterface유형입니다.


@ m2mdas, 좋은 대답! 이것을 어떻게 번역할까요? FormError 인스턴스를 생성하면 번역되지 않기 때문입니다. 맞습니까? 시도했지만 번역이 안되는데 말이되는 것 같아요. FormError 인스턴스를 어떻게 번역 하시겠습니까?
Mick

2
안녕하세요 @Patt, 늦게 답장을 드려 죄송합니다. 유효성 검사기 구성 요소는 오류 메시지가 양식에 추가되기 전에 양식 제약 위반 메시지를 번역합니다. 사용자 지정 오류를 추가 위해 당신은 당신이 같은 다른 문자열 예에 대한 메시지 같은 방법으로 번역이,$this->get('translator')->trans('error message')
은 문은 문 다스

1
@ m2mdas하지만 뷰에서이 오류를 어떻게 인쇄합니까? 나는 이것을 시도했지만 form_errors(form)내 나뭇 가지에 들어 가지 않습니다.
Nat Naydenova 2015

1
@NatNaydenova 나는 그것이이었다 알고 잠시하지만 시도form_erros(form.my_field_name)
TMichel

3
참고 : form_errors (form)를 사용하여 오류를 인쇄하려면 양식 자체에 오류를 추가하십시오. 예 : $ form-> addError (new FormError ( 'error msg');
beterthanlife

8

좋아요, 저는 다른 방법이 있습니다. 더 복잡하고 특정 경우에만 해당됩니다.

내 경우:

양식이 있고 제출 후 API 서버에 데이터를 게시합니다. 그리고 API 서버에서도 오류가 발생했습니다.

API 서버 오류 형식은 다음과 같습니다.

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

내 목표는 유연한 솔루션을 얻는 것입니다. 해당 필드에 대한 오류를 설정할 수 있습니다.

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

그게 다야!

노트! addError()메소드는 error_mapping 옵션을 우회합니다 .


내 양식 (회사 양식에 포함 된 주소 양식) :

회사

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

주소

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

이 코드를 어디에 배치합니까? $ vm = 새로운 ViolationMapper ();
vidy videni 2015

@vidyvideni, 양식 제출이 처리되는 컨트롤러 작업입니다. 또한 당신은이 코드 조각을 조정하고 별도의 방법으로 이동할 수
Jekis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.