Додати помилку до елемента форми 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, вибачте за пізню відповідь. Компонент Validator дбає про переклад повідомлень про порушення обмежень форми перед тим, як повідомлення про помилки будуть додані до форми. Для додавання власної помилки ви перекладаєте повідомлення так само, як і для інших рядків, наприклад,$this->get('translator')->trans('error message')
Mun Mun Das

1
@ m2mdas Але як ви надрукуєте цю помилку на ваш погляд? Я спробував це, але це не входить form_errors(form)у мою гілочку.
Нат Найдєнова

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

@vidyvideni, дія контролера, де буде оброблятися надсилання форми. Також ви можете налаштувати цей фрагмент коду та перенести його в окремий метод
Jekis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.