Symfony2& AJAX - 如何将AJAX调用与toggleClass()方法集成

时间:2017-02-03 10:14:06

标签: javascript jquery ajax symfony twig

我有一个News个对象的列表。每条新闻都有startDateexpireDate。此外,每条新闻都有state属性。 如果expireDate< date('now),则state设置为0. stateexpireDate > date('now)设置为1。

当我呈现列表时,对于state == 1的新闻,我有一个切换开关(On&amp; Off)来激活或停用新闻(分别为state == 1state == 0)。我无法正确地进行切换。

这是我的按钮和我的jQuery函数的html,它为用户点击的按钮提供了active类:

    //news.html.twig
    {% if news.state == 1 %}
    <div class="btn-group btn-toggle">
        <button class="btn btn-xs btn-primary active">On</button>
        <button class="btn btn-xs btn-default ">Off</button>
    </div>
    {% endif %}

    <script type="text/javascript">
      $('.btn-toggle').click(function() {
          $(this).find('.btn').toggleClass('active');  

          if ($(this).find('.btn-primary').length > 0) {
              $(this).find('.btn').toggleClass('btn-primary');
          }

          $(this).find('.btn').toggleClass('btn-default');
      });
    </script> 

我需要在此处集成$.post调用,以便在用户点击按钮时为新闻设置state。 我想到这样的事情:

$.post('{{ path('set_news_state') }}', {id: 'news.id'}, function(response) {
    if (response.code == 100 && response.success){
        //do something
    }
}, "json");

这些将是我的控制者:

/**
* @Route("/setNewsState/{id}", name = "set_news_state")
* @Method("POST")
**/
public function setNewsOn(Request $request, $id) {
    if ($request->isXMLHttpRequest()) {         
        return new JsonResponse(array('data' => 'this is a json response'));
    }

    $repository = $this->getDoctrine()->getRepository('AppBundle:News');
    $news = $repository->findOneById($id);
    if ($news->getState() == 0) {
        $news->setState(1);
    } else {
        $news->setState(0);
    }

    $em = $this->getDoctrine()->getManager();
    $em->persist($news);
    $em->flush();

    return new Response();
}

如何在我已经工作的jQuery函数中集成$.post调用?

谢谢!

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上,但它比你拥有的更简单。如果您发布到正确的URL,则可以从路由参数中获取新实体的ID。

// news.html.twig
// You can supply a second argument to path() to fill in the route params.
$.post("{{ path('set_news_state', {'id': news.id}) }}").done(function(response) {
    if (response.status === 'ok') {
        // ...
    }
});

然后在您的控制器中

/**
* @Route("/setNewsState/{id}", name="set_news_state")
* @Method("POST")
**/
public function setNewsOn($id) {
    $em = $this->getDoctrine()->getManager();
    $news= $em->find('AppBundle:News', $id);

    if ($news->getState() == 0) {
        $news->setState(1);
    } else {
        $news->setState(0);
    }
    $em->persist($news);
    $em->flush();

    return new JsonResponse(array(
        'status' => 'ok'
    ));
}

最后一件事,

$news = $repository->findOneById($id);是不必要的,因为find()默认搜索ID(嗯,不是,它默认搜索主键,但这几乎总是ID)。

news = $repository->find($id);是一样的,但更清洁。