Я хочу обновить информацию в профиле, но после всего, что я сделал, ничего не произошло ..
Я использую 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 .. но когда я посмотрел на таблицу в базе данных, я обнаружил, что ничего не произошло .. Так в чем проблема? и как я могу это решить?
Вы используете аннотацию или yml для маршрутов? Если вы используете аннотацию, обновите свой вопрос, включив аннотацию над вашей функцией. Я дам ответ позже
Нет, я использую yml для маршрутов





Вам необходимо установить $em->persist($utilisateur) перед сбросом, если он не исходит от вашего менеджера сущностей.
Раньше я читал в документации Symfony, что вызывать $ em-> persist ($ utilisateur) не нужно. Напомним, что этот метод просто указывает Doctrine управлять или «наблюдать» за объектом $ utilisateur. В этом случае, поскольку вы получили объект $ utilisateurobject из Doctrine, он уже управляется.
если вы работаете с существующим объектом в entitymanager, вы не можете его сохранить. это уже сохраняется. вы можете обновить его только методом flush.
Я считаю, что это верно только для существующих сущностей (извлеченных из базы данных). $utilisateur = $this->get('session')->get('user'); следует этому правилу?
@The_Dod Это не ответ ... используйте комментарии для таких вещей.
@The_Dod во время входа в систему, я сохраняю пользователя объекта в сеансе, поэтому я использую его, пока он все еще в сети .. Проблема в том, что я хочу обновить его информацию
Не знаю, лучше ли это сделать, но я бы получил идентификатор пользователя и извлек его из базы данных с помощью $ em, затем применил к нему изменения и, наконец, сбросил его. @Preciel Я отформатировал свой ответ, чтобы попытаться соответствовать вашим ожиданиям от ответа, пожалуйста, предоставьте подробности, если это не то, что вы имели в виду ...
Во-первых, вы делаете что-то действительно странное ... Вместо того, чтобы использовать 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
Используйте перед обновлением скелета, чтобы проверить, все ли так, как вы хотите.
Применить изменения SQLphp 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, и он отлично работает ..
в вашем примере (работа с формами symfony), как я могу узнать, какой переключатель установлен?
Я могу работать с тегом формы html .. Итак, я использую тег ввода с атрибутом name, затем я использую имя для вызова этого ввода в контроллере .. но я не знаю, что делать с вводом радио-типа, потому что там это имя есть у нескольких входов .. есть идея? и мне очень жаль! (Я новичок в symfony ^ _ ^)
Добавьте класс в свою форму, а затем с помощью javascript обнаружите событие $.on('submit', function(e) {}). Внутри вашей функции начните с e.preventDefault. Затем с помощью Ajax отправьте форму с помощью data: $(this).serialize
@Dev, вот краткий пример кода: codepen.io/anon/pen/wXwwKp Я возвращаю json в качестве ответа, но, скорее всего, вы хотите удалить атрибут dataTypeattribute.
Ваша проблема в том, что объект
Userне существует в entityManager. Вы должны сообщить своемуem, что это мой объектUser. Entity Manager не знает, что выходит за рамки его возможностей. (как сеанс)