Как редактировать сонату пользователя с аватаром вне админки связки
Почти такие же проблемы: ссылка, ссылка
ОБНОВЛЕНИЕ ИНФОРМАЦИИ: - $user = $this->getUser();
установить старое изображение во время редактирования (ошибка отправки формы). Изображение заменяется отправленным одним значением (только значение не отображается). Во время отправки сообщения об ошибке - I NEED TO DISPLAY THE OLD MEDIA.
НИКАКОЙ ОТНОШЕНИЯ С SONATA ADMIN.
У меня есть роль администратора и пользователя. У обоих есть отдельная область администратора. Область администратора пользователя имеет более сложную структуру.
Я добавил изображение (аватар) в SonataUser, оно хорошо работает в админке. Его OneToOne - Пользователь и Медиа.
Редактировать профиль на панели пользователя (это не SonataAdmin - его я создал отдельно, это простой стиль Symfony).
код:
public function editProfileAction() {
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw $this->createAccessDeniedException('This user does not have access to this section.');
}
// Check user has allready media?
$om = $this->getUser()->getImage();
$oldPath = $om ? $this->getMediaPath($om->getId()) : NULL;
$form = $this->creteForm();
$formHandler = $this->get('sonata.user.profile.form.handler');
$process = $formHandler->process($user);
if ($process) {
// if new file - delete old file
$this->deleteOldMedia($om, $oldPath);
$this->flashMSG(0, 'Profile updated!');
return $this->redirectToRoute('fz_user');
}
$x = ['cmf' => '', 'pTitle' => 'Profile'];
return $this->render(self::TEMPLATE, ['x' => $x, 'form' => $form->createView()]);
}
По приведенному выше коду работает - с одной проблемой. Эталонное изображение старого файла не удаляется в папке сервера. Новые файлы добавляются, и сущность работает нормально (отображение в шаблоне - отлично).
Итак, я попробовал с моим собственным кодом,
public function editProfileAction() {
$request = $this->get('request');
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw $this->createAccessDeniedException('This user does not have access to this section.');
}
// Check user has allready media?
$om = $this->getUser()->getImage();
$oldPath = $om ? $this->getMediaPath($om->getId(), 'reference') : NULL;
$oldTN = $om ? $this->getMediaPath($om->getId(), 'admin') : NULL;
$form = $this->createForm(ProfileType::class, $user);
$form->handleRequest($request);
$em = $this->getDoctrine()->getEntityManager();
$data = $form->getData();
if ($form->isSubmitted() && $form->isValid()) {
if (($oldPath != NULL) && ($data->getImage()->getBinaryContent() != NULL)) {
$this->deleteFile($oldPath);
$this->deleteFile($oldTN);
}
$em->persist($user);
$em->flush();
$this->flashMSG(0, 'Profile updated!');
return $this->redirectToRoute('fz_user');
}
// $$user->setImage($om);
$x = ['cmf' => '', 'pTitle' => 'Profile'];
return $this->render(self::TEMPLATE, ['x' => $x, 'form' => $form->createView()]);
}
Мой собственный код работает - с одной проблемой, если проверка изображения является ошибкой - все изображения в шаблоне исчезают. Итак, чтобы проверить, я добавил $user->setImage(NULL);
, результат, нулевое изображение показано.(NULL изображение означает в шаблоне я делаю if(null){ display my image })
, Бэкэнд-процесс - обновление изображения работает хорошо.
Пока - я доволен своим кодом. Здесь мне нужно сделать $user->setImage(xx);
к реальному образу. Пока форма отправляется с ошибкой на носитель. ТОЛЬКО при ошибке на носителе.
Если нет медиа и ошибка отправить - работает (отображение изображения).
ОБНОВЛЕНИЕ: я использовал $em->refresh($user);
из этого ответа также не удалось обновить мое изображение.
ЧТО Я НАШЕЛ ВОПРОС С ПОЛЬЗОВАТЕЛЕМ: В приложении SYMFONY app.user не используется ApplicationSonataUserBundle: User. Вот почему, когда я даю $em->refresh($user);
это не изменение имени пользователя и других деталей. Но это изменение новых деталей ApplicationSonataUserBundle:User
1 ответ
Наконец, чтобы решить, я перенаправил с флэш-сообщения.
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.token_storage')->getToken()->getUser();
$entity = $em->getRepository('ApplicationSonataUserBundle:User')->find($user->getId());
if (!$entity) {
throw $this->createNotFoundException('Unable to find User entity.');
}
$form = $this->createForm(ProfileType::class, $entity);
if ($request->getMethod() === 'POST') {
$form->handleRequest($request);
if ($form->isValid()) {
$em->flush();
return $this->redirectToRoute('fz_user');
}
$em->refresh($user);
$this->flashMSG(1, '' . $form->getErrors(true, false));
return $this->redirectToRoute('fz_user_profile_edit');
}