如何使用admin bundle

时间:2016-08-28 07:39:54

标签: symfony sonata-media-bundle

几乎相同的问题:linklink

更新信息: - $user = $this->getUser();在编辑时设置旧图像(错误表单提交)。图像替换为提交的一个值(仅显示值)。在错误表单提交时 - I NEED TO DISPLAY THE OLD MEDIA.

  

与SONATA ADMIN无关。

我有管理员和用户角色。两者都有独立的管理区域。用户管理区域结构更复杂。

我在SonataUser中添加了一个Image(头像),它在管理员方面做得很好。它的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图像。(NULL图像表示模板我做if(null){ display my image })后端进程 - 图像upadate工作正常。

现在 - 我对我的代码感到满意。在这里,我需要对真实图像进行$user->setImage(xx);。而表单在媒体上提交错误。在媒体上出错。

如果没有媒体和错误提交 - 工作(显示图像)。

更新 我使用this answer中的$em->refresh($user);,但无法更新我的图片。

我用USER发现了什么:它没有使用' ApplicationSonataUserBundle:User'对于SYMFONY app.user。这就是为什么,当我给$em->refresh($user);它不修改用户名和其他细节。但它修改了ApplicationSonataUserBundle:User

的新细节

1 个答案:

答案 0 :(得分:0)

最后解决我用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');
        }