0

Item エンティティと Image エンティティがあり、それらの間の OneToOne 関係があります。ItemType フォームと ImageType フォームもあります。今まで、このような状況になったときは、2 つのフォームを別々に使用し (単一の HTML フォームにレンダリング)、コントローラーまたはフォーム ハンドラー内で関係を設定していました。ImageType フォームを ItemType フォームに埋め込む -symfony- 方法はありますか? ちょっとしたコードが役立つかもしれません。アイテム:

namespace Company\ItemBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use NewZaarly\ImageBundle\Entity\Image;

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class Item
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(type="text")
     */
    private $title;

    /**
     * @var \NewZaarly\ImageBundle\Entity\ImageItem
     * @ORM\OneToOne(targetEntity="NewZaarly\ImageBundle\Entity\ImageItem", mappedBy="item", cascade={"persist", "merge", "remove"})
     */
    private $image;

    //other fields. Setters and getters
}

画像:

<?php

namespace Company\ImageBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @ORM\Table()
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 */
class Image
{
    /**
     * @Assert\File(maxSize = "2M", mimeTypes = {"image/png", "image/jpg", "image/jpeg"})
     */
    protected $file;

    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

   /**
     * @ORM\Column(name="image", type="string", length=255, nullable=true)
     */
    protected $image;

    //other fields, setter and getters
}

画像タイプ

<?php

namespace Company\ImageBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ImageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('file', 'file', array('required' => true));
    }

    public function getName()
    {
        return 'image';
    }
}

そして ItemType フォーム

<?php

namespace Company\ItemBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Company\ImageBundle\Form\Type\ImageType;

class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title', 'text');
        $builder->add('image', new ImageType()); // <-- this is what I'd like to do
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Company\ItemBundle\Entity\Item');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'Company\ItemBundle\Entity\Item'));
    }

    public function getName()
    {
        return 'item';
    }

}

このようにすると、リクエストをバインドするときにエラーが発生します。これは、画像が Image オブジェクトではなく配列であるためです。これは、Item クラスの setImage メソッドで予期されることです。私のハンドル関数は非常に単純です:

public function handle(FormInterface $form, Request $request)
{
    if ($request->isMethod('POST')) {
        $form->bind($request);
        if ($form->isValid()) {
            $item = $form->getData();
            $this->itemManager->saveItem($item);

            return true;
        }
    }

    return false;
}

何か案が?最初に指定した方法が好きではありません。

4

1 に答える 1

0

同じ問題があり、data_class を埋め込みフィールドに追加することで解決しました。私の場合、アップロード フォームをサービス (app_document_upload) として定義します。

//Document Class

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    //other fields here ...
    ->add('image', 'app_document_upload', array(
            'data_class' => 'App\DocumentBundle\Entity\Document'
        ))
}
于 2015-02-14T03:00:11.447 に答える