2014-12-12 13 views
5

Sto convertendo un modulo da una classe modulo in base al modale, quindi eseguendo azioni diverse a seconda del pulsante premuto. Lo scopo del modulo è modificare un'entità.Non viene gestito il modulo Symfony2

Quando visualizzo il modulo in modale, non lo elabora a prescindere dal pulsante da premere, tuttavia quando eseguo il rendering del modulo in una nuova scheda, tutte le azioni vengono eseguite correttamente.

Stranamente, anche se nel mio codice in questo momento il reindirizzamento che riporta l'utente indietro all'elenco delle risorse completo è disabilitato, la pagina si aggiorna ancora quando faccio clic su un pulsante modale.

Soluzione:

avevo bisogno di aggiungere manualmente l'azione modulo al modulo nella modale in modo che chiami l'azione di controllo corretto per l'elaborazione. Non c'era molta discussione al fine di raggiungere questa soluzione, in modo da per la comodità degli altri, qui andiamo:

{{ form_start(form, {'action': path('sfi_teacher_manage_resource', { 'id': resource.id, 'action': user_action })}) }} 

La mia classe forma:

<?php 
namespace SFI\MainBundle\Form\Type; 

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

class ManageResourceType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('name', 'text', array(
     'required' => true, 
     'attr' => array(
      'class' => 'form-control', 
      'placeholder' => 'Resource name', 
     ), 
    )) 
     ->add('type', 'choice', array(
     'required' => true, 
     'empty_value' => 'Choose a type', 
     'choices' => array('w' => 'Website', 'v' => 'Video', 'a' => 'Audio'), 
     'attr' => array(
      'class' => 'form-control', 
     ), 
    )) 
     ->add('link', 'text', array(
     'required' => true, 
     'attr' => array(
      'class' => 'form-control', 
      'placeholder' => 'Add a link', 
     ), 
    )) 
     ->add('description', 'textarea', array(
     'required' => true, 
     'attr' => array(
      'class' => 'textarea', 
      'style' => 'width: 100%; height: 200px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;', 
      'placeholder' => 'Write a description...', 
     ), 
    )) 
     ->add('save', 'submit', array(
     'attr' => array(
      'class' => 'btn btn-success', 
     ), 
    )) 
     ->add('remove', 'submit', array(
     'attr' => array(
      'class' => 'btn btn-danger', 
     ), 
    )); 

    } 

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

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
    $resolver->setDefaults(array(
     'data_class' => 'SFI\MainBundle\Entity\Resource', 
    )); 
    } 
} 

il mio percorso per questa azione:

sfi_teacher_manage_resource: 
    path:  /teacher/resource/manage/{action}/{id} 
    defaults: { _controller: SFIMainBundle:Teacher:manageResource } 

La mia azione di controllo:

public function manageResourceAction($id, $action, Request $manage_request) 
{ 
    $logger = $this->get('logger'); 

    $em = $this->getDoctrine()->getManager(); 

    $managedResource = $em->getRepository('SFIMainBundle:Resource')->find($id); 
    $logger->info('Started the manage action'); 

    $manageResourceForm = $this->createForm(new ManageResourceType(), $managedResource); 
    $logger->info('Loaded managedResource into FormType.'); 

    $manageResourceForm->handleRequest($manage_request); 

    if ($manageResourceForm->isValid()) 
    { 

    $logger->info('Form was valid.'); 

    if ($manageResourceForm->get('save')->isClicked()) { 
     $logger->info('Save was clicked, editing resource.'); 
     $managedResource->setStatus("1"); 
     $logger->info('Status set to approved.'); 
     $em->persist($managedResource); 
     $logger->info('Resource was persisted.'); 
    } elseif ($manageResourceForm->get('remove')->isClicked()) { 
     $logger->info('Remove/Decline was clicked'); 
     $em->remove($managedResource); 
     $logger->info('Resource removed.'); 
    } 

    $em->flush(); 
    $logger->info('Flushing...'); 
    $logger->info("Redirecting to teacher's resources..."); 
    //return $this->redirect($this->generateUrl('sfi_teacher_resources')); 
    } 

    return $this->render('SFIMainBundle:Teacher:manageResource.html.twig', array(
    'user_action' => $action, 
    'form' => $manageResourceForm->createView(), 
)); 
} 

Come puoi vedere, ho dovuto inserire alcuni logging della console per capire a che punto l'azione smette di funzionare.

