如何在symfony2和doctrine mongodb中编辑带有文件上载的嵌入表单

时间:2014-03-12 10:21:24

标签: mongodb symfony doctrine-orm doctrine-odm

我有一份名为aboutMe的文件 它有另一个嵌入式文档,称为项目添加许多项目(原型) 项目具有项目的项目名称和图像。

我为aboutMe文档创建了一个formType,我在aboutMe表单中嵌入了项目表单,以便能够添加许多项目原型。

当用户没有更改旧项目图像时,问题是更新项目>图像。 doctrine用空图像更新旧的嵌入式项目文档。

如果用户没有上传新图片,我需要保留旧图片名称

/**
 * @MongoDB\Document
 * @MongoDB\HasLifecycleCallbacks
 */
class AboutMeIndex { 

    /**
     * @var integer
     * 
     * @MongoDB\Id(strategy="INCREMENT")
     */
    protected $id;

    /**
     * @var array
     * 
     * @MongoDB\EmbedMany(targetDocument="AboutMeProjects", strategy="set")
     */
    protected $projects = array(); 

    public function __construct()
    {
        $this->projects = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Remove project
     *
     * @param TimesSell\CoreBundle\Document\Profile\AboutMe\AboutMeProjects $project
     */
    public function removeProject(\TimesSell\CoreBundle\Document\Profile\AboutMe\AboutMeProjects $project)
    {
        $this->projects->removeElement($project);
    }

    /**
     * Get projects
     *
     * @return Doctrine\Common\Collections\Collection $projects
     */
    public function getProjects()
    {
        return $this->projects;
    }

    /**
     * Add certification
     *
     * @param TimesSell\CoreBundle\Document\Profile\AboutMe\AboutMeCertifications $certification
     */
    public function addCertification(\TimesSell\CoreBundle\Document\Profile\AboutMe\AboutMeCertifications $certification)
    {
        $this->certifications[] = $certification;
    }   


    //=================================================================================//       
    public function fileGetter($file){
        if(method_exists($this, 'get' . ucfirst($file))) { 
            return call_user_func(array($this, 'get' . ucfirst($file))); 
        } 
        else { 
            throw new \Exception("Couldn't Find Method name get" . ucfirst($file)); 
        } 
    }

    protected function getUploadRootDir($uploadDir)
    {
        return __DIR__.'/../../../../../../web/uploads/'.$this->getUploadDir($uploadDir);
    }

    protected function getUploadDir($uploadDir)
    {
        return $uploadDir;
    }


    public function uploadEmbeddedPhotos($file, $uploadDir)
    {
        if (null === $this->fileGetter($file)) {
            return;
        }

        foreach ($this->fileGetter($file) as $galleryPhoto){
            $pictureName = uniqid().'.'.$galleryPhoto->getImage()->guessExtension();

            $galleryPhoto->getImage()->move($this->getUploadRootDir($uploadDir),$pictureName);

            $this->path = $galleryPhoto->getImage()->getClientOriginalName();
            $galleryPhoto->setImage($pictureName);
        }
    } 

    public function deleteImage($image, $uploadDir){
        @unlink($this->getUploadRootDir($uploadDir).$image);
    }
    //=================================================================================//  




/**
 * @MongoDB\EmbeddedDocument
 * 
 */
class AboutMeProjects {

    /**
     * @var integer
     * 
     * @MongoDB\Id(strategy="INCREMENT")
     */
    protected $id;    

    /**
     * @var string
     * 
     * @MongoDB\String
     */
    protected $projectName;        

    /**
     * @var string
     *
     * @Assert\Image(
     *     maxSize = "20000k",
     *     mimeTypes = {"image/gif", "image/jpeg", "image/png"},
     *     mimeTypesMessage = "Please upload a valid picture"
     * )
     * @Assert\Regex(
     *     pattern="/[a-zA-Z0-9]+/",
     *     match=true,
     *     message="Special characters are not allowed"
     * )
     *
     * @MongoDB\String
     */     
    protected $image; 

    /**
     * @var string
     * 
     * @MongoDB\String
     */
    protected $desc; 

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

    /**
     * Set projectName
     *
     * @param string $projectName
     * @return self
     */
    public function setProjectName($projectName)
    {
        $this->projectName = $projectName;
        return $this;
    }

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

    /**
     * Set image
     *
     * @param string $image
     * @return self
     */
    public function setImage($image)
    {
        $this->image = $image;
        return $this;
    }

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

    /**
     * Set desc
     *
     * @param string $desc
     * @return self
     */
    public function setDesc($desc)
    {
        $this->desc = $desc;
        return $this;
    }

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




class AboutMeIndexType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstName')                   
            ->add('projects', 'collection', array(
                'type' => new ProjectsType(),
                'prototype' => true,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false,
                'required' => false
            ))               


        ;                
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AboutMeIndex'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'AbourMe';
    }  
}


class ProjectsType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder  
            ->add('projectName','text',array('attr'=> array('class'=>'form-control', 'placeholder' => 'Project name') ))             
            ->add('image','file',array('data_class' => null,'attr'=> array('class'=>'form-control col-lg-2 file-inputs') ))                
            ->add('desc','textarea',array('attr'=> array('class'=>'form-control', 'data-provide' => 'markdown', 'placeholder' => 'Description') ))                                
        ;                
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AboutMeProjects'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'ProjectsType';
    }  
}

这是我希望能够保留旧图像的控制器

/**
 * Edits an existing aboutMeIndex document.
 *
 * @Route("/profile/about-me/update", name="profile_about_me_update")
 * @Method("PUT")
 * @Template()
 */
public function updateAction(Request $request)
{
    $dm = $this->get('doctrine.odm.mongodb.document_manager');

    $user = $this->getUser();               

    $entity = $dm->getRepository('AboutMeIndex')->findOneBy(array('user.$id' => (int)$user->getId()));

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find entity Document.');
    }        


    $editForm = $this->createForm(new AboutMeIndexType(), $entity);
    $editForm->submit($request);      


    if ($editForm->isValid()) {

        if($entity->getProjects()->getImage() is newImage){
                $entity->uploadEmbeddedPhotos('projects', 'profile/aboutMe/');                                   
        }else{
             // Keep the old Image
        }

        $dm->persist($entity);           
        $dm->flush();

    }
 }

0 个答案:

没有答案