Symfony2+Doctrine2 实体类型选择



我有一个图像实体:

class Image {
/**
 * @ORMId
 * @ORMColumn(type="integer")
 * @ORMGeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @ORMColumn(type="string", nullable=true)
 */
protected $location;
/**
 * @AssertFile(maxSize="6000000")
 */
protected $file;
public function __toString()
{
    return $this->getLocation()
}
//............
}

我想允许用户删除选定的图像并删除它们。我做了一个图像选择类型

class ImageSelectType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(PROBLEM_IS_HERE, 'entity', array(
                    'class' => 'BloggerBlogBundle:Image',
            )
        )
        ;
}
//.......
}

但是,我似乎无法准确理解实体类型的工作原理。如果我将"位置"或某些属性作为 $builder->add 函数的第一个参数,例如我得到这个:

object(BloggerBlogBundleEntityImage)[316]
  protected 'id' => null
  protected 'location' => 
    object(BloggerBlogBundleEntityImage)[79]
      protected 'id' => int 16
      protected 'location' => string '8a307aadd466f1b92b149d3f79069f5a1abc9cd3.png'     (length=44)
      protected 'file' => null
  protected 'file' => null

所以它实际上将整个对象放入空图像对象的位置属性中。如果我将"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;
}

你需要为Image创建一个类型,它将它的属性分解为单独的字段,然后将该AbstractType用作另一个的类。

您本质上想要一个表单集合。

更新

我想念第一次读你的问题有点错误。

看起来您实际上要做的是创建类似具有图像数组的ImageGroup对象之类的东西。然后,这将是您发送到$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;
}

然后,您必须遍历图像并找出缺少哪些图像才能删除它们。这种方法有一些变化,但这可能是最简单的。

这是完成的代码,这是@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'));
}

相关内容

  • 没有找到相关文章

最新更新