2013-07-15 4 views
14

मेरे पास एक ग्राहक इकाई है जिसमें केवल एक अद्वितीय ईमेल फ़ील्ड है। मैं ग्राहक के ईमेल को संपादित करने की कोशिश कर रहा हूं और सत्यापन ठीक काम करता है। हालांकि मैं अपने नियंत्रक में इस है:Symfony2: मेरा फॉर्म isValid() से झूठा रिटर्न देता है लेकिन अद्वितीय बाधा स्थिति से getErrors() के लिए खाली सरणी

public function updateAction(Request $request, $id) { 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('AcmeDemoBundle:Customer')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Customer entity.'); 
    } 


    $editForm = $this->createForm(new CustomerType(), $entity); 
    $editForm->bind($request); 
    if ($editForm->isValid()) { 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('ticket_result')); 
    } 
    var_dump($editForm->getErrors()); 

    return $this->render('AcmeDemoBundle:Customer:edit.html.twig', array(
       'entity' => $entity, 
       'edit_form' => $editForm->createView(), 
    )); 
} 

var_dump एक खाली सरणी देता है लेकिन सत्यापनकर्ता एक अनूठा त्रुटि सेट करता है और $editForm->isValid() रिटर्न झूठी। प्रमाणीकरण के दौरान नियंत्रक में उस विशिष्ट त्रुटि की जांच करने का कोई तरीका है, क्या आप यह भी समझा सकते हैं कि यह एक खाली त्रुटि सरणी क्यों देता है? असल में, अगर यह त्रुटि आती है तो मैं "विलय" विकल्प प्रदान करना चाहता हूं।

संपादित:

namespace Acme\DemoBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CustomerType extends AbstractType { 


    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder 
       ->add('email', 'email', array('required'=>true)) 
     ; 

    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\DemoBundle\Entity\Customer', 
      'cascade_validation' => true, 
     )); 
    } 

    public function getName() { 
     return 'acme_demobundle_customertype'; 
    } 
} 

और टहनी टेम्पलेट: यहां formtype है

Acme\DemoBundle\Entity\Customer: 
    constraints: 
     - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
      fields: email 
      message: "A customer under that email address already exists" 

    properties: 
     email: 
      - Email: ~ 
+0

क्या आपके ग्राहक के पास कोई उप-रूप है? – nifr

+0

अपना टेम्पलेट दिखाएं, कृपया – Ziumin

+0

मैंने पोस्ट अपडेट किया है और सत्यापन, टेम्पलेट और फॉर्मटाइप –

उत्तर

4

ठीक है, एक जवाब मिला:

{% extends 'AcmeDemoBundle::layout.html.twig' %} 
{% block body -%} 
    <h1>Customer edit</h1> 



    <form action="{{ path('customer_update', { 'id': entity.id }) }}" method="post" {{ form_enctype(edit_form) }}> 
     <input type="hidden" name="_method" value="PUT" /> 
     {{ form_widget(edit_form) }} 
     <p> 
      <button type="submit">Edit</button> 
     </p> 
    </form> 

{% endblock %} 

यहाँ मेरी मान्यता है :

Symfony2 invalid form without errors

यह पता चलता है कि प्रत्येक रूप में बच्चे की अपनी अलग त्रुटियां होती हैं। जब

$editForm->getChildren()['email']->getErrors() 

के var_dump कर मैं:

array (size=1) 
    0 => 
    object(Symfony\Component\Form\FormError)[531] 
     private 'message' => string 'A customer under that email address already exists' (length=50) 
     protected 'messageTemplate' => string 'A customer under that email address already exists' (length=50) 
     protected 'messageParameters' => 
     array (size=0) 
      empty 
     protected 'messagePluralization' => null 

मैं अभी भी सोच रहा हूँ निर्धारित करने के लिए कैसे उस त्रुटि त्रुटि संदेश स्ट्रिंग पार्स करने के बिना एक अनूठा संघर्ष की वजह से है।

+3

'$ संपादित करेंफॉर्म-> getErrors (true) 'अब बच्चों से रिकॉर्ड्स (2.5 के बाद से) में त्रुटियों को वापस कर देगा। – contrebis

1

आप अपने क्षेत्र में त्रुटि को बुलबुला करने के लिए प्रत्येक फ़ील्ड में error_bubbling का उपयोग कर सकते हैं।

यदि नहीं, तो आप भी

foreach ($children as $child) { 
      if ($child->hasErrors()) { 
       $vars = $child->createView()->getVars(); 
       $errors = $child->getErrors(); 
       foreach ($errors as $error) { 
        $this->allErrors[$vars["name"]][] = $this->convertFormErrorObjToString($error); 
       } 
      } 
} 
17

डिबग प्रयोजनों के लिए आप $form->getErrorsAsString() बजाय $form->getErrors() उपयोग कर सकते हैं अगर आप Symfony 2. *

this answer से उद्धरित का उपयोग त्रुटियों के माध्यम से foreach कर सकते हैं:

$form->getErrorsAsString() केवल फ़ॉर्म को डीबग करने के लिए उपयोग किया जाना चाहिए ... यह में प्रत्येक बच्चे तत्वों की त्रुटियां होंगी जो n है ओएस मामले $ फॉर्म-> getErrors()।


अद्यतन 1:

"और हाल ही में Symfony संस्करणों के साथ, आप का उपयोग करना चाहिए $form->getErrors(true, false); बजाय सबसे पहले परम deep से मेल खाती है और दूसरे को flatten।"

+1

getErrorsAsString को 3.0 में हटाए जाने के लिए संस्करण 2.5 के बाद से बहिष्कृत किया गया है। इसके बजाय getErrors()} का उपयोग करें और परिणाम को एक स्ट्रिंग पर डालें। –

+0

क्या इसमें बाल रूपों की त्रुटियां भी शामिल होंगी? –

+1

@ डेनेसपैप वैकल्पिक बूलियन परम को किसी भी बच्चे के रूपों के माध्यम से कैस्केड करने के लिए पास करता है $ form-> getErrors (true); – ChristoKiwi

0
(@Roubi द्वारा टिप्पणी देखें) सिम्फनी 2 में

।3, तो आप इस एक का उपयोग कर सकते हैं:

if ($form->isValid()){ 
    # Code... 
} else { 
    foreach ($form->getIterator() as $key => $child) { 
     if ($child instanceof Form) { 
      foreach ($child->getErrors() as $error) { 
       $errors[$key] = $error->getMessage(); 
      } 
     } 
    } 
} 

यह आपको बच्चों से त्रुटियों के साथ एक सरणी ($errors) मिल जाएगा।

-1

जब फॉर्म सबमिट किया गया है और मान्य नहीं है तो आप dump फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं। मैं इसे इस तरह

if($form->isSubmited() && $form->isValid()){ 
    //SAVE TO DATABASE AND DO YOUR STUFF 
}else if($form->isSubmited()){ 
    //SUBMITED BUT WITH ERRORS 
    dump($form->getErrors(true)); 
    die(); 

} 

नोट इस डीबगिंग उद्देश्यों के लिए है का उपयोग केवल, यह आपको अपने फार्म, उस में डेटा और सभी त्रुटियों को किसी भी क्षेत्र हो सकता है दिखाएगा। उत्पादन मोड में आपको त्रुटि को दृश्य में वापस करना चाहिए और उन्हें उपयोगकर्ता को दिखाना चाहिए।

संबंधित मुद्दे