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 () मेथड में एरर बनाने के लिए एरर जुड़ता है, एलिमेंट नहीं। मैं स्थानरेडियस तत्व में त्रुटि कैसे जोड़ सकता हूं?

जवाबों:


178

तुम कर सकते हो

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

जैसा कि तत्व तत्व भी FormInterfaceप्रकार के होते हैं।


@ m2mdas, महान जवाब! हम इसका अनुवाद कैसे करेंगे? क्योंकि एक बार जब हम एक FormError उदाहरण बनाते हैं, तो वह इसका अनुवाद नहीं करेगा, क्या मैं सही हूं? मैंने कोशिश की और यह इसका अनुवाद नहीं करता है, और मुझे लगता है कि यह समझ में आता है। आप फॉर्मर उदाहरण का अनुवाद कैसे करेंगे?
मिक

2
हैलो @Patt, देर से उत्तर के लिए खेद है। त्रुटि संदेश के रूप में जोड़े जाने से पहले सत्यापनकर्ता घटक बाधा उल्लंघन संदेशों के अनुवाद का ध्यान रखता है। कस्टम एरर जोड़ने के लिए आपने मैसेज को उसी तरह ट्रांसलेट किया है जैसे आप अन्य स्ट्रिंग्स के लिए करते हैं, जैसे$this->get('translator')->trans('error message')
मुन मुन दास

1
@ एम 2 एमदास लेकिन आप इस त्रुटि को अपने विचार में कैसे छापते हैं? मैंने यह कोशिश की, लेकिन यह form_errors(form)मेरी टहनी में नहीं जाता है।
नेट नेडेनोवा

1
@NatNaydenova मुझे पता है कि यह एक समय हो गया है, लेकिन कोशिश करेंform_erros(form.my_field_name)
17

3
कृपया ध्यान दें: form_errors (फ़ॉर्म) का उपयोग करके प्रिंट करने के लिए एक त्रुटि प्राप्त करने के लिए, अपनी त्रुटि को फ़ॉर्म में स्वयं जोड़ें जैसे $ फॉर्म-> addError (नया फॉर्मरोर ('त्रुटि संदेश');
beterthanlife

8

ठीक है दोस्तों, मेरे पास एक और तरीका है। यह अधिक जटिल है और केवल विशिष्ट मामलों के लिए है।

मेरा मामला:

मेरे पास एक फॉर्म है और सबमिट करने के बाद मैं एपीआई सर्वर पर डेटा पोस्ट करता हूं। और त्रुटियाँ मुझे एपीआई सर्वर से भी मिलीं।

एपीआई सर्वर त्रुटि प्रारूप है:

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 = new ViolationMapper ();
विद्या विदेनी

@vidyvideni, कंट्रोलर एक्शन जहां फॉर्म सबमिट किया जाएगा। इसके अलावा आप कोड के इस टुकड़े को समायोजित कर सकते हैं और इसे एक अलग विधि में स्थानांतरित कर सकते हैं
जेकिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.