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

Php Sonata管理文件上传:上传管理面板之外的文件,php,symfony,file-upload,sonata-admin,Php,Symfony,File Upload,Sonata Admin,我有一个基于Symfony 2.8的项目,我已经安装了Sonata管理包和Sonata用户包,一切都很好 我有一个“图像”实体,它意味着包含我上传的文件。我按照官方的索纳塔教程学习了如何上传文件(),当我想从管理面板上传文件时,一切都很顺利 现在,我需要一个提供可能性的简单连接用户(不是管理员)上传文件以及从一个表单 以下是我的例子: 我有一个具有“Image”属性的“Offer”类: class Offer { /** * @var int * * @O

我有一个基于Symfony 2.8的项目,我已经安装了Sonata管理包和Sonata用户包,一切都很好

我有一个“图像”实体,它意味着包含我上传的文件。我按照官方的索纳塔教程学习了如何上传文件(),当我想从管理面板上传文件时,一切都很顺利

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

以下是我的例子:

我有一个具有“Image”属性的“Offer”类:

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
}
在添加“Image”实体之前,我使用经典的方式保存了一个offer:从请求中获取数据(例如:
$offer->setTitre($request->request->get('title');
)。但是现在因为我有一个带文件的“一家公司”,我不知道如何继续

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

编辑 这是我的OfferAdmin,它在sonata admin中运行得非常好

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);
            }
        }
    }

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

<form method="post" action="{{ path('aiem_platform_add_offer')}}">
    <div class="form-group">
        <label for="title">Title</label>
        <input type="text" class="form-control" id="title" name="title" placeholder="Title">
    </div>


    <div class="form-group">
        <input type="file" class="form-control" id="myFile" name="myFile">
    </div>

    <div class="form-group">
        <label for="contenu">Contenu</label>
        <textarea class="form-control ckeditor" id="body" name="body"></textarea>
    </div>

    <button type="submit" class="btn btn-default">Add</button>
</form>

标题
孔特努
添加

谢谢您

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

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路由(在表单操作中命名为like),它应该可以工作

编辑

将表单打开标记,如下所示:

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


您的文件上传是否正常?sonata admin是否正常?您希望从哪个上下文处理文件上载?请在您的问题中添加方法。@chalasr:我编辑了我的问题并添加了OfferAdmin。是的,它在管理面板中工作得很好,我可以添加一个带有“图片”的报价,文件上传得很好,一切都很好。现在我想从管理面板之外添加一个报价。我希望一个简单的连接用户能够从一个简单的表单中添加文件(也添加到问题中)。不幸的是,图像没有上传,我在数据库的图像表中获得了一个新条目,但以“initial”作为路径,文件没有上传到目标文件夹。你能尝试var_dump($file);验证它不是空的?哦,它实际上是空的!看到我答案中的变化,请尝试。之前不要忘记删除缓存。并使用setter正确设置实体的所有不可为空的字段。工作起来很有魅力。。非常感谢@chalasr,你又救了我一天:D