2017-01-05 7 views
0

У меня есть следующее Entity ПользователяSymfony Загрузить файл в форме редактирования

/** 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="name", type="string", length=100, nullable=false) 
    */ 
    private $name; 

    /** 
    * @ORM\Column(type="string", name="picture", nullable=true) 
    * @Assert\Image 
    * @Assert\File(maxSize = "2M") 
    */ 
    private $picture; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * @return User 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    public function setPicture($file) 
    { 
     $this->picture = $file; 
     return $this; 
    } 

    public function getPicture() 
    { 
     return $this->picture; 
    } 
} 

А вот мой FormType

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', TextType::class, [ 
      'label' => 'Name *', 
      'attr' => [ 
       'class' => 'form-control placeholder-height' 
      ], 
      'label_attr' => [ 
       'class' => 'col-md-2 professional-attr' 
      ], 
      'constraints' => [ 
       new Assert\NotBlank(), 
       new Assert\Length(['min' => 3, 'max' => 50]) 
      ] 
     ]); 

     $builder->add('picture', FileType::class, [ 
      'label' => 'Profile Picture', 
      'attr' => [ 
       'class' => 'form-control filestyle', 
       'data-iconName' => 'glyphicon glyphicon-camera', 
       'data-buttonText' => null, 
       'accept' => 'image/*' 
      ], 
      'label_attr' => [ 
       'class' => 'col-md-2 professional-attr' 
      ], 
      'data_class' => null 
     ]); 

     $builder->add('confirm', SubmitType::class, [ 
      'label' => 'SUBMIT', 
      'attr' => [ 
       'class' => 'submit' 
      ] 
     ]); 
    } 

    public function setDefaultOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'UserBundle:User' 
     ]); 
    } 
} 

А вот код в моем контроллере

public function professionalEditAction(Request $request) 
{ 
    $em = $this->get('doctrine.orm.entity_manager'); 
    $user = $em->getRepository('UserBundle:User')->findOneBy(['id' => $request->get('id')]); 
    if (!$user) { 
     throw $this->createNotFoundException('Invalid user or user does not exist'); 
    } 
    $form = $this->createForm(Form\ProfessionalType::class, $user, [ 
     'method' => 'POST', 
     'attr' => [ 
      'class' => 'form-horizontal', 
      'novalidate' => 'novalidate', 
      'accept' => 'image/*' 
     ] 
    ]); 
    $form->handleRequest($request); 
    $response = []; 
    $response['params'] = []; 
    if($form->isSubmitted() && $request->isXmlHttpRequest() && !$form->isValid()) { 
     $data = $form->getData(); 
     foreach ($form as $child) { 
      if (!$child->isValid()) { 
       $response['status'] = 'error'; 
       $response['next_action'] = 'fix_error'; 
       $response['params'] = []; 
       foreach ($child->getErrors() as $error) { 
        $response['errors'][$child->getName()][] = $error->getMessage(); 
       } 
      } 
     } 
     return new JsonResponse($response); 
    } 
    if ($form->isSubmitted() && $form->isValid()) { 
     $data = $form->getData(); 
     $file = $user->getPicture(); 
     if ($file instanceof UploadedFile) { 
      $fileName = md5(uniqid()).'.'.$file->guessExtension(); 
      $file->move(
       $this->getParameter('profile.picture.attachment.dir'), 
       $fileName 
      ); 
      $data->setPicture($fileName); 
     } 
     $em->persist($data); 
     $em->flush(); 
     $request->getSession()->getFlashBag()->add('success', 'User created successfully!'); 
     return $this->redirect($this->generateUrl('admin_professional_create')); 
    } 
    return $this->render('UserBundle:Admin:professional.edit.html.twig', [ 
     'form' => $form->createView(), 
     'user' => $user 
    ]); 
} 

It отлично работает, если я загружу новый файл, но если я отправлю поле ввода пустым, оно изменится на значение NULL в DB, ​​которое я делаю n ot want, я хочу, если пользователь ранее загрузил картинку и в следующий раз оставил ее пустой, просто не изменяйте значение изображения в БД.

Примечание: Я не уверен, что эта часть информации помогает, но я представляю форму с использованием Ajax и FormData, я пропустил часть кода, чтобы упростить ее.

Что мне здесь не хватает?

ответ

1

$em->persist($data) вызывается ли файл был загружен или нет - попробуйте переместить его в пределах, если оператор над ним:

if ($file instanceof UploadedFile) { 
    $fileName = md5(uniqid()).'.'.$file->guessExtension(); 
    $file->move(
     $this->getParameter('profile.picture.attachment.dir'), 
     $fileName 
    ); 
    $data->setPicture($fileName); 
    $em->persist($data); // Place here 
} 

Так что будет только сохраняться объект, если файл был загружен.

Или, если есть и другие поля, которые могут быть изменены в той форме и в форме всегда нуждается в сохраняющихся независимо, вы можете установить данные текущего значения картинки пользователя перед тем вашего, если заявление:

$file = $user->getPicture(); 
$data->setPicture($file); // Store the current value from the DB before overwriting below 
if ($file instanceof UploadedFile) { 
    $fileName = md5(uniqid()).'.'.$file->guessExtension(); 
    $file->move(
     $this->getParameter('profile.picture.attachment.dir'), 
     $fileName 
    ); 
    $data->setPicture($fileName); 
} 
$em->persist($data); // Leave here in original place 
+0

Это имеет смысл, спасибо, это работает :-) –