0

私は画像エンティティを持っています:

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

//.......
}

しかし、エンティティ タイプがどのように機能するかを正確に理解することはできないようです。$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;
}
4

2 に答える 2

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'));
}
于 2012-12-13T21:07:52.497 に答える
0

画像専用のタイプを作成する必要があります。これにより、そのプロパティが個別のフィールドに分割され、その 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;
}

次に、画像をループして、欠落している画像を見つけて削除する必要があります。この方法にはいくつかのバリエーションがありますが、おそらくこれが最も簡単です。

于 2012-12-13T04:12:45.667 に答える