Php Symfony文件以编辑形式上载
我有以下用户实体Php Symfony文件以编辑形式上载,php,file-upload,symfony,symfony-forms,Php,File Upload,Symfony,Symfony Forms,我有以下用户实体 /** * @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=f
/**
* @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;
}
}
这是我的模板
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
]);
}
如果我上传了一个新的文件,它可以很好地工作,但是如果我提交的输入字段是空的,它会变为我不想要的NULL
DB值,我想要的是,如果用户之前上传了图片,下次将其保留为空,就不要更改DB中图片的值
注意:我不确定这段信息是否有用,但我使用Ajax和FormData提交表单,为了保持简单,我省略了部分代码
我在这里遗漏了什么?$em->persist($data)
正在被调用,无论文件是否已上载-尝试在其上方的if语句中移动它:
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
}
因此,只有上传了文件,才会持久化对象
或者,如果该表单上有其他字段可以更改,并且无论何时该表单都需要持久化,您是否可以在if语句之前将数据设置为当前用户图片值:
$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