Sonata admin file uploads : 从管理面板上传文件
Sonata admin file uploads : Upload files apart from the admin panel
我有一个基于 Symfony 2.8 的项目,我安装了 Sonata admin bundle 和 Sonata user bundle,一切正常。
我有一个 "Image" 实体,它意味着包含我上传的文件。我按照 Sonata 官方教程学习了如何上传文件 (https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_file_uploads.html),当我想从管理面板上传文件时一切正常。
现在,我需要为简单的连接用户(不是管理员)提供从表单上传文件的可能性。
这是我的例子:
我有这个 "Offer" class 有一个 "Image" 属性:
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" 实体之前,我使用 classic 方式坚持了一个提议:从请求中获取我的数据(示例:$offer->setTitre($request->request->get('title'));
)。但是现在因为我有一个带文件的 OneToMany,我不知道如何进行。
如果您能分享一些想法,我将不胜感激。
编辑
这是我的 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 路由(在您的表单操作中命名),它应该可以工作。
编辑
使您的表单打开标签如下:
<form enctype="multipart/form-data">
我有一个基于 Symfony 2.8 的项目,我安装了 Sonata admin bundle 和 Sonata user bundle,一切正常。
我有一个 "Image" 实体,它意味着包含我上传的文件。我按照 Sonata 官方教程学习了如何上传文件 (https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_file_uploads.html),当我想从管理面板上传文件时一切正常。
现在,我需要为简单的连接用户(不是管理员)提供从表单上传文件的可能性。
这是我的例子:
我有这个 "Offer" class 有一个 "Image" 属性:
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" 实体之前,我使用 classic 方式坚持了一个提议:从请求中获取我的数据(示例:$offer->setTitre($request->request->get('title'));
)。但是现在因为我有一个带文件的 OneToMany,我不知道如何进行。
如果您能分享一些想法,我将不胜感激。
编辑 这是我的 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 路由(在您的表单操作中命名),它应该可以工作。
编辑
使您的表单打开标签如下:
<form enctype="multipart/form-data">