Symfony 3

时间:2017-09-12 18:38:08

标签: forms symfony

我学习了Symfony 3,我想创建表单类来上传文件,所以我创建了ImageType,cutom表单类型来处理在NewsType上传的图像(带有一些描述和这个字段的表单):

class ImageType extends AbstractType
{
    private $path;

    public function __construct($path)
    {
        $this->path = $path;
    }

    public function getParent()
    {
        return FileType::class;
    }

    public function getName()
    {
        return 'image';
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'image_name' => ''
        ));
    }

    /**
     * @param FormView $view
     * @param FormInterface $form
     * @param array $options
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['image_name'] = $options['image_name'];
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->setAttribute('image_name', $options['image_name'])
            ->addModelTransformer(new ImageTransformer($this->path))

    }
}

我使用ImageTransformer将文件名(如124324235342.jpg)转换为实例File类。当我创建并将日期保存到数据库时,表单工作正常,但是如何在编辑模式下管理实体?

public function editAction(Request $request, News $news)
{
    $path = $this->getParameter('upload_directory') . $news->getImage();
    $image = $news->getImage();
    $form = $this->createForm(NewsType::class, $news, ['image_name' => $image]);
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid())
    {
        $this->get('app.image_uploader')->uploadNews($news, $image);

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

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

    return $this->render('admin/news/form.html.twig', [
        'form' => $form->createView(),
        'news' => $news
    ]);
}

我希望句柄使用相同的表单来编辑数据库实体。我填写表格,但当用户没有上传图像我不想改变这个字段和旧的价值。怎么做到这一点?

1 个答案:

答案 0 :(得分:0)

代码的最简单方法:

News类型的设置者中:

function setImage($image) {
    if(strlen($image)) {
          $this->image = $image;
    }
}

当用户编辑其他字段时,这使您不必担心缺少图像的情况。在这种情况下,$this->fileName中的News将不会被覆盖。

然后在服务app.image_uploader中,您应该检查是否存在具有给定名称的文件。如果没有,那么你不应该覆盖这个文件。

但还有一些其他的问题:

1)您应该验证文件的扩展名。

2)您应该为服务器中的文件使用与用户名称不同的唯一名称。 Yo可以使用这两个名称,您对硬盘中的字符串文件的唯一名称,以及用户界面中的名称形式用户,但您不应使用文件格式用户名来将文件存储在硬盘中。

我建议您在文档中了解这些问题:

  

https://symfony.com/doc/current/controller/upload_file.html

或堆栈溢出:

  

Symfony2 file upload step by step

相关问题