【问题标题】:Form call with AJAX使用 AJAX 进行表单调用
【发布时间】:2014-10-30 15:45:40
【问题描述】:

当我尝试使用 ajax 发送表单时遇到问题。

我的树枝:

<div class="admin_creation"></div>


<script type="text/javascript">

    $('.admin_creation').ready(
    function () {
        var id = {{ elem.id }}
        $.ajax({
            data:'id='+id,
            url: Routing.generate('creation_update'),
            success: function(response){
                console.log('ok');
                $('.admin_creation').prepend(response);
            },
            error: function(){
                console.log('fail');
            }
        });
    })

</script>

我的路线:

creation_update:
    path: /detail/update
    defaults: { _controller: NemiTwigBundle:Default:update }
    options:
        expose: true

我的控制器:

public function updateAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $id = $request->query->get('id');
    $creation = $em->getRepository('NemiTwigBundle:Creation')->findOneById($id);

    //at this point, if i print_r($creation), there is nothing. The $id is correct.
    //when i print($creation), the __tostring method is working and display the right
    //name of the creation.


    $form = $this->createFormBuilder()->add('price', 'integer')
                                      ->add('submit', 'submit')
                                      ->getForm();

    $form->handleRequest($request);

    if ($form->isValid())
    {
        $creation->setPrice($form['price']->getData());
        $em->persist($creation);
        $em->flush();

        return new Response();

        return $this->redirect($this->generateUrl('creation_detail', array('id' => $id)));
    }

    return $this->render('NemiTwigBundle::creation_update_form.html.twig', array('form' => $form->createView()));
}

形式:

<form action="{{ path('creation_update') }}" {{ form_enctype(form) }} method="POST">
    {{ form(form) }}
</form>

我的实际问题是我在控制器中的 id 是正确的 id,有这个 id 的创建实体但是当我尝试使用学说加载这个创建时,它不起作用(我认为它不适用于私有属性和方法导致当我尝试print($creation) 时,__toString 方法可以正常工作并给出正确的结果)。

编辑:对于第一个答案,

我按照你的建议尝试了这个控制器:

public function updateAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $id = $request->query->get('id');
    $creation = $em->getRepository('NemiTwigBundle:Creation')->findOneById($id);

    $form = $this->createFormBuilder($creation)->add('price', 'integer')
                                      ->add('submit', 'submit')
                                      ->getForm();

    $form->handleRequest($request);

    if ($form->isValid())
    {
        $em->persist($creation);
        $em->flush();

        return $this->redirect($this->generateUrl('creation_detail', array('id' => $id)));
    }

    return $this->render('NemiTwigBundle::creation_update_form.html.twig', array('form' => $form->createView()));

但我收到了这个错误:

给定类型“字符串、Symfony\Component\Form\ResolvedFormTypeInterface 或 Symfony\Component\Form\FormTypeInterface”、“Nemi\TwigBundle\Entity\Creation”的预期参数

【问题讨论】:

  • $this->createFormBuilder($creation)->...?除此之外,我不太确定你的意思。您尝试保存实体,但加载时保存的数据不存在?
  • 你好,我正在尝试更新现有的创作。所以创作存在,我尝试更新价格。但是当我尝试使用 findById() 加载实体时,我无法 print_r 它(检查它是否工作)。但是当我尝试访问公共属性或方法时,它正在工作,所以很奇怪。我会用更多细节更新我的问题
  • @hadesMM 为什么不将 id 传递给更新操作?此外,当您更新实体时,我认为无需保留它。
  • 这是一个 ajax 请求,我必须像以前一样传递 id,并且我需要持久化该项目以将其保存在数据库中。

标签: ajax forms symfony


【解决方案1】:
$form = $this->createFormBuilder($creation)->add('price', 'integer')
                                      ->add('submit', 'submit')
                                      ->getForm();

问题是您当前创建的表单没有实体。

你基本上在做的是

  1. 加载实体
  2. 创建表单
  3. 将请求中的变量放入表单中
  4. 保存实体。

您没有将实体添加到表单中。 如果您使用加载的实体创建表单,它会将更改的值添加到实体。

【讨论】:

  • 您好,谢谢您的回答,我按照您所说的尝试过,但仍然无法正常工作,我可能会失败:/ ps:我已经用新控制器编辑了我的问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2013-01-11
  • 2011-07-11
相关资源
最近更新 更多