Как написать контроллер в 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 для доступа к пути.

Другие вопросы по тегам