2014-04-11 7 views
10

मैं रीस्ट एपीआई एंजुलरजेएस पर आधारित ऐप बनाने की कोशिश कर रहा हूं। मैं इस ट्यूटोरियल http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html का पालन कर रहा हूं लेकिन कुछ विवरण (अवमूल्यन विधियों) को बदलना है और अभी जब मैं नई इकाई बनाने के लिए पोस्ट करता हूं तो मुझे लगता है कि 'इस फॉर्म में अतिरिक्त फ़ील्ड नहीं होनी चाहिए' त्रुटि।Symfony2.4 फॉर्म 'इस फ़ॉर्म में अतिरिक्त फ़ील्ड नहीं होनी चाहिए' त्रुटि

class MainController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     $form = $this->createForm(new TaskType(),null,array('action' => $this->generateUrl('post_tasks').'.json')) 
       ->add('submit','submit'); 


     $note_form = $this->createForm(new NoteType()) 
       ->add('submit','submit'); 

     return $this->render('MyBundle:Main:index.html.twig', 
       array(
        'form'=>$form->createView(), 
        'note_form'=>$note_form->createView(), 
       ) 
     ); 
    } 
} 

मेरी TaskType प्रपत्र:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 

      ->add('timeStart','datetime',array(
       'date_widget' => 'single_text', 
       'time_widget' => 'single_text', 
       'date_format' => 'yyyy-MM-dd', 
       'data' => new \DateTime('now') 
      )) 

      ->add('timeStop','datetime',array(
       'date_widget' => 'single_text', 
       'time_widget' => 'single_text', 
       'date_format' => 'yyyy-MM-dd', 
       'data' => new \DateTime('now') 
      )) 

      ->add('project') 
      ->add('descriptionTask') 
      ->add('isCompleted',null,array('required' => false)) 
      ->add('isVisible',null,array('required' => false)) 
     ; 
    } 

अभी मेरे विचार में मैं केवल एक प्रपत्र लेकिन मैं परीक्षण चरण तैयार हूं प्रतिपादन कर रहा हूँ:

{%extends 'MyBundle::layout.html.twig' %} 

{%block content %} 

<div ng-view></div> 

{{ form(form) }} 

{% endblock %} 

और इस आरईएसटी नियंत्रक है जो दिया गया इकाई फ्लश करना है:

public function cpostAction(Request $request) 
{ 
$entity = new Task(); 
$form = $this->createForm(new TaskType(), $entity); 
$form->handleRequest($request); 

if ($form->isValid()) { 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 

    return $this->redirectView(
      $this->generateUrl(
       'get_organisation', 
       array('id' => $entity->getId()) 
       ), 
      Codes::HTTP_CREATED 
      ); 
} 

return array(
    'form' => $form, 
); 
} 

अजीब बात यह है: जब मैं MainController के बाकी नियंत्रक से एक ही कोड शब्दों में कहें, तो प्रपत्र और नई इकाई मान्य है प्लावित किया जा रहा है, लेकिन किसी भी तरह बाकी नियंत्रक त्रुटि फेंकता है ...

उत्तर

11

इसकी क्योंकि जब आप पैदा कर रहे हैं जिस फॉर्म को आप जोड़ रहे हैं बटन सबमिट कर रहे हैं लेकिन जब आप उन्हें मान्य कर रहे हैं तो आप नहीं हैं। प्रयास करें:

public function cpostAction(Request $request) 
{ 
    $entity = new Task(); 
    $form = $this->createForm(new TaskType(), $entity)->add('submit','submit'); 
    ... 

सबमिट बटन पर तकनीकी रूप से एक क्षेत्र भले ही सिम्फोनी अभ्यस्त डिफ़ॉल्ट रूप से एक इकाई संपत्ति से मैप है। तो जब आप सबमिट बटन के साथ फॉर्म जेनरेट करते हैं और उसके बाद उस फॉर्म को सबमिट करते हैं जो आपके सत्यापन कंट्रोलर एक्शन में उत्पन्न होता है तो सबमिट बटन भी होना चाहिए।

+0

आपको बहुत बहुत धन्यवाद! – mmmm

+0

समाधान के लिए बहुत धन्यवाद। क्या आपको पता है कि कोई समाधान है जिसके लिए मुझे अपने फॉर्म हैंडलरों में से प्रत्येक पर ऐसा करने की आवश्यकता नहीं है? – Jonathan

+1

हाँ इसके बाद सबमिट को जोड़ने के बजाय इसे अपने प्रकार – Chausser

4

आप अक्षम क्षेत्रों सत्यापन करना चाहते हैं, तो आप जोड़ना आवश्यक

public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'csrf_protection' => false, 
     'validation_groups' => false, 
    )); 
} 

और buildForm विधि में:

public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) { 
      $event->stopPropagation(); 
     }, 900); 
     $builder->add('field1','text') 
       ->add('field2','text') 
       . 
       . 
       . 
    } 

अधिक जानकारी के लिए: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation

+5

में जोड़ें ध्यान रखें कि सीएसआरएफ को अक्षम करना एक भयानक, भयानक सुरक्षा अभ्यास है। संभावना है कि समस्या को हल करने का हमेशा एक बेहतर तरीका है। – csvan

+1

@csvan लेकिन आराम से एपीआई –

14

यदि आप चाहते हैं अतिरिक्त अनदेखी करने के लिए सत्यापनकर्ता फ़ील्ड आपको फॉर्मबिल्डर के विकल्प के रूप में 'allow_extra_fields' => true पास करने का प्रयास करना चाहिए।

+4

के लिए भी नहीं नोट: 'allow_extra_fields' विकल्प सिम्फनी v2.6 में जोड़ा गया है – biphobe

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