Добавить ошибку в элемент формы 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?
Мик
2
Привет, @Patt, извини за поздний ответ. Компонент валидатора заботится о переводе сообщений о нарушении ограничений формы до того, как сообщения об ошибках будут добавлены в форму. Для добавления пользовательской ошибки вы должны перевести сообщение так же, как и для других строк, например,$this->get('translator')->trans('error message')
Мун Мун Дас
1
@ m2mdas Но как вы напечатаете эту ошибку в вашем представлении? Я пробовал это, но form_errors(form)у меня не получается .
Нат Найденова
1
@NatNaydenova Я знаю, что это было давно, но попробуйтеform_erros(form.my_field_name)
TMichel 01
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
@vidyvideni, действие контроллера, в котором будет обрабатываться отправка формы. Также вы можете скорректировать этот фрагмент кода и переместить его в отдельный метод
Jekis