Почти те же ПРОБЛЕМЫ: ссылка, ссылка
ОБНОВЛЕНИЕ ИНФОРМАЦИИ: - $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);
, в результате отображается нулевое изображение. (Нулевое изображение означает, что в шаблоне я делаю if(null){ display my image })
. Бэкенд-процесс — обновление изображения работает хорошо.
На данный момент я доволен своим кодом. Здесь мне нужно сделать $user->setImage(xx);
реальным изображением. при отправке формы с ошибкой на носителе. ТОЛЬКО при ошибке на носителе.
Если нет медиа и ошибка отправки - работает (отображает изображение).
ОБНОВЛЕНИЕ: я использовал $em->refresh($user);
из этого ответа, также не удалось обновить мое изображение.
ЧТО Я ОБНАРУЖИЛ ПРОБЛЕМУ С ПОЛЬЗОВАТЕЛЕМ: не используется 'ApplicationSonataUserBundle:User' для SYMFONY app.user . Вот почему, когда я даю $em->refresh($user);
, это не изменяет имя пользователя и другие данные. Но это изменение новых деталей ApplicationSonataUserBundle:User