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

时间:2018-07-24 13:13:40

标签: forms image symfony upload edit

我正在尝试修改个人资料实体,但是在其中我有个人资料图像路径($ avatarPath)的变量。但是,当我尝试使用表单修改我的实体时,我被迫“上传”一个新文件以验证表单(默认情况下,我认为路径文件的值为null,所以当我接受不带图片的表单时告诉我我的表格无效并且缺少图像

所以我的目标是默认情况下在编辑表单中设置配置文件的图像,或者不将按钮上传而是使表单生效(我将上传文件放置在另一页中)

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

我的$ 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

2 个答案:

答案 0 :(得分:0)

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

这样做会导致symfony做两件事。第一种是在验证调用avatar_path时在控制器中发生的格式时忽略form->isValid()字段。其次,当您调用$form->handleRequest($request)时,symfony不会为该字段分配任何值。

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

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

希望这会有所帮助。

编辑:由于您实体中的两个@Assert语句,我认为表单未能通过验证检查。查看代码,我认为您可以放心地删除它们,因为您已经允许属性$avatarPath始终为空。

答案 1 :(得分:0)

我说:

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

但没有什么总是一样的:Error

那只是刷新页面,所以表单无效...