Sonata管理文件上传:上传除管理面板之外的文件

时间:2016-02-07 15:25:48

标签: php symfony file-upload sonata-admin

我有一个基于Symfony 2.8的项目,我已经安装了Sonata管理软件包和Sonata用户软件包,并且一切正常。

我有一个“图片”实体,它意味着包含我上传的文件。我按照官方的Sonata教程来了解如何上传文件(https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_file_uploads.html),当我想从管理面板上传文件时,一切正常。

现在,我需要为一个简单的连接用户(而不是管理员)提供从表单上传文件的可能性。

以下是我的例子:

我有这个“Offer”类,它有一个“Image”属性:

$dateToCompare = $month. '/' . $day_num. '/' . $year;

在添加“图片”实体之前,我使用经典方式保留了一个要约:从请求中获取数据(例如:class Offer { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="title", type="string", length=255) */ private $title; /** * @var string * * @ORM\Column(name="body", type="text") */ private $body; /** * @var \DateTime * * @ORM\Column(name="date", type="datetime") */ private $date; /** * @ORM\OneToOne(targetEntity="AIEM\PlatformBundle\Entity\Image", cascade={"all"}) */ private $image; //Getters and Setters } )。但是现在因为我有一个文件的OneToMany,我不知道如何继续。

如果你能分享一些想法,我将不胜感激。

修改 这是我的OfferAdmin,它在sonata admin中完美运行

$offer->setTitre($request->request->get('title'));

我希望用户添加文件的表单如下所示

class OfferAdmin extends Admin {

    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper->add('title', 'text')
                ->add('image', 'sonata_type_admin')
                ->add('body', 'textarea', array("attr" => array("class" => "ckeditor")));
    }

    protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
        $datagridMapper->add('titre')
                ->add('date');
    }

    protected function configureListFields(ListMapper $listMapper) {
        $listMapper->addIdentifier('titre');
    }

    public function prePersist($page) {
        $this->manageEmbeddedImageAdmins($page);
    }

    public function preUpdate($page) {
        $this->manageEmbeddedImageAdmins($page);
    }

    private function manageEmbeddedImageAdmins($page) {

        /** @var Image $image */
        $image = $page->getImage();

        if ($image) {
            if ($image->getFile()) {
                // update the Image to trigger file management
                $image->refreshUpdated();
            } elseif (!$image->getFile() && !$image->getFilename()) {
                // prevent Sf/Sonata trying to create and persist an empty Image
                $page->$setImage(null);
            }
        }
    }

}

谢谢

1 个答案:

答案 0 :(得分:1)

使用类似以下内容的表单处理方法:

public function handleOfferForm(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $offer = new Offer();
    // Handle your basic fields using $request->request->get('field')

    $file = $request->files->get('myFile');

    $image = new Image();
    $image->setFile($file);
    // Set your other fields ...
    $image->upload(); // Image should have this method (from the sonata doc)

    $offer->addImage($image);

    $em->persist($offer);
    $em->flush();

    // Return a redirection or which response you want 
}

此外,在路由中创建相应的POST路由(在表单操作中命名),它应该有效。

修改

使表单打开标记如下:

<form enctype="multipart/form-data">