Thêm lỗi vào phần tử biểu mẫu Symfony 2


83

Tôi kiểm tra một số xác nhận trong bộ điều khiển của mình. Và tôi muốn thêm lỗi vào phần tử cụ thể của biểu mẫu khi bị lỗi. Hình thức của tôi:

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

Phương thức addError () thêm lỗi vào biểu mẫu chứ không phải vào phần tử. Làm cách nào để thêm lỗi vào phần tử locationRadius?

Câu trả lời:


178

Bạn có thể làm

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

Vì các phần tử hình thức cũng thuộc FormInterfaceloại.


@ m2mdas, câu trả lời tuyệt vời! Làm thế nào chúng tôi sẽ dịch điều này? bởi vì một khi chúng ta tạo một cá thể FormError, nó sẽ không dịch nó, tôi nói đúng không? Tôi đã thử và nó không dịch nó, và tôi nghĩ nó có lý. Bạn sẽ dịch một phiên bản FormError như thế nào?
Mick

2
Xin chào @Patt, xin lỗi vì trả lời muộn. Thành phần trình xác thực đảm nhận việc dịch các thông báo vi phạm ràng buộc biểu mẫu trước khi thông báo lỗi được thêm vào biểu mẫu. Để thêm lỗi tùy chỉnh bạn có dịch cùng một thông điệp cách như bạn làm cho các chuỗi khác ví dụ như,$this->get('translator')->trans('error message')
Mun Mun Das

1
@ m2mdas Nhưng làm thế nào để bạn in ra lỗi này theo cách của bạn? Tôi đã thử điều này, nhưng nó không đi vào chiều sâu form_errors(form)của tôi.
Nat Naydenova

1
@NatNaydenova Tôi biết đã lâu nhưng hãy thửform_erros(form.my_field_name)
TMichel

3
Hãy lưu ý: để nhận được một lỗi in bằng form_errors (theo mẫu), thêm lỗi vào biểu mẫu riêng của mình ví dụ như $ form-> addError (FormError mới ( 'lỗi msg');
beterthanlife

8

OK các bạn, tôi có cách khác. Nó phức tạp hơn và chỉ dành cho những trường hợp cụ thể.

Trường hợp của tôi:

Tôi có một biểu mẫu và sau khi gửi, tôi đăng dữ liệu lên máy chủ API. Và lỗi tôi cũng nhận được từ máy chủ API.

Định dạng lỗi máy chủ API là:

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

Mục tiêu của tôi là có được giải pháp linh hoạt. Hãy đặt lỗi cho trường tương ứng.

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

Đó là nó!

GHI CHÚ! addError()phương thức bỏ qua tùy chọn error_mapping .


Biểu mẫu của tôi (Biểu mẫu địa chỉ được nhúng trong Biểu mẫu công ty):

Công ty

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

Địa chỉ

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

bạn đặt những mã này ở đâu? $ vm = new ViolationMapper ();
vidy videni

@vidyvideni, Hành động của người điều khiển nơi xử lý gửi biểu mẫu. Ngoài ra, bạn có thể điều chỉnh đoạn mã này và chuyển nó sang một phương pháp riêng
Jekis 27/11/15
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.