2014-12-12 2 views
5

양식 클래스의 양식을 모달 기반으로 렌더링 한 다음 누른 단추에 따라 다른 작업을 수행합니다. 양식의 목적은 엔티티를 편집하는 것입니다.Modal의 Symfony2 양식이 처리되지 않습니다.

모달로 양식을 표시 할 때 어떤 단추를 눌러도 관계없이 처리하지 않지만 새 탭에서 양식을 렌더링하면 모든 작업이 올바르게 수행됩니다.

이상하게도, 지금 내 코드에서 사용자를 전체 리소스 목록으로 푸시하는 리디렉션이 비활성화되어 있어도 모달 버튼을 클릭해도 페이지가 계속 새로 고쳐집니다.

솔루션 : 나는 그것을 처리를위한 올바른 컨트롤러 액션을 호출하도록 수동으로 모달 폼 형태의 액션을 추가하는 데 필요한

. 이이 솔루션에 도달하기 위해 많은 논의가 없었다, 그래서 다른 사람의 편의를 위해, 여기에 우리가 간다 :

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

내 폼 클래스 :

<?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', 
    )); 
    } 
} 

이 작업에 대한 나의 경로 :

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

내 컨트롤러 액션 :

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(), 
)); 
} 
,536,

당신이 볼 수 있듯이, 어떤 콘솔이 작동을 멈추는 지점을 알아 내기 위해 로깅을해야만했습니다.

새 탭으로 양식을 열면 모두 정상이지만 모달은 아닙니다. 나에게 자바 스크립트가 제대로 작동하는 제출 버튼의 방식으로 나타날 수 있다고 제안되었지만 어디에서 디버깅을 시작해야할지 모르겠습니다.

자세한 정보가 필요하면 알려주세요.

EDIT 1 : 요청에 따라 모달을 정의하고 만드는 방법을 포함합니다. 자원 목록이로드되고 내 resources.html.twig에

, 나는 각 엔티티의 경우,이 같은 링크의 몇 가지있다 :

{% 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 %} 

모달 자체 것은에서 사전 구축이다 Symfony가 Bootstrap 모달을 사용할 때 (예전에 SF를 사용했고, 데이터 나 폼을로드 할 때 SF 나 SF를 사용하는 것이 유일한 방법입니다) : Symfony가 이것을 요구합니다.

<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> 

모달 내용manageResources.html.twig의 내용으로 대체됩니다, 객체 검색하고 양식에로드되면 :

{{ 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) }} 

에 대해이 작업에 참여하고 모든 코드를 다루고있다.

+0

무엇'manageResource.html.twig' 생겼 :이 같은 (올바른 매개 변수와 적응을) 시도 manageResources.html.twig 에서 명시 적 양식의 작업을 설정하려고 할 것인가? 어떻게 모달을 만들 수 있습니까? – paulgv

+0

일부 코드가 필요하기 때문에이 정보를 초기 질문에 추가하고 여기에 모두 들어 맞지 않습니다. – TuxMeister

답변

0

템플릿 코드를 게시 해 주셔서 감사합니다. 최대한 자세히 살펴 보겠습니다. 하나의 아이디어 :

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

거기에는 구두점 오류가있는 것으로 보입니다. 첫 번째 콜론과 마찬가지로 작동하지만 아무 것도 시도하지 않습니다. 또한 실제 변수를 액션과 함께 전달해야합니까? 내가 내 컨트롤러에서 그들을 기대하기 때문에 이것인가? – TuxMeister

+0

감사합니다 paulgv,이 구문을 사용하여 결국 그것은 제대로 작동합니다. 제안서에 캡슐화 문제가 있었지만 다음과 같이 처리되었습니다. {{form_start (form, { 'action': path ('sfi_teacher_manage_resource', { 'id': resource.id, 'action': user_action}}))}. 다시 감사합니다! – TuxMeister

+0

안녕하세요. 편집 해 주셔서 감사 드리며 이미 나뭇 가지가 어떻게 작동하는지 잊어 버리고 있습니다. D 문제가 해결되었음을 알려 줘서 다행입니다. – paulgv

관련 문제