我有一个Image实体:
class Image {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", nullable=true)
*/
protected $location;
/**
* @Assert\File(maxSize="6000000")
*/
protected $file;
public function __toString()
{
return $this->getLocation()
}
//............
}
我希望允许用户删除选择的图片并删除它们。我做了一个 ImageSelectType :
class ImageSelectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(PROBLEM_IS_HERE, 'entity', array(
'class' => 'BloggerBlogBundle:Image',
)
)
;
}
//.......
}
但是,我似乎无法准确理解实体类型的工作原理。如果我将'location'或某些属性作为 $ builder-> add 函数的第一个参数,我会举例说明:
object(Blogger\BlogBundle\Entity\Image)[316]
protected 'id' => null
protected 'location' =>
object(Blogger\BlogBundle\Entity\Image)[79]
protected 'id' => int 16
protected 'location' => string '8a307aadd466f1b92b149d3f79069f5a1abc9cd3.png' (length=44)
protected 'file' => null
protected 'file' => null
所以它实际上将整个对象放入空Image对象的Location属性中。如果我将'id'作为第一个参数,我会得到完全相同的结果,除了对象将存储在$ image-> id中。作为$ builder-add的第一个参数我应该输入什么来实际接收只是对象本身?
以下是我的行动代码,如果它是相关的:
public function imageDeleteAction()
{
$image = new Image();
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
$form = $this->createForm(new ImageSelectType(), $image);
$form->bindRequest($request);
var_dump($image);
exit;
}
答案 0 :(得分:0)
你需要为Image创建一个类型,它将它的属性分解为单独的字段,然后使用该AbstractType作为另一个的类。
你基本上想要一个collection of forms。
我第一次想念你的问题有点不对劲。
看起来你真正想要做的就是像ImageGroup对象一样创建一个包含Images数组的对象。然后,这将是您发送到$ this-> createForm的目标,并且您将在PROBLEM_IS_HERE中设置该字段。
// Entity/ImageGroup.php
class ImageGroup
{
protected $images;
public function __construct($images) {
$this->images = $images;
}
public function getImages() { return $this->image; }
public function setImages($images) { $this->images = $images; }
}
// ImageSelectType
class ImageSelectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('images', 'entity', array(
'class' => 'BloggerBlogBundle:Image',
)
)
;
}
// Controller
public function imageDeleteAction()
{
$images = $this->get('doctrine')->getRepository('MyBundle:Image')->findAll();
$imageGroup = new ImageGroup($images);
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
$form = $this->createForm(new ImageSelectType(), $imageGroup);
$form->bindRequest($request);
var_dump($image);
exit;
}
然后你必须遍历图像并找出缺少哪些图像才能删除它们。这种方法有一些变化,但这可能是最简单的。
答案 1 :(得分:0)
这是完成的代码,这是@samanime建议的99%,但仍然可能对某人完全看到它有用。
ImageSelectType buildForm函数:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('images', 'entity', array(
'class' => 'BloggerBlogBundle:Image',
)
)
;
}
控制器“编辑”页面形式:
public function imageEditAction()
{
$uploadForm = $this->createForm(new ImageFileType());
$selectForm = $this->createForm(new ImageSelectType());
return $this->render('BloggerBlogBundle:Admin/Image:edit.html.twig', array(
'uploadForm' => $uploadForm->createView(),
'selectForm' => $selectForm->createView(),
));
}
控制器“删除”操作:
public function imageDeleteAction()
{
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
$imageManager = new ImageManager();
$form = $this->createForm(new ImageSelectType(), $imageManager);
$form->bindRequest($request);
$images = $imageManager->getImages();
foreach ($images as $image) {
$em->remove($image);
}
$em->flush();
return $this->redirect($this->generateUrl('BloggerBlogBundle_admin_imageEdit'));
}