Обновлять только одно свойство данного объекта - PullRequest
0 голосов
/ 12 мая 2019

У меня есть сущность с именем worker, и у каждого работника есть свойство active, которое имеет логическое значение.

Моя ветка - это индекс, который показывает список работников с active = true.У меня есть кнопка перед каждым работником, и когда я нажимаю эту кнопку, я хочу, чтобы она сменила активное свойство этого работника на false.

Проблема : я не мог понять, какизмените это значение в контроллере, не создавая форму, так как я все еще любитель, когда дело доходит до Symfony

Вот моя веточка:


<table id="file_export" class="table table-striped table-bordered">

        <thead>
            <tr>
                <th>ID</th>
                <th>First Name</th>
                <th>Last name</th>
                <th>Active</th>
                <th>edit</th>
            </tr>
        </thead>
        <tbody>
        {% for worker in workers %}
            <tr>
                <td>{{ worker.id }}</td>
                <td>{{ worker.Firstname }}</td>
                <td>{{ woker.Lastname }}</td>
                <td>{{ worker.active ? 'active' : 'inactive' }}</td>
                <td>
                    <a href="{{ path('worker_edit', {'id': worker.id}) }}" class="btn btn-round btn-info" role="button"><i class="fa fa-pencil"></i></a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>

и мой контроллер (который не работает):

    /**
     * @Route("/{id}/edit", name="worker_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, Worker $worker): Response
    {
        if ($this->isCsrfTokenValid('edit'.$worker->getId(), $request->request->get('_token'))) {
            $worker->setActive(false);

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($worker);
            $entityManager->flush();
        }

        return $this->redirectToRoute('index');
    }

Ответы [ 2 ]

1 голос
/ 12 мая 2019

вам на самом деле нужно добавить токен csrf к вашему вызову пути:

path('worker_edit', {'id': worker.id, '_token': csrf_token('worker'~worker.id)}) 

или в противном случае проверка на токен csrf, очевидно, не может быть успешной.

однако, так как ссылка сработаетGET запрос, вы должны посмотреть на

$request->query->get('_token')

в вызове isCsrfTokenValid.

Подсказка: назовите ваши маршруты и действия семантически лучшими именами.Как ... "worker_deactivate", если он используется для деактивации работника (что, очевидно, так и есть). также довольно часто вызывать маршрутизированные методы контроллера action Action, так что это будет deactivateAction.

0 голосов
/ 12 мая 2019

Если вы хотите отправлять HTTP-запросы без перезагрузки веб-страницы, вам нужно будет выполнять вызовы AJAX.Очень простая реализация, использующая fetch , которая не требует никаких дополнительных пакетов (например, jQuery), выглядела бы так:

<script>
(function() {
    document.getElementById({{worker.id}}).addEventListener('click', function(e) {
        e.preventDefault();
        fetch({{path('worker_edit', {'id': worker.id})}}, {method: 'POST'})
            .then(function(response) {
                // you can catch eventual errors here, and of course refresh your button or display a nice message..

            });
    });
})()
</script>
<table id="file_export" class="table table-striped table-bordered">

        <thead>
            <tr>
                <th>ID</th>
                <th>First Name</th>
                <th>Last name</th>
                <th>Active</th>
                <th>edit</th>
            </tr>
        </thead>
        <tbody>
        {% for worker in workers %}
            <tr>
                <td>{{ worker.id }}</td>
                <td>{{ worker.Firstname }}</td>
                <td>{{ woker.Lastname }}</td>
                <td>{{ worker.active ? 'active' : 'inactive' }}</td>
                <td>
                    <a href="{{ path('worker_edit', {'id': worker.id}) }}" class="btn btn-round btn-info" role="button"><i class="fa fa-pencil"></i></a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>

ps: приведенный выше код javascript не тестируется, как у менявоспроизвести веточку и контроллер, но это может дать вам представление о том, как выполнить задачу.

...