如何在Symfony2中编写控制器以使用Jeditable编辑内容

时间:2013-05-31 06:37:09

标签: symfony jeditable

我正在使用JavaScript的jeditable插件,我想在我的Symfony2项目中实现它。我想编辑一个带有插件的名称和要在数据库中编辑的名称,而不是当我刷新页面时要做的更改,但在我的情况下,它已经消失了。 :(

我几乎可以肯定控制器不应该这样,问题来自于它,但是如何编写呢?这是:

public function editCategoryAction(Request $request, $id)
{   
    $category = $this->repository->find($id);      
    $form = $this->createForm(new CategoryType(), $category);

    if ($request->isMethod('POST')) {
        $form->bind($request);

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

            return $this->redirect($this->generateUrl('categories'));
        }
    }

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

这是我的模板

    <a href="{{ path('edit_category', { 'id': cat.id}) }}">
        <strong class="edit">
            {{ cat.name }}
        </strong>
    </a> 

<script>
    var token = "{{form._token.vars.value}}";
    var path = "{{ path('edit_category', { 'id': cat.id}) }}";
</script>

这是在 .js文件

(function(){
     $('.edit').editable(function (value, settings) {
            var data = {};
            data[this.id] = value;
            data["_token"] = token;
            console.log(path);
            console.log(data);
            $.post(path, data);
                return(value);
            }, {
                indicator:'Saving...'
            });
}) ();

控制台中的输出看起来很好:

/BudgetTracker/web/app_dev.php/edit_category/52
Object {: "Edu", _token: "9d29860b59ccafbc265ea12346c91fa7e378cc97"} 

但问题是没有任何内容发布到数据库中,当我点击刷新时,我所做的更改就消失了。

你能帮我解决这个问题吗?提前致谢! :)

1 个答案:

答案 0 :(得分:1)

我认为你不需要在这里使用表单组件,你只想处理一个字符串。所以我将解释一种方法。

<强> JavaScript的:

$('.edit').editable(path);

<强>控制器:

public function editCategoryAction(Category $category)
{   
    //check if exists/valid

    //get the text sent from jeditable
    $name = $this->request->get('value');
    $category->setName($name);

    $em = $this->getDoctrine()->getManager();
    $em->persist($category);
    $em->flush();
    //return the name value to jeditable so it can display it
    return new Response($name);     
}

<强>嫩枝:

<strong class="edit">{{ cat.name }}</strong>

<script>
    var path = "{{ path('edit_category', { 'id': cat.id}) }}";
</script>

jEditable发送名为'value'的编辑文本,因此您可以在控制器中获取它。在您的控制器中,您隐式使用paramconverter从URL中的id获取类别。现在应该没问题。

请注意,您可以使用FORJsRoutingBundle,如果您想避免将twig与javascript混合以便访问路径。