编辑表单 -> 强制修改图像 [我认为很容易回答]

Editing a form -> Forced to modify image [Easy to answer i think]

我正在尝试修改我的个人资料实体,但在其中我有一个个人资料图片路径变量($avatarPath)。但是当我试图用一个表单修改我的实体时,我被迫 "upload" 一个新文件来验证表单(我认为路径文件的值默认为空,所以当我接受表单时没有一张图片告诉我我的表格无效并且缺少图片

所以我的目标是在编辑表单中默认设置配置文件的图像,或者不放置按钮上传但使表单正常工作(我会将上传文件放在另一个页面中)

(这肯定是个白痴错误,但我看不出在哪里)

我的 $avatarPath

/**
 * @var string
 *
 * @Assert\NotBlank(message="Please enter an image")
 * @Assert\Image()
 * @ORM\Column(name="avatar_path", type="string", length=255, nullable=true)
 */
protected $avatarPath;

我的控制器:

/**
 * Creates a new profile entity.
 *
 * @Route("/edit/{id}", name="profile_edit")
 */
public function editProfileAction(Request $request, User $user, Profile $profile)
{
    $loggedAs = $this->getUser();

    $form = $this->createForm(ProfileType::class, $profile);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        /**
         * @var UploadedFile $file
         */
        $file = $form->get('avatar_path')->getData();
        $fileName = md5(uniqid()) . '.' . $file->guessExtension();

        $file->move($this->getParameter('image_directory'), $fileName);

        $profile->setAvatarPath($fileName);
        if ($profile->getAvatarPath() == NULL)
            $profile->setAvatarPath('NULL');

        $em = $this->getDoctrine()->getManager();
        $em->persist($profile);
        $em->flush();

        $user->setIdProfile($profile);
        $em2 = $this->getDoctrine()->getManager();
        $em2->persist($user);
        $em2->flush();



        return $this->redirectToRoute('user_list');
    }

    return $this->render('admin/user/new_profile.html.twig', array(
        'profile' => $profile,
        'form' => $form->createView(),
        'loggedAs' => $loggedAs,
    ));
}

我的表格:

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('resume')
        ->add('is_male')
        ->add('birth', BirthdayType::class, array(
            'years' => range(1930,2018)
        ))
        ->add('email', EmailType::class, array(
            'label' => 'form.email'
        ))
        ->add('phone')
        ->add('language')
        ->add('travel')
        ->add('pets')
        ->add('avatar_path', FileType::class, array(
            'data_class' => null
        ))
        ->add('avatar_path', FileType::class, array(
            'data_class' => null,
            'required' => false
        ));
}

感谢任何愿意提供帮助的人:p

您可以尝试将 属性 mapped => false 设置为表单中的 avatar_path 字段。

这样做会使 symfony 做两件事。第一个是在调用 form->isValid() 时验证控制器中发生的表单时忽略 avatar_path 字段。其次,当您调用 $form->handleRequest($request).

时,symfony 不会为该字段分配任何值。

如果您选择使用 mapped => false 属性,您将需要在 Profile 实体上手动设置 avatar_path

这是 symfony http://symfony.com/doc/3.4/reference/forms/types/file.html 的文档(这些文档适用于 symfony 3.4)

希望这对您有所帮助。

编辑:我认为由于实体中的两个 @Assert 语句,表单未通过验证检查。查看您的代码,我认为您可以安全地删除这些代码,因为您已经允许 属性 $avatarPath 无论如何都可以为 null。

我说的是:

->add('avatar_path', FileType::class, array(
            'data_class' => null,
            'mapped' => false,
            'required' => false
        ));

但没有什么总是一样的:

刚才刷新页面所以表单无效...