Как обновить объект в symfony 3?

Я хочу обновить информацию в профиле, но после всего, что я сделал, ничего не произошло ..

Я использую ajax для отправки данных из ветки в updateAction ..

ajax:

 $(document).ready(function ()
        {
            $("#btnEnregistrer").click(function () {

                var URL = "{{path('profile_update')}}";
                var n = $('#txtNom').val();
                var nAr = $('#txtNomAr').val();
                var pre = $('#txtPrenom').val();
                var preAr = $('#txtPrenomAr').val();
                var passOld = $('#txtPassOld').val();
                var pass1 = $('#txtPassNew').val();
                var pass2 = $('#txtPassNew2').val();
                var dateN = $('#txtDateN').val();
                var ad = $('#txtAdresse').val();
                var adAr = $('#txtAdresseAr').val();
                var mob = $('#txtMobile').val();
                var fixe = $('#txtFixe').val();

                var sexe ;
                if ($('#rbHomme').is(':checked'))
                    sexe = "Homme";
                else
                    if ($('#rbFemme').is(':checked'))
                        sexe = "Femme";

                 var DATA = 'nom='+n+'&nomAr='+nAr+'&prenom='+pre+'&prenomAr='+preAr+'&sexe='+sexe+'&passOld='+passOld+'&passNew='+pass1+'&passNew2='+pass2+'&dateN='+dateN+'&adresse='+ad+'&adresseAr='+adAr+'&mobile='+mob+'&fixe='+fixe;

                $.ajax({
                 type: "POST",
                    url: URL,
                    data: DATA,
                    cache: false
                });
            });

});  

{{path ('profile_update')}} - это маршрут updateAction:

public function updateAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        if ($request->isXmlHttpRequest()) {

        $utilisateur = $this->get('session')->get('user');

        $Vparam = $em->getRepository('ParametersBundle:Parameter')->findOneBy(['id' => $utilisateur->getVille()]);

        $utilisateur->setNom($request->get('nom'));
        $utilisateur->setNomAr($request->get('nomAr'));
        $utilisateur->setPrenom($request->get('prenom'));
        $utilisateur->setPrenomAr($request->get('prenomAr'));


        $s = $request->get('sexe');

        if ($s == "Homme")
        {
            $utilisateur->setSexe("Homme");
            $utilisateur->setSexeAr("ذكر");
        }
        else
        {
            $utilisateur->setSexe("Femme");
            $utilisateur->setSexeAr("أنثى");
        }

        $utilisateur->setDateN($request->get('dateN'));
        $utilisateur->setAdresse($request->get('adresse'));
        $utilisateur->setAdresseAr($request->get('adresseAr'));


        if ($request->get('passOld') ! = "" && $request->get('passNew') ! = "" && $request->get('passNew2') ! = "")
        {
            if ($request->get('passOld') == self::getHash($utilisateur->getPassword(), $utilisateur->getSalt()))
            {
                if ($request->get('passNew') == $request->get('passNew2'))
                {
                    $utilisateur->setPassword(self::getHash($request->get('passNew'), $utilisateur->getSalt()));
                }
                else
                { 
                    return $this->redirectToRoute('ens_profile');
                }
            }
            else
            {
               return $this->redirectToRoute('ens_profile');
            }
        }

        $em->flush();

        return $this->redirectToRoute('ens_profile');

    }

route.yml:

persons_connexion:
    path:     /connexion
    defaults: { _controller: PersonsBundle:Default:connexion }

persons_deconnexion:
    path:     /deconnexion
    defaults: { _controller: PersonsBundle:Default:deconnexion }

ens_profile:
    path:     /Enseignant/profile
    defaults: { _controller: PersonsBundle:Enseignant:profile }

profile_update:
    path:     /Enseignant/profile/miseajour
    defaults: { _controller: PersonsBundle:Enseignant:update }

параметры отображаются в Symfony Profiler как параметры POST .. но когда я посмотрел на таблицу в базе данных, я обнаружил, что ничего не произошло .. Так в чем проблема? и как я могу это решить?

Ваша проблема в том, что объект User не существует в entityManager. Вы должны сообщить своему em, что это мой объект User. Entity Manager не знает, что выходит за рамки его возможностей. (как сеанс)

Mert Öksüz 27.05.2018 20:04

Вы используете аннотацию или yml для маршрутов? Если вы используете аннотацию, обновите свой вопрос, включив аннотацию над вашей функцией. Я дам ответ позже

Preciel 27.05.2018 20:06

Нет, я использую yml для маршрутов

Dev 27.05.2018 20:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 280
2

Ответы 2

Вам необходимо установить $em->persist($utilisateur) перед сбросом, если он не исходит от вашего менеджера сущностей.

Раньше я читал в документации Symfony, что вызывать $ em-> persist ($ utilisateur) не нужно. Напомним, что этот метод просто указывает Doctrine управлять или «наблюдать» за объектом $ utilisateur. В этом случае, поскольку вы получили объект $ utilisateurobject из Doctrine, он уже управляется.

