Symfony2:如何添加FormType



我有一个实体Product,我有一个实体File。这两者之间的关系通常是多对多关系。但是我还需要一个字段值" sorting "和 "description",所以我必须声明我自己的 JoinTable ProductHasFile。现在我希望在我的表单中,我可以有一个Product bute包括File FormTpye而不是ProductHasFile FormType。

产品实体:

/**
 * @ORMEntity
 * @ORMTable(name="Product")
 */
class Product
{
     /**
     * @ORMOneToMany(targetEntity="ProductHasFile", mappedBy="product", cascade={"persist"}))
     */
     private $productHasFiles;
....

文件实体:

/**
 * @ORMEntity
 * @ORMHasLifecycleCallbacks
 */
class File
{
    /**
     * @ORMOneToMany(targetEntity="ProductHasFile", mappedBy="file")
     */
    private $productHasFiles;
...

和我自己生成的实体产品文件:

/**
 * @ORMEntity
 * @ORMTable(name="ProductHasFile")
 */
class ProductHasFile
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
    * @ORMColumn(type="integer", nullable=true)
    */
    private $sorting;
    /**
    * @ORMColumn(type="string", nullable=true)
    */
    private $description;
   /**
   * @ORMManyToOne(targetEntity="Product", inversedBy="productHasFiles")
   * @ORMJoinColumn(name="product_id", referencedColumnName="id")
    */
   private $product;
   /**
   * @ORMManyToOne(targetEntity="File", inversedBy="productHasFiles")
   * @ORMJoinColumn(name="file_id", referencedColumnName="id")
   */
   private $file;

当我现在为产品制作表单类型时:

class ProductType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
           ->add('productHasFiles', CollectionType::class, array(
                    'entry_type' => ProductHasFileType::class,
                    'allow_add' => true,
                    'allow_delete' => true,
                    'by_reference' => false,
                    ,
                )
            )

和我的 FormType for ProductHasFileType:

class ProductHasFileType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        /**
         * @var $entityManager EntityManager
         */
        $fileRepository = $options['fileRepository'];
        $builder
            ->add('sorting', TextType::class)
            ->add('description', TextType::class)
            ->add('file', EntityType::class, array(
                'class' => 'AppBundleEntityFile',
                'label' => 'file',
            ))
        ;

我只得到文件实体的掉落。但是我想拥有我的完整File FormType,其中包含上传字段和其他内容,它看起来像这样:

class FileType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('description', TextType::class, array(
                'label' => 'description',
            ))
            ->add('type', TextType::class, array(
                'label' => 'type',
            ))
          ->add('file', SymfonyComponentFormExtensionCoreTypeFileType::class, array(
                    'label' => 'file',
                ))
        ;
    }

有人对此有解决方案吗?

正如Symfony文档中关于如何嵌入表单所解释的那样,这就像

class ProductHasFileType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        /**
         * @var $entityManager EntityManager
         */
        $fileRepository = $options['fileRepository'];
        $builder
            ->add('sorting', TextType::class)
            ->add('description', TextType::class)
            ->add('file', FileType::class) //where FileType is your own FormType
        ;
    }
}

ProductHasFileType中,您将像这样添加文件:

->add('file', EntityType::class, array(
            'class' => 'AppBundleEntityFile',
            'label' => 'file',
        ))

因此,您将文件添加为entity类型,该类型在逻辑上呈现所有文件实体的下拉列表。

你需要做的是通过你自己的FileType。为了确保你使用的是自己的文件类型,而不是默认的symfony,不要忘记添加正确的use语句。

结果:

use MyBundleFormTypeFileType;
class ProductHasFileType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('sorting', TextType::class)
            ->add('description', TextType::class)
            ->add('file', FileType::class)
        ;

相关内容

  • 没有找到相关文章

最新更新