양식 클래스의 양식을 모달 기반으로 렌더링 한 다음 누른 단추에 따라 다른 작업을 수행합니다. 양식의 목적은 엔티티를 편집하는 것입니다.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">×</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) }}
에 대해이 작업에 참여하고 모든 코드를 다루고있다.
무엇'manageResource.html.twig' 생겼 :이 같은 (올바른 매개 변수와 적응을) 시도 manageResources.html.twig 에서 명시 적 양식의 작업을 설정하려고 할 것인가? 어떻게 모달을 만들 수 있습니까? – paulgv
일부 코드가 필요하기 때문에이 정보를 초기 질문에 추가하고 여기에 모두 들어 맞지 않습니다. – TuxMeister