Как написать контроллер в Symfony2 для редактирования контента с помощью Jeditable
Я использую jeditable плагин для JavaScript и хочу реализовать его в своем проекте 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 ответ
Я думаю, что вам не нужно использовать компонент формы здесь, вы только хотите обработать строку. Поэтому я объясню способ сделать.
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);
}
Twig:
<strong class="edit">{{ cat.name }}</strong>
<script>
var path = "{{ path('edit_category', { 'id': cat.id}) }}";
</script>
jEditable отправляет отредактированный текст с именем 'value', чтобы вы могли получить его в контроллере. В вашем контроллере вы неявно используете paramconverter для получения категории по идентификатору в URL. И это должно быть хорошо сейчас.
Обратите внимание, что вы можете использовать FORJsRoutingBundle, если вы хотите избежать смешивания ветки с javascript для доступа к пути.