Как редактировать сонату пользователя с аватаром вне админки связки

Почти такие же проблемы: ссылка, ссылка

ОБНОВЛЕНИЕ ИНФОРМАЦИИ: - $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');
        }
Другие вопросы по тегам