Se apro il modulo come una nuova scheda, tutto va bene, ma non nel modale. Mi è stato suggerito che alcuni JavaScript potrebbero ostacolare il corretto funzionamento dei pulsanti di invio, ma non ho idea di dove iniziare il debugging.

Se necessitate di ulteriori informazioni, fatemelo sapere!

MODIFICA 1: Come richiesto, includo il modo in cui definisco e creo il modale.

Sul mio resources.html.twig, in cui viene caricata l'elenco delle risorse, ho un paio di link come questo, per ogni entità:

{% if r.status == "0" %} 
    <a href="{{ path('sfi_teacher_manage_resource', { 'id': r.id, 'action': 'review' }) }}" data-target="#manageResource" data-toggle="modal" class="btn btn-info bold" id="review"><i class="fa fa-fw fa-check-circle"></i>Review</a> 
{% elseif r.status == "1" %} 
    <a href="{{ path('sfi_teacher_manage_resource', { 'id': r.id, 'action': 'edit' }) }}" data-target="#manageResource" data-toggle="modal" class="btn btn-info" id="edit"><i class="fa fa-fw fa-edit"></i>Edit</a> 
{% endif %} 

Il modale sé è pre-costruito nel lo stesso modello, come Symfony richiede questo quando si lavora con i mod di Bootstrap (ho usato mod un SF prima e questo è l'unico modo che posso pensare di farli funzionare quando si caricano dati o moduli in essi):

<div class="modal fade" id="manageResource" tabindex="-1" role="dialog" aria-labelledby="Manage resource" aria-hidden="true"> 
<div class="modal-dialog"> 
    <div class="modal-content"> 
    Loading... 
    </div> 
</div> 
</div> 

contenuto modale verrà sostituito con il contenuto della manageResources.html.twig, una volta che l'oggetto viene recuperato e caricato nella forma:

{{ form_start(form) }} 
<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
    <h4 class="modal-title" id="myModalLabel">Manage resource</h4> 
</div> 
<div class="modal-body"> 
    {{ form_errors(form) }} 
    <div class="form-group"> 
    {{ form_errors(form.name) }} 
    {{ form_widget(form.name) }} 
    </div> 
    <div class="form-group"> 
    {{ form_errors(form.type) }} 
    {{ form_widget(form.type) }} 
    </div> 
    <div class="form-group"> 
    {{ form_errors(form.link) }} 
    {{ form_widget(form.link) }} 
    </div> 
    {{ form_errors(form.description) }} 
    {{ form_widget(form.description) }} 
</div> 
<div class="modal-footer"> 
    <div class="pull-left"> 
    {% if user_action == "review" %} 
    {{ form_widget(form.save, { 'label': 'Approve' }) }} 
    {{ form_widget(form.remove, { 'label': 'Decline' }) }} 
    {% elseif user_action == "edit" %} 
    {{ form_widget(form.save, { 'label': 'Save' }) }} 
    {{ form_widget(form.remove, { 'label': 'Remove' }) }} 
    {% endif %} 
    </div> 
    <div class="pull-right"> 
    <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> 
    </div> 
</div> 
{{ form_end(form) }} 

Che circa copre tutto il codice che è coinvolto in questa operazione.

+0

Cosa significa 'manageResource.html.twig' assomigliare? Come costruisci il modale? – paulgv

+0

Aggiungo queste informazioni alla mia domanda iniziale in quanto richiede del codice e non riesco a montare tutto qui. – TuxMeister

risposta

0

Grazie per aver pubblicato il codice dei modelli, guarderò più da vicino al più presto. Un'idea: vorrei provare a impostare in modo esplicito l'azione del modulo in manageResources.html.twig provare qualcosa di simile (adattarsi con parametri corretti):

{{ form_start(form, {'action': path('sfi_teacher_manage_resource', { 'id': resource.id, 'action': user_action })}) }} 
+0

Sembra esserci un errore di punteggiatura lì, come il primo colon ma niente di quello che provo funziona. Inoltre, ho davvero bisogno che le mie variabili vengano restituite con l'azione? È perché li sto aspettando nel mio controller? – TuxMeister

+0

Grazie a paulgv, questa è la sintassi che ho usato e funziona correttamente. C'era un problema di incapsulamento con la tua proposta ma questo ha funzionato: {{form_start (form, {'action': path ('sfi_teacher_manage_resource', {'id': resource.id, 'action': user_action})})}}. Grazie ancora! – TuxMeister

+0

Hey scusa per quello! Grazie per la modifica, sto già iniziando a dimenticare come funziona Twig: D Felice di sapere che hai risolto il problema :) – paulgv

Problemi correlati