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

Почти те же ПРОБЛЕМЫ: ссылка, ссылка

ОБНОВЛЕНИЕ ИНФОРМАЦИИ: - $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


person Sudhakar Krishnan    schedule 28.08.2016    source источник
comment
Здесь я обрабатываю информацию о текущем пользователе. Не получено из БД. Я правильно работаю?   -  person Sudhakar Krishnan    schedule 28.08.2016


Ответы (1)


Наконец, чтобы решить, я ПЕРЕНАПРАВЛЕН с помощью flash msg ..

$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');
        }
person Sudhakar Krishnan    schedule 28.08.2016