Dev 27.05.2018 19:48

если вы работаете с существующим объектом в entitymanager, вы не можете его сохранить. это уже сохраняется. вы можете обновить его только методом flush.

Mert Öksüz 27.05.2018 20:01

Я считаю, что это верно только для существующих сущностей (извлеченных из базы данных). $utilisateur = $this->get('session')->get('user'); следует этому правилу?

The_Dod 27.05.2018 20:02

@The_Dod Это не ответ ... используйте комментарии для таких вещей.

Preciel 27.05.2018 20:05

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

Dev 27.05.2018 20:15

Не знаю, лучше ли это сделать, но я бы получил идентификатор пользователя и извлек его из базы данных с помощью $ em, затем применил к нему изменения и, наконец, сбросил его. @Preciel Я отформатировал свой ответ, чтобы попытаться соответствовать вашим ожиданиям от ответа, пожалуйста, предоставьте подробности, если это не то, что вы имели в виду ...

The_Dod 27.05.2018 21:05

Во-первых, вы делаете что-то действительно странное ... Вместо того, чтобы использовать javascript для извлечения ваших пользовательских данных в DOM, почему бы вам не использовать форму и не отправить ее напрямую?

Вам кажется, что вы новичок в Symfony, поэтому я предлагаю вам лучший метод, чтобы узнать, как Symfony делает что-то ... Используйте строки команд для создания сущностей, контроллеров, форм и так далее ...

Вот список большинства пользовательских команд для работы с Symfony:

Создать бандл
php bin/console generate:bundle

Создать сущность
php bin/console doctrine:generate:entity

Обновить все геттеры и сеттеры сущностей в пакете
php bin/console doctrine:generate:entities *NameBundle*

Обновить геттеры и сеттеры одной сущности
php bin/console doctrine:generate:entities *NameBundle:Entity*

Проверить отношения сущностей и скелет базы данных
php bin/console d:s:v

Создать тип формы сущности
php bin/console doctrine:generate:for

Создание контроллера сущности, типа формы и представления
php bin/console doctrine:generate:crud --with-write

Сбросить изменения SQL в консоль.
php bin/console doctrine:schema:update --dump-sql
Используйте перед обновлением скелета, чтобы проверить, все ли так, как вы хотите.

Применить изменения SQL
php bin/console doctrine:schema:update --force

Перечислите все существующие маршруты в консоли.
php bin/console debug:router

Очистить производственный кеш
php bin/console cache:clear --no-warmup --env=prod

Очистить кеш разработки
php bin/console cache:clear --no-warmup --env=dev'

Поскольку это упрощает задачу, я предлагаю вам использовать аннотацию для маршрутов вместо yml.

Для вашего кода это настоящий беспорядок и недействителен как есть ...
Если вы использовали форму, вот как должно выглядеть основное действие редактирования

public function editAction(Request $request, User $user) {
    $editForm=$this->createForm(UserType::class, $user);
    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()
             ->getManager()
             ->flush();

        return $this->redirectToRoute('_edit', array('id'=>$user->getId()));
    }

    return $this->render('security/edit.html.twig', array(
        'user'=>$user,
        'edit_form'=>$editForm->createView(),
    ));
}

В вашем коде отсутствует форма, и он действительно опасен ...
В качестве хорошего примера вы не отправляете токен формы, что приведет к сбою при попытке обновить базу данных.

Боюсь, что оказать помощь по вашему коду совершенно невозможно, поскольку вы используете Symfony не так, как следует.

Да, я новичок в symfony, но я знаю все, что вы упомянули выше. Работа с ajax дает вам возможность обновлять данные на странице без необходимости обновлять всю страницу, и это именно то, что я хочу. . Я много чего сделал с ajax, и он отлично работает ..

Dev 27.05.2018 22:22

в вашем примере (работа с формами symfony), как я могу узнать, какой переключатель установлен?

Dev 27.05.2018 22:24

Я могу работать с тегом формы html .. Итак, я использую тег ввода с атрибутом name, затем я использую имя для вызова этого ввода в контроллере .. но я не знаю, что делать с вводом радио-типа, потому что там это имя есть у нескольких входов .. есть идея? и мне очень жаль! (Я новичок в symfony ^ _ ^)

Dev 27.05.2018 22:28

Добавьте класс в свою форму, а затем с помощью javascript обнаружите событие $.on('submit', function(e) {}). Внутри вашей функции начните с e.preventDefault. Затем с помощью Ajax отправьте форму с помощью data: $(this).serialize

Preciel 27.05.2018 23:38

@Dev, вот краткий пример кода: codepen.io/anon/pen/wXwwKp Я возвращаю json в качестве ответа, но, скорее всего, вы хотите удалить атрибут dataTypeattribute.

Preciel 28.05.2018 02:41

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