无法在Symfony 2.8中将文件表单嵌入到另一个表单中

时间:2016-01-22 13:34:36

标签: php forms symfony

这里的想法是向用户或其他实体添加文件(照片)。我决定这个文件可以拥有自己的实体Media。

正如symfony书中所解释的,我在实体Media:

中创建了添加文件功能
<?php

namespace AdminBundle\Entity;

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

/**
 * Media
 *
 * @ORM\Table(name="Media", indexes={@ORM\Index(name="fk_Media_Cat_Media1_idx", columns={"Cat_Media_ID"})})
 * @ORM\Entity
 */
class Media
{
    /**
     * @var string
     *
     * @ORM\Column(name="Libelle", type="string", length=45, nullable=true)
     */
    private $libelle;

    /**
     * @var integer
     *
     * @ORM\Column(name="ID", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \AdminBundle\Entity\CatMedia
     *
     * @ORM\ManyToOne(targetEntity="AdminBundle\Entity\CatMedia")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="Cat_Media_ID", referencedColumnName="ID")
     * })
     */
    private $catMedia;


    /**
     * @ORM\Column(type="string")
     *
     *
     * @Assert\File(mimeTypes={ "application/image" })
     */
    private $file;



    /**
     * Set libelle
     *
     * @param string $libelle
     * @return Media
     */
    public function setLibelle($libelle)
    {
        $this->libelle = $libelle;

        return $this;
    }

    /**
     * Get libelle
     *
     * @return string 
     */
    public function getLibelle()
    {
        return $this->libelle;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set catMedia
     *
     * @param \AdminBundle\Entity\CatMedia $catMedia
     * @return Media
     */
    public function setCatMedia(\AdminBundle\Entity\CatMedia $catMedia = null)
    {
        $this->catMedia = $catMedia;

        return $this;
    }

    /**
     * Get catMedia
     *
     * @return \AdminBundle\Entity\CatMedia 
     */
    public function getCatMedia()
    {
        return $this->catMedia;
    }



    public function setfile($file)
    {
        $this->file = $file;

        return $this;
    }


    public function getFile()
    {
        return $this->file;
    }


}

然后,我使用文件上传创建了Media FormType:

<?php

namespace AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;

class MediaType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('libelle')
            ->add('catmedia','entity',  array('class'=>'AdminBundle:CatMedia',
                'property'=>'libelle'))
            ->add('file', FileType::class, array('label' => 'Image (Png or jpg file)'))
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AdminBundle\Entity\Media'
        ));
    }
}

现在,我想在我的用户表单中嵌入此表单:

<?php

namespace AdminBundle\Form;

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

class UtilisateurType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('prenom')
            ->add('societe')
            ->add('mail')
            ->add('tel')
            ->add('password')
            ->add('catutilisateur','entity',  array('class'=>'AdminBundle:CatUtilisateur',
                'property'=>'libelle'))
            ->add('media','entity',  array('class'=>'AdminBundle:Media'))



        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AdminBundle\Entity\Utilisateur'
        ));
    }
}

但在我的新用户视图中,结果如下:

enter image description here

一些细节: - 我在symfony 2.8 - 我将symfony引导用于此部分(http://symfony.com/doc/2.8/cookbook/controller/upload_file.html) 我知道我可以使用VichUploaderBundle,但我想先学习。

在此先感谢您的帮助,我希望我足够清楚,而且我的英语不好也不会产生太多的理解问题。

编辑:我尝试制作MediaType服务。

在我的Media FormType中,我添加了:

private $mediaService;

public function __construct(MediaService $mediaService)
{
    $this->mediaService = $mediaService;
}

(如symfony书中所述)

在我的app / config / services.yml中:

admin.form.mediatype:
    class: AdminBundle\Form\MediaType

    tags:
        - { name: form.type }

在我的Utilisateur FormType中,我添加:

 ->add('media', MediaType::class)

现在,我有错误:

Catchable Fatal Error: Argument 1 passed to AdminBundle\Form\MediaType::__construct() must be an instance of AdminBundle\Form\MediaService, none given, called in /var/www/erdf/app/cache/dev/appDevDebugProjectContainer.php on line 294 and defined

1 个答案:

答案 0 :(得分:0)

字段类型.bx-wrapper .bx-prev { left: 10px; background: url(images/controls.png) no-repeat 0 -32px; } .bx-wrapper .bx-next { right: 10px; background: url(images/controls.png) no-repeat -43px -32px; } 仅允许您从数据库中的现有实体中获取。在那里,您想要使用您定义的MediaType表单类型。为此:

1)将MediaType定义为服务。例如,使用YML:

"entity"

2)替换

    services:
        app.form.media:
            class: AdminBundle\Form\MediaType
            public: false
            tags:
                -  { name: form.type }

由:

->add('media','entity',  array('class'=>'AdminBundle:Media'))

这应该会好一些。现在,您可以通过表单主题自定义表单的显示(选中the documentation for defining custom FormTypes