我正在使用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"}
但问题是没有任何内容发布到数据库中,当我点击刷新时,我所做的更改就消失了。
你能帮我解决这个问题吗?提前致谢! :)答案 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混合以便访问路径。