Skip to main content
 首页 » 编程设计

jquery之模式中的 Symfony2 表单未处理

2026年09月08日2birdshome

我将表单从表单类渲染为基于模式的表单,然后根据按下的按钮执行不同的操作。表单的目的是编辑实体。

当我在模式中显示表单时,无论我按哪个按钮,它都不会处理它,但是当我在新选项卡中呈现表单时,所有操作都会正确执行。

奇怪的是,即使现在在我的代码中禁用了将用户推回完整资源列表的重定向,但当我单击模式按钮时页面仍然会刷新。

解决方案:

我需要手动将表单操作添加到模式中的表单,以便它调用正确的 Controller 操作进行处理。为了达到这个解决方案,没有进行太多讨论,因此为了其他人的方便,我们开始:

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

我的 Controller 操作:

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

如您所见,我必须写入一些控制台日志记录才能确定操作在何时停止工作。

如果我将表单作为新选项卡打开,一切都很好,但不是在模式中。有人向我建议,某些 JavaScript 可能会妨碍提交按钮正常工作,但我不知道从哪里开始调试。

如果您需要更多信息,请告诉我!

编辑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 模态时要求如此(我之前使用过模态 un SF,这是我能想到让它们工作的唯一方法将数据或表单加载到其中时):

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

一旦检索到对象并将其加载到表单中,modal-content 就会被 ma​​nageResources.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) }} 

这大约涵盖了此操作中涉及的所有代码。

请您参考如下方法:

感谢您发布您的模板代码,我会尽快仔细查看它。 一个想法:我会尝试在 ma​​nageResources.html.twig 中明确设置表单的操作 尝试这样的事情(使用正确的参数进行调整):

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