更新信息: - $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
答案 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');
}